解决wordpress添加媒体按钮失效、可视化/文本无法切换

一个网站升级wordpress到最新版本后,发现点击“添加媒体”、“可视化/文本编辑模式切换”等功能按钮均失效没反应,查找资料发现wordpress为了提高效率以及加载速度,把要用到的js连接在一起,如果没有结合在一起就会导致那些依赖js的功能失效,而部分主机可能由于环境配置不标准或禁用了某些相关函数,导致这些js无法连接在一起,因此产生了按钮异常等情况。

js连接在一起的代码:

1
<script type='text/javascript' src='http://blog.860914.com/wp-admin/load-scripts.php?c=1&amp;load%5B%5D=hoverIntent,common,admin-bar,heartbeat,autosave,suggest,wp-ajax-response,jquery-color,wp-lists,jquery-ui-core,jquery-ui-widget,j&amp;load%5B%5D=query-ui-mouse,jquery-ui-sortable,postbox,tags-box,underscore,word-count,wp-a11y,post,editor-expand,thickbox,shortcode,backbone,&amp;load%5B%5D=wp-util,wp-backbone,media-models,wp-plupload,mediaelement,wp-mediaelement,media-views,media-editor,media-audiovideo,mce-view,img&amp;load%5B%5D=areaselect,image-edit,svg-painter,wp-auth-check,editor,quicktags,wplink,media-upload&amp;ver=4.4.2'></script>

wordpress官方解释:

1
2
3
4
Disable Javascript Concatenation

To result in a faster administration area, all Javascript files are concatenated into one URL. If Javascript is failing to work in your administration area, you can try disabling this feature:
define(‘CONCATENATE_SCRIPTS’, false);

解决方法:

在网站根目录的wp-config.php文件中,添加以下这句代码即可:

1
 define('CONCATENATE_SCRIPTS', false);

这句代码的作用是禁止js结合在一起。

Pods:WordPress 自定义内容类型 字段 分类法

pods 是一款用在 WordPress 上的自定义内容类型的插件,但是 pods 拥有的功能却完全不限于此。pods 能够扩展现有的内容类型,比如为用户资料 (user)增加一个 “电话” 字段。此外,它还有权限管理功能,类似于 “members” 插件。此外,还有高级自定义内容类型,改变“标题”这个字段名称。再此外,它还有内容关系的功能。

这篇文章我们除了介绍 pods 的使用方法以外,还会介绍内容类型的列表页,内容页的制作,pods字段的前台模板调用,增加内容类型到菜单等等。

扩展已有

WordPress 默认有三大内容类型:文章 (posts)、页面 (page)、媒体 (attachment),可能 “用户(user)” 也算一个内容类型,因为“用户”也可以扩展。默认的分类法有:分类目录 (category)、标签 (tag)。默认的内容类型和分类法在项目中字段经常不够用。

扩展文章字段

1、安装好 pods 后,点击 “pods管理 - 添加”,点击 “扩展已有”、选择 “内容类型 (文章、页面,等等) ”,下方选择 “文章”,点击 “下一步”。

29307031[1]
29345406[1]

2、点击 “添加字段”,比如添加一个 “文章来源” 的文本类型的字段,这里有几个选框。

代表的含义为:

标签:显示在发布时候的名称,可以为中文。
名称:内部使用,存在数据库里的名称,可用于模板调用,只能为字母、数字、下划线,不能以数字开头。
描述:发布时对字段的简要说明,选填。
字段类型:字段的类型,如,文本框、文本区域、文件等等。
选项:该字段是否为必填。
3、点击 “添加字段”,完成添加,点击 “Save Pod” 保存添加。

这个时候去发布文章看看,在下方就多了个文章来源字段了。快点去用同样的方法可以为页面、媒体、用户、评论添加自定义字段吧。

创建新的

创建新的内容类型

进入到 pods 的添加界面,选择 “创建新的”,接下来选择 “自定义内容类型”。
标签填写内容类型名称,可以为中文,比如填写个“电影”,点击下面的“高级”,在 pod name 填写内容类型的机读名称,点击 “下一步”,完成一个自定义内容类型的创建,你可以在左边栏找到 “电影” 这个内容类型。

为自定义内容类型添加字段。新创建的自定义内容类型,默认拥有 “文章” 这个内容类型的所有字段,比如标题、内容、日期等等,我们是在这些基础上添加新的需要的字段,比如现在添加一些字段:海报、地区、时长、年份等等。再去发布 “电影”,你会发现下方多了刚刚添加的这些字段。

创建好自定义内容类型后,你会发现还有很多标签页:“管理字段”、标签、管理界面、高级选项。

标签:在后台显示的标签,根据需要修改。
管理界面:管理内容类型在后台的显示,尝试把菜单位置改为更大的值试试看。
高级选项:对自定义内容类型的设置,请把 “拥有归档” 勾上。

创建自定义分类法

打开 pods 的添加界面,选择 “创建新的”,接下来选择 “自定义分类法”。
标签 填写分类法名称,可以中文,比如填写 “电影类型”,点击下面的 “高级”,在 pod name 填写分类法的机读名称,点击 “下一步”,完成一个自定义分类法的创建。
创建完成以后,有几个标签页,主要关注以下几个:

高级选项中,“层级”,表示该分类法是否有层级关系,打上勾相当于 “分类目录” 分类法,不打钩相当于“标签” 分类法,我建议打上勾。“相关内容类型”,为这个分类法应用到哪一个内容类型,比如我这里,勾上了“电影”。我在发布电影的时候,在右边栏就可以有电影类型选择了。
其他字段:这是为自定义分类法添加字段,这个按照需要开启,比如你想为电影类型中的科幻片分类添加一个略缩图字段等等。
创建自定义设置页面 — 制作主题选项

有没有觉得做主题的时候,为主题添加选项比较麻烦,pods有个超简单的方法,使用自定义设置页面轻松搞定。

打开 pods 的添加界面,选择 “创建新的”,接下来选择 “自定义设置页面”,标签填写页面名称,可以使用中文,比如填写 “主题选项”,菜单位置由自己选:在设置菜单、外观菜单下,新菜单,我这里选择添加到外观菜单。点击下面的 “高级”,在 pod name 填写自定义设置页面的机读名称,点击 “下一步”,这样就完成了一个自定义页面的创建。
创建完成以后,可以去添加一些字段,比如我添加了:网站 logo、网站标题、网站关键字、网站描述、统计代码、网站备案号字段,要注意字段类型。
接下来保存后看看你的左边栏对应的菜单位置吧。

好了,pods的基础功能就这么一些,这些功能网上很多插件都能实现,其实更重要的内容,还在于他的组件,pods 的组件给 pods 扩充了非常多的功能,这才是 pods真正的强大之处。

pods组件

高级自定义内容类型

进入 “pods 管理-组件”,启用 “Advance Content Type”。
这个时候,到 pods 的添加页面,多了一项 “高级内容类型”,选择它,这里我重新建立一个电影内容类型。点击 “下一步” 完成创建。
创建完成之后,会发现默认有了一些字段,这就是 WordPress 默认的字段,你可以修改或者删除它。
编辑好字段以后,再去看看其他标签页。下面主要介绍重要的设置:
“管理界面” 的 “管理界面样式”,可以自己写个 WordPress 管理后台页面。
“高级选项” 的 “标题字段”,如果修改了标题字段,或者想要改变标题字段,请在这里选择。
高级内容关系

进入“pods 管理-组件”,启用 “Advance Relationships”,这个时候在添加内容关系字段以后,你可以看到多了几行,这些高级的内容关系,可以创建更加复杂的内容关系。

内容类型对应的分类法调用

1
2
3
4
5
 <?php               
   $someField = get_post_meta( $id, 'dongtai', true );  
  $category_id=$someField['term_id'] ;
  echo get_category_link( $category_id );
?>

分类法对应内容类型调用

1
2
3
4
5
6
7
8
9
10
11
12
<?php while ( have_posts() ) : the_post(); ?>
  <?php  
             
   $pod = pods( 'category', get_the_id() );
   $related = $pod->field( 'xiaoqu' );
    print_r( $related );
    ?>

<?php endwhile; //分类对应内容调用 ?>
<?php
echo  $related['guid'];
?>

内容类型对应的分类法的内容调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php  

//get Pods object for current post
$pod = pods( 'xiaoqu', get_the_id() );
//get the value for the relationship field
$related = $pod->field( 'dongtai' );
//loop through related field, creating links to their own pages
//only if there is anything to loop through
if ( ! empty( $related ) ) {
    foreach ( $related as $rel ) {
        //get id for related post and put in ID
        //for advanced content types use $id = $rel[ 'id' ];
        $id = $rel[ 'ID' ];
        //show the related post name as link
        echo '<a href="'.get_permalink($id).'">'.get_the_title( $id ).'</a>';
        //get the value for some_field in related post and echo it
    } //end of foreach
} //endif ! empty ( $related )
     ?>

获取自定义分类id

1
2
3
4
5
6
<?php  

 $term_obj=get_term_by('slug',$term,'xiangcecat');
 echo $term_obj->term_id;
 
 ?>

分类对应分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php      
 
 $pod = pods( 'xiangcecat', $term_obj->term_id);
   $related = $pod->field( 'dongtai' );
   $category_id=$related[term_id];
   echo get_category_link( $category_id ); //或者


?>
//或者
 <?php  
  $pod = pods( 'xiaoqu', get_the_id() );
   $related = $pod->field( 'xiangce' );
   $term=$related['term_id'] ;
   $taxonomy=$related['taxonomy'] ;
 echo get_term_link(intval($term), $taxonomy);
 ?>

权限与角色管理

进入“pods 管理-组件”,启用 “Roles and Capabilities”,如果你用过 members 插件,你会发现这功能和 members 功能很相似,一样的强大。可以对所有的权限分角色的管理,可以添加、编辑、删除用户角色。

更多组件

pods 管理后台还有其他实用的组件,更多的组件功能,不一一介绍,看组件名字大概能清楚他的功能。pods 官方有提供其他组件,一些是单独的插件,一些是配合 pods工作的组件。

前端调用

模板命名

我发现,虽然很多人都会用自定义内容类型,但是内容类型的列表页不好做,即使做好,又该怎么放到菜单上显示出来,比如将 “电影” 列表页放在菜单中,自定义内容类型绑定了一个自定义分类法,又该怎么去显示分类法中某个分类下的文章,比如 “科幻片” 这个电影分类。

模板命名规则:

自定义内容类型 模板命名规则:archive-{post_type_name}.php 如 archive-movies.php
自定义分类法 模板命名规则:taxonomy-{taxonomy_name}.php 如 taxonomy-movie_type.php
自定义内容类型内容页 模板命名规则:single-{post_type_name}.php 如 single-movies.php
将内容类型加入到菜单,需要安装一个插件 “Custom Post Type's Archive in WP Nav Menu”,安装好之后,没有任何设置界面,进入到 “外观-菜单”,你可以发现菜单编辑区域的左边有了一个custom post type archives ,现在内容类型就在这里了,如果你发现内容类型不在这,那就请到 pods 的内容类型管理界面的高级选项中确认你的 “拥有存档” 这个选项已经打上勾了。

注:可能由于缓存问题,如果发现添加了内容类型到菜单后,前台点击内容类型的菜单出现404页面,请到 “设置-固定链接”,点击一下保存即可。

数据调用

后台配置好,其实最主要的,还是要能够显示出来才是最重要的,pods 的显示方法有三种:

短代码方式显示,短代码请参考 pods 短代码文档,配合 pods 官方提供的 magic tags。
利用 pods 的 “page” 和 “template” 组件,这两个组件可在 pods 组件中开启,请参考文章。
利用模板函数,即将重点介绍。
这里只介绍模板函数方式调用 pods 数据,因为这才是做主题开发时能使用的东西。

输出函数

Pods 显示数据函数

1
pods_field_display ( $pod,$post->ID,'$field' )

关于该函数的文档,请查看 pods 官方文档。

1
function pods_field_display ( $pod, $id = false, $name = null, $single = false )

参数 数据类型 备注
$pod (string) Pod name,即为 pods 机读名称
$id (mixed) (选填) 某篇文章ID或slug,以查询该篇文章数据
$name (string|array) 字段名称,或者关联数组的参数
$single (boolean) (选填) 是否以数组的形式返回
图像字段输出函数

pods_field_display() 不会真正的显示出一张图片,而是显示出图片的 URL,pods 特地为图片显示定义了一个函数:

1
pods_image ( $image, $size = 'thumbnail', $default = 0, $attributes = '', $force = false )

关于该函数文档,请查看官方文档。

1
function pods_image ( $image, $size = 'thumbnail', $default = 0, $attributes = '', $force = false )

参数 数据类型 备注
$image (array|int|string) 图片字段的数组,或ID,或guid
$size (string|array) 图片大小样式
$default (int) 如果图片不存在,则显示该图片$default
$attributes (string|array) 图片属性 (内部通过 wp_get_attachment_image获取)
$force (boolean) 强制规定大小
图片有单张图片和多张图片,如不清楚单张与多张,请到 pods 添加字段查看。如果字段是多张图片,那么会返回一个数组,所以,输出图像字段的代码为:

单张图片字段示例代码:

1
2
3
<?php
    echo pods_image( get_post_meta( $post->ID, $image_field_name, true ), ’original’ );
?>

多张图片字段:

1
2
3
4
5
6
7
<?php
    $images =get_post_meta( $post->ID, ’images’);
    foreach ( $images as $image )
    {
        echo pods_image( $image, ’original’ );
    }
?>

输出字段注意事项:

yes/no 字段:后台勾选 “是” 输出 1,不勾选输出空值。
Code 字段:可执行 php 脚本代码,输出 php 代码执行结果。
Website字段:本人无法输出该字段内容,请勿使用。
因为 pods 自定义字段也属于 WordPress 内部自定义字段,所以依然可以使用 WordPress 的 get_post_meta()输出,但是也并不是所有字段都能输出,经过测试,可直接使用 get_post_meta()函数输出的字段有:

Phone
Email
Password
Pptext
Date time
Pnumber
Currency
Color
对于其他字段,请使用 pods_field_display();

模板代码段示例

在主循环中

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php if(have_posts()) :while(have_posts()) : the_post(); ?>
<h1>
   
        <?php the_title(); ?>
   
</h1>
<!--标题-->
<div>
    <div>
        <span>年份:</span>
        <?php echo pods_field_display( 'movie',$post->ID,'time');//显示(年份)time字段 ?>
    </div>
    <div>
        <span>区域:</span>
        <?php echo pods_field_display( 'movie',$post->ID,'zone');//显示(区域)zone字段?>
    </div>
    <div>
        <span>时长:</span>
        <?php echo pods_field_display( 'movie',$post->ID,'how_long');//显示(时长)how_long字段 ?>
        <span>分钟</span>
    </div>
    <div>
        <span>海报:</span>
        <?php echo pods_image( get_post_meta( $post->ID, 'poster', true),'original'); //显示海报字段 ?>
    </div>
</div>
<!--显示自定义字段-->
<div>
    <?php the_excerpt(); ?>
</div>
<!-- 内容摘要 -->
<?php endwhile;endif; ?>
万能循环示例代码

<?php query_posts( 'showposts=5&post_type=movie');while(have_posts()) : the_post(); ?>
<h1>
   
        <?php the_title(); ?>
   
</h1>
<!--标题-->
<div>
    <div>
        <span>年份:</span>
        <?php echo pods_field_display( 'movie',$post->ID,'time');//显示(年份)time字段 ?>
    </div>
    <div>
        <span>区域:</span>
        <?php echo pods_field_display( 'movie',$post->ID,'zone');//显示(区域)zone字段?>
    </div>
    <div>
        <span>时长:</span>
        <?php echo pods_field_display( 'movie',$post->ID,'how_long');//显示(时长)how_long字段 ?>
        <span>分钟</span>
    </div>
    <div>
        <span>海报:</span>
        <?php echo pods_image( get_post_meta( $post->ID, 'poster', true),'original'); //显示海报字段 ?>
    </div>
</div>
<!--显示自定义字段-->
<div>
    <?php the_excerpt(); ?>
</div>
<!-- 内容摘要 -->
<?php endwhile;wp_reset_query(); ?>

自定义设置页面(调用主题选项数据)

请注意 $id 参数为 pods-settings-{slug_name},比如我的 pods name为 theme_option,那么 $id 的实参应该为 'pods-settings-theme_option'。

1
2
3
4
5
6
<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_logo'); ?>
<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_title'); ?>
<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_keyword'); ?>
<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_description'); ?>
<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_tongji'); ?>
<?php echo pods_field_display('theme_option','pods-settings-theme_option','site_beian'); ?>

附件:
pod-zh_cn_0 中文语言

Apache环境.htaccess伪静态301跳转(www与不带www)

如果我们的网站,比如wordpress根目录有htaccess文件之后,我们只需要在文件内添加下面的代码,就可以实现www与不带www之间的跳转,合理的传递权重。
第一,带www的跳转至不带www域名

1
2
3
RewriteEngine On
RewriteCond %{HTTP_HOST} !^860914.com$ [NC]
RewriteRule ^(.*)$ http://860914.com/$1 [L,R=301]

第二,不带www的跳转至www域名

1
2
3
RewriteEngine On
RewriteCond %{HTTP_HOST} ^860914.com [NC]
RewriteRule ^(.*)$ http://www.860914.com/$1 [L,R=301]

一般就是用到上述的2个方法,记不住没关系,跟老左一样记录下来,下次要用直接复制过去使用。
新增加如果网站搬家,老域名全部301跳转到新站点:

1
2
RewriteEngine on
RewriteRule ^(.*)$ http://www.860914.com/$1 [R=301,L]

WordPress去掉分类目录category路径

首先伪静态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*  
*WordPress去除category
*/

add_action( 'load-themes.php',  'no_category_base_refresh_rules');  
add_action('created_category', 'no_category_base_refresh_rules');  
add_action('edited_category', 'no_category_base_refresh_rules');  
add_action('delete_category', 'no_category_base_refresh_rules');  
function no_category_base_refresh_rules() {      
    global $wp_rewrite;  
    $wp_rewrite -> flush_rules();  
}  
 
// register_deactivation_hook(__FILE__, 'no_category_base_deactivate');  
// function no_category_base_deactivate() {  
//  remove_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');  
//  // We don't want to insert our custom rules again  
//  no_category_base_refresh_rules();  
// }  
 
// Remove category base  
add_action('init', 'no_category_base_permastruct');  
function no_category_base_permastruct() {  
    global $wp_rewrite, $wp_version;  
    if (version_compare($wp_version, '3.4', '< ')) {  
        // For pre-3.4 support  
        $wp_rewrite -> extra_permastructs['category'][0] = '%category%';  
    } else {  
        $wp_rewrite -> extra_permastructs['category']['struct'] = '%category%';  
    }  
}  
 
// Add our custom category rewrite rules  
add_filter('category_rewrite_rules', 'no_category_base_rewrite_rules');  
function no_category_base_rewrite_rules($category_rewrite) {  
    //var_dump($category_rewrite); // For Debugging  
 
    $category_rewrite = array();  
    $categories = get_categories(array('hide_empty' => false));  
    foreach ($categories as $category) {  
        $category_nicename = $category -> slug;  
        if ($category -> parent == $category -> cat_ID)// recursive recursion  
            $category -> parent = 0;  
        elseif ($category -> parent != 0)  
            $category_nicename = get_category_parents($category -> parent, false, '/', true) . $category_nicename;  
        $category_rewrite['(' . $category_nicename . ')/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$'] = 'index.php?category_name=$matches[1]&feed=$matches[2]';  
        $category_rewrite['(' . $category_nicename . ')/page/?([0-9]{1,})/?$'] = 'index.php?category_name=$matches[1]&paged=$matches[2]';  
        $category_rewrite['(' . $category_nicename . ')/?$'] = 'index.php?category_name=$matches[1]';  
    }  
    // Redirect support from Old Category Base  
    global $wp_rewrite;  
    $old_category_base = get_option('category_base') ? get_option('category_base') : 'category';  
    $old_category_base = trim($old_category_base, '/');  
    $category_rewrite[$old_category_base . '/(.*)$'] = 'index.php?category_redirect=$matches[1]';  
 
    //var_dump($category_rewrite); // For Debugging  
    return $category_rewrite;  
}  
 
 
// Add 'category_redirect' query variable  
add_filter('query_vars', 'no_category_base_query_vars');  
function no_category_base_query_vars($public_query_vars) {  
    $public_query_vars[] = 'category_redirect';  
    return $public_query_vars;  
}  
 
// Redirect if 'category_redirect' is set  
add_filter('request', 'no_category_base_request');  
function no_category_base_request($query_vars) {  
    //print_r($query_vars); // For Debugging  
    if (isset($query_vars['category_redirect'])) {  
        $catlink = trailingslashit(get_option('home')) . user_trailingslashit($query_vars['category_redirect'], 'category');  
        status_header(301);  
        header("Location: $catlink");  
        exit();  
    }  
    return $query_vars;  
}

WooCommerce实用代码集合

本文整理了一些适用于WooCommerce的短代码,方便查阅和使用,更是为了理清思路,提高自己。以下WooCommerce简称WC,代码放在主题的functions.php中即可。

最后更新于: 2014-06-25

WooCommrce官方代码集»

在主题中声明对WooCommerce的支持

1
2
3
4
add_action( 'after_setup_theme', 'woocommerce_support' );
function woocommerce_support() {
    add_theme_support( 'woocommerce' );
}

禁用WooCommerce默认样式

1
2
// Disable WooCommerce styles
add_filter( 'woocommerce_enqueue_styles', '__return_false' );

官方文档链接

禁用默认样式,就要引入自己的样式,可以直接写在style.css中,也可以另外写一个样式表

1
2
3
4
5
6
7
function wp_enqueue_woocommerce_style(){
    wp_register_style( 'woocommerce', get_template_directory_uri() . '/css/woocommerce.css' );
    if ( class_exists( 'woocommerce' ) ) {
        wp_enqueue_style( 'woocommerce' );
    }
}
add_action( 'wp_enqueue_scripts', 'wp_enqueue_woocommerce_style' );

如果样式表中用到了WooCommerce默认的图片,还应将woocommerce/assets/images文件夹下的图片拷贝到主题目录。

WC面包屑导航
修改面包屑导航位置

首先删除默认的面包屑导航

1
remove_action( 'woocommerce_before_main_content', 'woocommerce_breadcrumb', 20, 0);

将导航添加到其它位置,例如放在header.php中,则直接在header.php适当位置插入如下代码

1
if( function_exists( 'woocommerce_breadcrumb') ) woocommerce_breadcrumb();

也可以用add_action添加,例如

1
add_action( 'woocommerce_after_main_content', 'woocommerce_breadcrumb' );

不知道有哪些hooks可用?那么了解一下WC内建的Actions和Filters »

修改面包屑导航的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
// Code source: https://gist.github.com/dwiash/4064836
function my_woocommerce_breadcrumbs() {
    return array(
            'delimiter'   => ' &#47; ',
            'wrap_before' => '<nav class="woocommerce-breadcrumb" itemprop="breadcrumb">',
            'wrap_after'  => '</nav>',
            'before'      => '',
            'after'       => '',
            'home'        => _x( 'Home', 'breadcrumb', 'woocommerce' ),
        );
}
 
add_filter( 'woocommerce_breadcrumb_defaults', 'my_woocommerce_breadcrumbs' );

参数注释:

delimiter:分隔符
wrap_before:起始标签
wrap_after:结束标签
before:起始标签之后、面包屑导航链接之前的内容
after:面包屑导航链接之后、结束标签之前的内容
home:首页文字,例如像给首页加font-awesome,可以这样设置

1
'home' => _x( '<i class="icon-home"></i> Home', 'breadcrumb', 'woocommerce' ),

修改首页和分类页面每页产品数量
每页显示多少产品默认跟随设置 » 阅读设置 » 博客页面至多显示的值,若要产品索引页和博文索引页使用不同的设置,可以使用下面的代码为产品索引页单独设置每页产品数。

1
add_filter( 'loop_shop_per_page', create_function( '$cols', 'return 24;' ), 20 );

代码注释:每页显示24个产品。

修改分页导航的参数

1
2
3
4
5
6
7
8
9
// Change args of wc pagination
add_filter( 'woocommerce_pagination_args', 'theme_wc_pagination_args' );
function theme_wc_pagination_args( $args ){
    $args['prev_text'] = '&laquo; Previous page';
    $args['next_text'] = 'Next page &raquo;';
    $args['end_size'] = 3;
    $args['mid_size'] = 3;
    return $args;
}

参数注释:

prev_text: 向前翻页按钮的文字
next_text: 向后翻页按钮的文字
end_size:页面分头部、中间、后、尾部三部分显示,中间用省略号分隔,这个参数控制头部和尾部显示多少页
mid_size: 控制中间显示多少页

修改首页和分类页每行产品数量
注意,WC每行产品数量是靠给每行第一个产品元素添加.first class、每行最后一个添加.last class实现的,所以这段代码只能决定在哪里强制换行,与宽度无关。也就是说如果你设置一行显示4个产品,你不能期待每个li的宽度就是1/4,这个宽度是样式表设定的,如果样式表设定的宽度只够一行放下3个,而代码设定一行显示4个,那就会出现每行个数不等的情况。

1
2
3
4
5
6
7
/* Change the number of products per column */
add_filter('loop_shop_columns', 'loop_columns');
if (!function_exists('loop_columns')) {
    function loop_columns() {
        return 5;
    }
}

给列表页每个产品添加产品描述

1
2
3
4
5
6
// Add product description
function theme_wc_single_excerpt(){
    global $post;
    echo '<div class="product-description">' . apply_filters( 'woocommerce_short_description', $post->post_excerpt ) . '</div>';
}
add_action( 'woocommerce_after_shop_loop_item_title', 'theme_wc_single_excerpt' );

隐藏相关产品列表
默认产品页面底部有相关产品一栏,要去掉这个栏目,使用下面的代码。

1
2
3
4
function wc_remove_related_products( $args ) {
    return array();
}
add_filter('woocommerce_related_products_args','wc_remove_related_products', 10);

修改相关产品列表每行产品数量
用filter: woocommerce_output_related_products_args改变相关产品数量,同样只是改变换行的位置,需要配合适当的css设定宽度才能实现最终效果。

1
2
3
4
5
6
7
8
9
add_filter( 'woocommerce_output_related_products_args', 'wc_custom_related_products_args' );
function wc_custom_related_products_args( $args ){
    $args = array(
        'posts_per_page' => 2, //共显示多少产品
        'columns' => 2, //分几栏显示
        'orderby' => 'rand'
    );
    return $args;
}

代码注释:在每个产品页面展示最多10个相关产品,每行显示3个。

修改产品缩略图每行数量
和首页产品每行数量类似,是通过添加.first和.last class实现,要真正达到自己想要的效果,还要添加适当的样式。

1
2
3
4
add_filter ( 'woocommerce_product_thumbnails_columns', 'woo_thumb_cols' );
function woo_thumb_cols() {
    return 4; // .last class applied to every 4th thumbnail
}

修改“Add to Cart”按钮的文字

1
2
3
4
function woo_custom_cart_button_text() {
    return __('My Button Text', 'woocommerce');
}
add_filter('woocommerce_product_single_add_to_cart_text', 'woo_custom_cart_button_text');

这段代码在实现Catalog Mode中十分有用。

修改货币符号

1
2
3
4
5
6
7
function change_existing_currency_symbol( $currency_symbol, $currency ) {
    switch( $currency ) {
        case 'AUD': $currency_symbol = 'AUD$'; break;
    }
    return $currency_symbol;
}
add_filter('woocommerce_currency_symbol', 'change_existing_currency_symbol', 10, 2);

代码注释:将澳元的货币符号从默认的$改为AUD$。

添加自定义排序选项
下面的代码演示如何添加一个随机排序(Random)选项,添加其它选项方法类似。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function custom_woocommerce_get_catalog_ordering_args( $args ) {
    $orderby_value = isset( $_GET['orderby'] ) ? woocommerce_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
    if ( 'random_list' == $orderby_value ) {
        $args['orderby'] = 'rand';
        $args['order'] = '';
        $args['meta_key'] = '';
    }  
    return $args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args' );
 
function custom_woocommerce_catalog_orderby( $sortby ) {
    $sortby['random_list'] = __('Sort by random order');
    return $sortby;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby' );
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby' );

为订单添加附加费用/手续费
以下代码演示收取每单商品费用加运费总和的1%作为附加费用。

1
2
3
4
5
6
7
8
9
10
11
12
add_action( 'woocommerce_cart_calculate_fees','woocommerce_custom_surcharge' );
function woocommerce_custom_surcharge() {
    global $woocommerce;
 
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
 
    $percentage = 0.01;
    $surcharge = ( $woocommerce->cart->cart_contents_total + $woocommerce->cart->shipping_total ) * $percentage;
    $woocommerce->cart->add_fee( 'Surcharge', $surcharge, false, '' );
     
}

付款成功后立刻发送invoice
代码来自:azhowto.com

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * send invoice straight away if payment is successful
 * @param  string $order_id valid payment order id
 * @return null
 */

function send_invoice_upon_payment_successful($order_id) {
  global $woocommerce;
  $order = new WC_Order($order_id);
  $mailer = $woocommerce->mailer();
  $mailer->customer_invoice( $order );
}
add_action('woocommerce_payment_complete', 'send_invoice_upon_payment_successful');

产品列表页:加入购物车按钮移动到标题之前

1
2
remove_action( 'woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10 );
add_action( 'woocommerce_before_shop_loop_item_title', 'woocommerce_template_loop_add_to_cart', 10 );

产品列表页:添加链接
下面的代码演示如何在标题之前添加链接。

1
2
3
4
5
6
7
add_action( 'woocommerce_before_shop_loop_item_title', 'wc_template_loop_additional_links', 10 );
function wc_template_loop_additional_links(){
    ?>
    <a href="#" class="button1-link button product_type_simple">Button 1 </a>
    <a href="#" class="button2-link button product_type_simple">Button 2 </a>
    <?php
}

修改产品列表页按钮文字
产品列表页的按钮文字一般是:add to cart、select options, view options和read more。下面代码演示如何更改这些按钮文字,使用代码时,只选择需要的即可,比如要修改view options,只需add_filter( 'grouped_add_to_cart_text', 'wc_add_to_cart_text' ),其它的删掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
add_filter( 'woocommerce_product_add_to_cart_text' , 'custom_woocommerce_product_add_to_cart_text' );
 
/**
 * custom_woocommerce_template_loop_add_to_cart
*/

function custom_woocommerce_product_add_to_cart_text() {
    global $product;
     
    $product_type = $product->product_type;
     
    switch ( $product_type ) {
        case 'external':
            return __( 'Buy product', 'woocommerce' );
        break;
        case 'grouped':
            return __( 'View products', 'woocommerce' );
        break;
        case 'simple':
            return __( 'Add to cart', 'woocommerce' );
        break;
        case 'variable':
            return __( 'Select options', 'woocommerce' );
        break;
        default:
            return __( 'Read more', 'woocommerce' );
    }
     
}

无论产品是否有属性,添加到购物车的按钮名称都是Purchase.

官方代码链接

去掉产品页reviews选项卡

1
2
3
4
5
add_filter( 'woocommerce_product_tabs', 'wc_remove_reviews_tab' );
function wc_remove_reviews_tab( $tabs ){  
    unset($tabs['reviews']);
    return $tabs;
}

产品页添加自定义选项卡
添加一个features选项卡,内容可以用custom field来写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//Add custom tab
add_filter( 'woocommerce_product_tabs', 'wc_add_features_tab' );
function wc_add_features_tab( $tabs ){    
    global $product;
    $content = get_post_meta( $product->id, 'product_features', true );
    if( !empty($content) ) {
        $tabs[ 'features' ] = array(
            'title'    => 'Features',
            'priority' => 1,
            'callback' => 'wc_features_tabs_panel_content',
            'content'  => $content,  // custom field
        );
    }
    return $tabs;
}
function wc_features_tabs_panel_content( $key, $tab ){
    echo  '<h2>' . $tab['title'] . '</h2>';
    echo $tab['content'];
}

修改Shop base页面的浏览器标题

1
2
3
4
5
6
7
8
9
10
// Change the browser title of shop base page
add_filter('post_type_archive_title', 'theme_wc_shop_browser_title' );
function theme_wc_shop_browser_title( $title ){
    if( $title == __('Products', 'woocommerce')){
        $shop_page_id = woocommerce_get_page_id( 'shop' );
        $page_title   = get_the_title( $shop_page_id );
        return $page_title;
    }
    return $title;
}

商店页面默认的浏览器标题(Browser Title)是Products,这个页面其实是一个custom post type archive页面,虽然内容区域的标题跟随该页面的标题,但浏览器标题却是WordPress默认的,Products是一个custom post type,所以它的archive页面标题就是它的label名称。

上面这段代码可以让页面的标题成为browser title。

用户访问时将产品自动添加到购物车

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// add item to cart on visit
add_action( 'init', 'add_product_to_cart' );
function add_product_to_cart() {
    if (!is_admin()) {
        global $woocommerce;
        $product_id = 64;
        $found = false;
        //check if product already in cart
        if (sizeof($woocommerce->cart->get_cart()) > 0) {
            foreach ($woocommerce->cart->get_cart() as $cart_item_key => $values) {
                $_product = $values['data'];
                if ($_product->id == $product_id)
                    $found = true;
            }
        // if product not found, add it
            if (!$found)
                $woocommerce->cart->add_to_cart($product_id);
        } else {
        // if no products in cart, add it
            $woocommerce->cart->add_to_cart($product_id);
        }
    }
}

虚拟产品:付款成功后订单状态立即变为complete
代码来自:http://www.skyverge.com/product/woocommerce-order-status-control/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
add_filter( 'woocommerce_payment_complete_order_status', 'virtual_order_payment_complete_order_status', 10, 2 );
 
function virtual_order_payment_complete_order_status( $order_status, $order_id ) {
  $order = new WC_Order( $order_id );
 
  if ( 'processing' == $order_status &&
       ( 'on-hold' == $order->status || 'pending' == $order->status || 'failed' == $order->status ) ) {
 
    $virtual_order = null;
 
    if ( count( $order->get_items() ) > 0 ) {
 
      foreach( $order->get_items() as $item ) {
 
        if ( 'line_item' == $item['type'] ) {
 
          $_product = $order->get_product_from_item( $item );
 
          if ( ! $_product->is_virtual() ) {
            // once we've found one non-virtual product we know we're done, break out of the loop
            $virtual_order = false;
            break;
          } else {
            $virtual_order = true;
          }
        }
      }
    }
 
    // virtual order, mark as completed
    if ( $virtual_order ) {
      return 'completed';
    }
  }
 
  // non-virtual order, return original status
  return $order_status;
}

WooCommerce: 产品加入购物车后直接结账

方法一
WooCommerce中,非Ajax情况下,点击加入购物车按钮后跳转到何处可以通过filter:add_to_cart_redirect修改,下面代码可以实现产品加入购物车后直接结账的功能,跳过购物车页面。
如果你希望Shop首页或分类页中的加入购物车按钮也具备这种效果,不要勾选Enable AJAX add to cart buttons on archives功能。否则该代码只在单个产品页面有效。
代码放在主题的funcitons.php中即可。

1
2
3
4
5
6
7
add_filter ('add_to_cart_redirect', 'redirect_to_checkout');
 
function redirect_to_checkout() {
    global $woocommerce;
    $checkout_url = $woocommerce->cart->get_checkout_url();
    return $checkout_url;
}

方法二
加入购物,直接购买两种方法
1、首先我们先将“加入购物车”的跳转链接复制替换“直接商品”的按钮上然后设一个bool值为1 。

1
<a href="javascript:bool =1;">

2、然后打开增加一段js ,在这个脚本的第一行代码之上加一个全局变量

1
var bool =0;

查找点击购物车之后的那条链接即:

1
/cart

找到这个(在第88行 那块)之后,在下面加这句话

1
(bool == 1) && (cart_url = '/cat');

意思是 当

1
bool = 1

条件满足时 则cart_url链接到 '/cat' 直接购买的页面
这样就实现了“立刻购买”与“添加到购物车”并存的方法

WordPress 模板制作笔记(内容)

1.网站标题 关键词 描述
tag作为关键词

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
 <?php
$description = '';
$keywords = '';

if (is_home()) {
   // 将以下引号中的内容改成你的主页description
   $description = "  ";

   // 将以下引号中的内容改成你的主页keywords
   $keywords = " u";
}
elseif (is_page()) {
   $description1 = get_post_meta($post->ID, "description", true);
   $description2 = str_replace("\n","",mb_strimwidth(strip_tags($post->post_content), 0, 200, "", 'utf-8'));

   // 填写自定义字段description时显示自定义字段的内容,否则使用文章内容前200字作为描述
   $description = $description1 ? $description1 : $description2;
   
   // 填写自定义字段keywords时显示自定义字段的内容,否则使用文章tags作为关键词
    $keywords = single_post_title('', false);
   
}
elseif (is_single()) {
   $description1 = get_post_meta($post->ID, "description", true);
   $description2 = str_replace("\n","",mb_strimwidth(strip_tags($post->post_content), 0, 200, "", 'utf-8'));

   // 填写自定义字段description时显示自定义字段的内容,否则使用文章内容前200字作为描述
   $description = $description1 ? $description1 : $description2;
   
   // 填写自定义字段keywords时显示自定义字段的内容,否则使用文章tags作为关键词
   $keywords = get_post_meta($post->ID, "keywords", true);
   if($keywords == '') {
      $tags = wp_get_post_tags($post->ID);    
      foreach ($tags as $tag ) {        
         $keywords = $keywords . $tag->name . ", ";    
      }
      $keywords = rtrim($keywords, ', ');
   }
}
elseif (is_category()) {
   // 分类的description可以到后台 - 文章 -分类目录,修改分类的描述
   $description = category_description();
   $keywords = single_cat_title('', false);
}
elseif (is_tag()){
   // 标签的description可以到后台 - 文章 - 标签,修改标签的描述
   $description = tag_description();
   $keywords = single_tag_title('', false);
}
$description = trim(strip_tags($description));
$keywords = trim(strip_tags($keywords));
?>
<meta name="keywords" content="<?php echo $keywords; ?/>" />
<meta name="
description" content="<?php echo $description; ?/>" />

2.当前位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<a href="<?php bloginfo('url'); ?>"><?php bloginfo('name'); ?></a>     &raquo;  
    <?php  
        if( is_single() ){  
            $categorys = get_the_category();  
            $category = $categorys[0];  
            echo( get_category_parents($category->term_id,true, '&raquo; ') );  
            the_title();  
        } elseif ( is_page() ){  
            the_title();  
        } elseif ( is_category() ){  
            single_cat_title();  
        } elseif ( is_tag() ){  
            single_tag_title();  
        } elseif ( is_day() ){  
            the_time('Y年Fj日');  
        } elseif ( is_month() ){  
            the_time('Y年F');  
        } elseif ( is_year() ){  
            the_time('Y年');  
        } elseif ( is_search() ){  
            echo $s.' 的搜索结果';  
        }  
?>

标题:

1
<?php the_title_attribute(); ?>

作者:

1
<?php the_author_posts_link(); ?>

来源:
当前栏目:
< ?php the_category( ‘, ‘ ) ?>
或者
显示第一个分类名称同时并有该分类链接。

1
2
3
4
5
6
<?php
$category = get_the_category();
if($category[0]){
echo<a href=“‘.get_category_link($category[0]->term_id ).'”>’.$category[0]->cat_name.'';
}
?>

当前栏目不带连接:

1
<?php foreach((get_the_category()) as $cat){echo $cat->cat_name;}?>

只显示第一个类别的名称:

1
2
3
4
<?php
$category = get_the_category();
echo $category[0]->cat_name;
?>

当前栏目连接:

1
2
3
4
5
6
 <?php
$category = get_the_category();
if($category[0]){
echo get_category_link($category[0]->term_id );
}
 ?>

评论次数:

1
<?php comments_number('暂无评论', '1条评论', '% 评论' );?>

时间:

1
<?php the_time('Y年n月j日  G:h') ?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//在24小时以内发布的显示为几分钟前或几小时前
function timeago() {
 global $post;
 $date = $post->post_date;
 $time = get_post_time('G', true, $post);
 $time_diff = time() - $time;
 if ( $time_diff > 0 && $time_diff < 24*60*60 )
 $display = sprintf( __('%s 前'), human_time_diff( $time ) );
 else
 $display = date(get_option('date_format'), strtotime($date) );
 
 return $display;
}
add_filter('the_time', 'timeago');

简介:

1
<?php the_excerpt("Read More..."); ?>

文章内容:

1
2
3
4
5
6
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
   <?php the_content("Read More..."); ?>
<?php endwhile; ?>
<?php else : ?>
<?php endif; ?>

Tag标签:

1
<?php the_tags(''); ?>

相关文章:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$post_tags = wp_get_post_tags($post->ID);
if ($post_tags) {
foreach ($post_tags as $tag)
{
    // 获取标签列表
    $tag_list[] .= $tag->term_id;
}
// 随机获取标签列表中的一个标签
$post_tag = $tag_list[ mt_rand(0, count($tag_list) - 1) ];
// 该方法使用 query_posts() 函数来调用相关文章,以下是参数列表
$args = array(
        'tag__in' => array($post_tag),
        'category__not_in' => array(NULL),      // 不包括的分类ID
        'post__not_in' => array($post->ID),
        'showposts' => 6,               // 显示相关文章数量
        'caller_get_posts' => 1
    );
query_posts($args);
if (have_posts()) :
    while (have_posts()) : the_post(); update_post_caches($posts); ?>
<li>* <a href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; else : ?>
    <li>* 暂无相关文章</li>
<?php endif; wp_reset_query(); } ?>

上一篇:

1
<?php previous_post_link('&nbsp&nbsp;上一篇: %link'); ?>

或者:

1
2
3
4
5
<?php
$prev_post = get_previous_post(TRUE);
if(!empty($prev_post)):?>
<a title="<?php echo $prev_post->post_title;?>" href="<?php echo get_permalink($prev_post->ID);?>">上一篇</a>
<?php endif;?>

下一篇:

1
<?php next_post_link('&nbsp&nbsp;下一篇: %link'); ?>

或者

1
2
3
4
5
<?php
$next_post = get_next_post(TRUE);
if(!empty($next_post)):?>
<a title="<?php echo $next_post->post_title;?>" href="<?php echo get_permalink($next_post->ID);?>">下一篇</a>
<?php endif;?>

评论:
在single.php中调用< ?php endwhile; ?>和< ?php else : ?>中间让入

1
<?php comments_template(); ?>

阅读次数:
首先将下面代码加到主题functions模版文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function getPostViews($postID){  
    $count_key = 'post_views_count';  
    $count = get_post_meta($postID, $count_key, true);  
    if($count==''){  
        delete_post_meta($postID, $count_key);  
        add_post_meta($postID, $count_key, '0');  
        return "0 View";  
    }  
    return $count.' Views';  
}  
function setPostViews($postID) {  
    $count_key = 'post_views_count';  
    $count = get_post_meta($postID, $count_key, true);  
    if($count==''){  
        $count = 0;  
        delete_post_meta($postID, $count_key);  
        add_post_meta($postID, $count_key, '0');  
    }else{  
        $count++;  
        update_post_meta($postID, $count_key, $count);  
    }  
}

接下来将下面代码加到主题single模版主循环的中:

1
<?php setPostViews(get_the_ID()); ?>

也就是类似这句的下面

1
<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

三、最后,将调用显示阅读次数代码加到single模版适当的位置:

1
<?php echo getPostViews(get_the_ID()); ?>

如果想在其它位置显示阅读次数,可以将下面代码也加到functions模版中:

1
remove_action('wp_head''adjacent_posts_rel_link_wp_head'100;

按照点击量排列内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$args = array(   
  ‘meta_query’ => array(   
    array(   
      ‘key’ => ‘post_views_count’   
    )   
   ),   
  ‘orderby’ => ‘meta_value’,   
  ‘order’=>’DESC’   
);   
  
/*或者  
$args = array(  
  ‘meta_query’ => array(  
    array(  
      ‘key’ => ‘post_views_count’,  
      ‘type’=>’NUMERIC’  
    )  
   ),  
  ‘orderby’ => ‘meta_value_num’,  
  ‘order’=>’DESC’  
);  
*/
  
query_posts($args);

评论地区:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
 * 模板放QQWry.Dat
 * @param string $ip
 * @return string|mixed
 */

 function convertip($ip) {  
    $dat_path = TEMPLATEPATH.'/QQWry.Dat';  
    if(!$fd = @fopen($dat_path, 'rb')){  
        return '未知地区用户!';  
    }  
    $ip = explode('.', $ip);  
    $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];  
    $DataBegin = fread($fd, 4);  
    $DataEnd = fread($fd, 4);  
    $ipbegin = implode('', unpack('L', $DataBegin));  
    if($ipbegin < 0) $ipbegin += pow(2, 32);  
    $ipend = implode('', unpack('L', $DataEnd));  
    if($ipend < 0) $ipend += pow(2, 32);  
    $ipAllNum = ($ipend - $ipbegin) / 7 + 1;  
    $BeginNum = 0;  
    $EndNum = $ipAllNum;  
    while($ip1num>$ipNum || $ip2num< $ipNum) {  
        $Middle= intval(($EndNum + $BeginNum) / 2);  
        fseek($fd, $ipbegin + 7 * $Middle);  
        $ipData1 = fread($fd, 4);  
        if(strlen($ipData1) < 4) {  
            fclose($fd);  
            return '系统出错!';  
        }  
        $ip1num = implode('', unpack('L', $ipData1));  
        if($ip1num < 0) $ip1num += pow(2, 32);  
        if($ip1num > $ipNum) {  
            $EndNum = $Middle;  
            continue;  
        }  
        $DataSeek = fread($fd, 3);  
        if(strlen($DataSeek) < 3) {  
            fclose($fd);  
            return '系统出错!';  
        }  
        $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));  
        fseek($fd, $DataSeek);  
        $ipData2 = fread($fd, 4);  
        if(strlen($ipData2) < 4) {  
            fclose($fd);  
            return '系统出错!';  
        }  
        $ip2num = implode('', unpack('L', $ipData2));  
        if($ip2num < 0) $ip2num += pow(2, 32);  
        if($ip2num < $ipNum) {  
            if($Middle == $BeginNum) {  
                fclose($fd);  
                return '未知';  
            }  
            $BeginNum = $Middle;  
        }  
    }  
    $ipFlag = fread($fd, 1);  
    if($ipFlag == chr(1)) {  
        $ipSeek = fread($fd, 3);  
        if(strlen($ipSeek) < 3) {  
            fclose($fd);  
            return '系统出错!';  
        }  
        $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));  
        fseek($fd, $ipSeek);  
        $ipFlag = fread($fd, 1);  
    }  
    if($ipFlag == chr(2)) {  
        $AddrSeek = fread($fd, 3);  
        if(strlen($AddrSeek) < 3) {  
            fclose($fd);  
            return '系统出错!';  
        }  
        $ipFlag = fread($fd, 1);  
        if($ipFlag == chr(2)) {  
            $AddrSeek2 = fread($fd, 3);  
            if(strlen($AddrSeek2) < 3) {  
                fclose($fd);  
                return '系统出错!';  
            }  
            $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));  
            fseek($fd, $AddrSeek2);  
        } else {  
            fseek($fd, -1, SEEK_CUR);  
        }  
        while(($char = fread($fd, 1)) != chr(0))  
        $ipAddr2 .= $char;  
        $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));  
        fseek($fd, $AddrSeek);  
        while(($char = fread($fd, 1)) != chr(0))  
        $ipAddr1 .= $char;  
    } else {  
        fseek($fd, -1, SEEK_CUR);  
        while(($char = fread($fd, 1)) != chr(0))  
        $ipAddr1 .= $char;  
 
        $ipFlag = fread($fd, 1);  
        if($ipFlag == chr(2)) {  
            $AddrSeek2 = fread($fd, 3);  
            if(strlen($AddrSeek2) < 3) {  
                fclose($fd);  
                return '系统出错!';  
            }  
            $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));  
            fseek($fd, $AddrSeek2);  
        } else {  
            fseek($fd, -1, SEEK_CUR);  
        }  
        while(($char = fread($fd, 1)) != chr(0)){  
            $ipAddr2 .= $char;  
        }  
    }  
    fclose($fd);  
    if(preg_match('/http/i', $ipAddr2)) {  
        $ipAddr2 = '';  
    }  
    $ipaddr = "$ipAddr1 $ipAddr2";  
    $ipaddr = preg_replace('/CZ88.Net/is', '', $ipaddr);  
    $ipaddr = preg_replace('/^s*/is', '', $ipaddr);  
    $ipaddr = preg_replace('/s*$/is', '', $ipaddr);  
    if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {  
        $ipaddr = '未知';  
    }  
    $ipaddr = iconv('gbk', 'utf-8//IGNORE', $ipaddr);    
    if( $ipaddr != '  ' )  
        return $ipaddr;  
    else  
        $ipaddr = '评论者来自火星,无法或者其所在地!';  
        return $ipaddr;  
}

调用

1
<?php if ( is_user_logged_in() ) echo convertip(get_comment_author_ip()); ?>

WordPress内容添加自定义字段

通常在添加自定义字段和其值的时候,我们都是手动去"自定义字段"模块下拉框中去选择相应的字段,然后再输入其值,最后还要提交等待一小段时间,似乎有点麻烦。那么可不可以给这些常用的自定义字段创建一个单独的面板,直接在里面填内容就可以了呢?就像文章标签,直接添加标签即可,不需要单独提交。答案是可以的,下面是效果图:
add-panel
下面我将教你如何操作,以下所有代码放到当前主题的functions.php中即可

一、创建需要的字段信息

这里将以添加两个自定义字段,名称分别为 _description_value 和 _keywords_value,你可以给下面数组添加多个元素,实现添加多个自定义字段的目的。

数组第一个元素name为自定义字段的名称,在本代码中自定义字段的名称为name值加_value,以防止与其他代码发生冲突,如 _description_value;std为自定义字段的默认值,当你发表文章时该自定义字段没填任何值,那么将取默认值;title为自定义字段模块的标题,如文章编辑页的"摘要"、"分类"和"标签",这些都是模块名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
//创建需要的字段信息
$new_meta_boxes =
array(
"description" => array(
"name" => "_description",
"std" => "这里填默认的网页描述",
"title" => "网页描述:"),

"keywords" => array(
"name" => "_keywords",
"std" => "这里填默认的网页关键字",
"title" => "关键字:")
);

二、创建自定义字段输入框

以下代码将用于创建自定义域以及输入框,照写就是了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//创建自定义字段输入框
function new_meta_boxes() {
global $post, $new_meta_boxes;

foreach($new_meta_boxes as $meta_box) {
$meta_box_value = get_post_meta($post->ID, $meta_box['name'].'_value', true);

if($meta_box_value == "")
$meta_box_value = $meta_box['std'];

// 自定义字段标题
echo'
<h4>'
.$meta_box['title'].'</h4>
'
;

// 自定义字段输入框
echo '<textarea cols="60" name="'.$meta_box['name'].'_value" rows="3">'.$meta_box_value.'</textarea>
'
;
}

echo '<input id="ludou_metaboxes_nonce" name="ludou_metaboxes_nonce" type="hidden" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />';
}

三、创建自定义字段模块

下面代码将在文章编辑页添加自定义字段模块,这其中这用了WordPress的添加模块函数add_meta_box。

1
2
3
4
5
6
7
function create_meta_box() {
global $theme_name;

if ( function_exists('add_meta_box') ) {
add_meta_box( 'new-meta-boxes', '自定义模块', 'new_meta_boxes', 'post', 'normal', 'high' );
}
}

四、保存文章数据

之前所有准备都做好了,最重要的还是保存我们的自定义字段中的信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//保存文章数据
function save_postdata( $post_id ) {
global $new_meta_boxes;

if ( !wp_verify_nonce( $_POST['ludou_metaboxes_nonce'], plugin_basename(__FILE__) ))
return;

if ( !current_user_can( 'edit_posts', $post_id ))
return;

foreach($new_meta_boxes as $meta_box) {
$data = $_POST[$meta_box['name'].'_value'];

if($data == "")
delete_post_meta($post_id, $meta_box['name'].'_value', get_post_meta($post_id, $meta_box['name'].'_value', true));
else
update_post_meta($post_id, $meta_box['name'].'_value', $data);
}
}

五、将函数连接到指定action(动作)

这是最后一步,也是最重要的一步,我们要做的是将函数连接到指定action(动作),以让WordPress程序执行我们之前编写的函数:

1
2
add_action('admin_menu', 'create_meta_box');
add_action('save_post', 'save_postdata');

好了,我们要做的就是这些了,现在你可以在你的主题中调用这两个自定义字段了,用文本编辑器打开主题目录下的header.php,将以下代码复制到之前,就可以给你的网页自定义description和keywords标签了,更具体的操作请使用搜索引擎:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--?php <br ?--> if (is_single()) {
// 自定义字段名称为 description_value
$description = get_post_meta($post->ID, "_description_value", true);

// 自定义字段名称为 keywords_value
$keywords = get_post_meta($post->ID, "_keywords_value", true);

// 去除不必要的空格和HTML标签
$description = trim(strip_tags($description));
$keywords = trim(strip_tags($keywords));

echo '
'
;
}

?>

或者

1
2
3
<?php echo $description= get_post_meta($post->ID, "description_value", true);   ?>

<?php echo $keywords= get_post_meta($post->ID, "keywords_value", true);   ?>

给wordpress Category分类目录添加字段

1.  在模板目录下的 function.php 里添加包含 页面 category_field.php

包括代码如下:

1
2
// 分类添加字段
require_once( dirname(__FILE__).'/category_field.php' );

2.  新建 category_field.php 页面

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
// 分类添加字段
function ems_add_category_field(){
    echo '<div class="form-field">
            <label for="cat-tel">Tel</label>
            <input name="cat-tel" id="cat-tel" type="text" value="" size="40">
            <p>The telephone.</p>
          </div>'
; 
    echo '<div class="form-field">
            <label for="cat-url">URL</label>
            <input name="cat-url" id="cat-url" type="text" value="" size="40">
            <p>The URL.</p>
          </div>'
;       
         
}
add_action('category_add_form_fields','ems_add_category_field',10,2);

// 分类编辑字段
function ems_edit_category_field($tag){
    echo '<tr class="form-field">
            <th scope="row"><label for="cat-tel">Tel</label></th>
            <td>
                <input name="cat-tel" id="cat-tel" type="text" value="'
;
                echo get_option('cat-tel-'.$tag->term_id).'" size="40"/><br>
                <span class="cat-tel">'
.$tag->name.' on the phone.</span>
            </td>
        </tr>'
;
       
    echo '<tr class="form-field">
            <th scope="row"><label for="cat-url">URL</label></th>
            <td>
                <input name="cat-url" id="cat-url" type="text" value="'
;
                echo get_option('cat-url-'.$tag->term_id).'" size="40"/><br>
                <span class="cat-url">'
.$tag->name.' on the URL.</span>
            </td>
        </tr>'
;
       
       
}
add_action('category_edit_form_fields','ems_edit_category_field',10,2);

// 保存数据
function ems_taxonomy_metadate($term_id){
    if(isset($_POST['cat-tel']) && isset($_POST['cat-url'])){
        //判断权限--可改
        if(!current_user_can('manage_categories')){
            return $term_id;
        }
        // 电话
        $tel_key = 'cat-tel-'.$term_id; // key 选项名为 cat-tel-1 类型
        $tel_value = $_POST['cat-tel']; // value
       
        // url
        $url_key = 'cat-url-'.$term_id;
        $url_value = $_POST['cat-url'];
           
        // 更新选项值
        update_option( $tel_key, $tel_value );
        update_option( $url_key, $url_value );
    }
}

// 虽然要两个钩子,但是我们可以两个钩子使用同一个函数
add_action('created_category','ems_taxonomy_metadate',10,1);
add_action('edited_category','ems_taxonomy_metadate',10,1);
?>

调用方法:

1
2
3
4
5
6
7
8
9
10
<?php
    // 取出当前分类 id: $categories[0]->term_id
    $categories = get_the_category();
    $term_id = $categories[0]->term_id;
    $cat_name = $categories[0]->name;  
?>
<div class="phone">
  <div class="p1"><?php echo get_option('cat-tel-'.$term_id);?></div>
  <div class="p2"><a href="<?php echo get_option('cat-url-'.$term_id);?> " target="_blank"><?php echo $cat_name;?></a></div>
</div>

WordPress列表根据序列号递增显示不同颜色

QQ截图20150801161353

1
2
3
4
5
6
7
 <?php $cmntCnw = 1; query_posts( $query_string . '&orderby=date&showposts=10&ignore_sticky_posts=1' );while(have_posts()) : the_post(); ?>
<?php if($cmntCnw <3) { ?>
<li class="clearfix topthree"> <div class="top_number"> <?php echo($cmntCnw++); ?></div> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" rel="bookmark" target="_blank"> <?php the_title(); ?></a></li>
<?php } else { ?>
<li class="clearfix"> <div class="top_number"> <?php echo($cmntCnw++); ?></div> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>" rel="bookmark" target="_blank"> <?php the_title(); ?></a></li>
<?php } ?>
<?php endwhile;wp_reset_query() ?>