wordpress二次开发中对于functions.php的制作是非常多的,今天我们来分享关于wordpress二次开发技巧之functions.php的制作,希望大家可以喜欢!

下面根据需求,对各种能实现进行简单介绍。

先对functions.php文件进行介绍,通过代码实现各功能。

1. widgets sidebar 侧边栏小工具

wordpress二次开发技巧之functions.php篇

01
/** widgets sidebar 侧边栏小工具*/
02
if( function_exists('register_sidebar') ) {
03
register_sidebar(array(
04
'name' =>'First_sidebar',
05
'before_widget' =>'',
06
'after_widget' =>'',
07
'before_title' =>'
',
08
'after_title' =>''
09
));
10
register_sidebar(array(
11
'name' =>'Second_sidebar',
12
'before_widget' =>'',
13
'after_widget' =>'',
14
'before_title' =>'
',
15
'after_title' =>''
16
));
17
register_sidebar(array(
18
'name' =>'Third_sidebar',
19
'before_widget' =>'',
20
'after_widget' =>'',
21
'before_title' =>'
',
22
'after_title' =>''
23
));
24
register_sidebar(array(
25
'name' =>'Fourth_sidebar',
26
'before_widget' =>'',
27
'after_widget' =>'',
28
'before_title' =>'
',
29
'after_title' =>''
30
));
31
}
32
33
register_nav_menus(array("primary" =>"Primary Navigation"));

2. 后台支持自定义菜单

wordpress二次开发技巧之functions.php篇

01
/*nav  后台自定义菜单*/
02
if(function_exists('register_nav_menus')){
03
register_nav_menus(
04
array(
05
'header-menu' => __('导航自定义菜单' ),
06
'footer-menu' => __('页角自定义菜单' ),
07
'sider-menu' => __('侧边栏菜单'),
08
'primary' => __('Primary Navigation','lee' ),
09
)
10
);
11
}

输出菜单,在如header.php插入显示菜单的代码

1
<?php wp_nav_menu(array('container' =>'' ) ); ?>
3. 面包屑导航
01
// 面包屑导航注册代码
02
function wheatv_breadcrumbs() {
03
$delimiter ='>';
04
$name ='首页';//text for the 'Home' link
05
$currentBefore ='';
06
$currentAfter ='';
07
08
if ( !is_home() && !is_front_page() || is_paged() ) {
09
10
echo '';
11
global $post;
12
// $home = get_bloginfo('url');
13
$home = get_option('home');
14
echo '.$home.'" >'.$name .' ' .$delimiter .' ';
15
16
if ( is_category() ) {
17
global $wp_query;
18
$cat_obj =$wp_query->get_queried_object();
19
$thisCat =$cat_obj->term_id;
20
$thisCat = get_category($thisCat);
21
$parentCat = get_category($thisCat->parent);
22
if ($thisCat->parent != 0)echo(get_category_parents($parentCat, TRUE,' ' .$delimiter .' '));
23
echo $currentBefore .'';
24
single_cat_title();
25
echo '' .$currentAfter;
26
27
}elseif ( is_day() ) {
28
echo '' . get_the_time('Y') .' ' .$delimiter .' ';
29
echo '' . get_the_time('F') .' ' .$delimiter .' ';
30
echo $currentBefore . get_the_time('d') .$currentAfter;
31
32
}elseif ( is_month() ) {
33
echo '' . get_the_time('Y') .' ' .$delimiter .' ';
34
echo $currentBefore . get_the_time('F') .$currentAfter;
35
36
}elseif ( is_year() ) {
37
echo $currentBefore . get_the_time('Y') .$currentAfter;
38
39
}elseif ( is_single() ) {
40
$cat = get_the_category();$cat =$cat[0];
41
echo get_category_parents($cat, TRUE,' ' .$delimiter .' ');
42
echo $currentBefore;
43
the_title();
44
echo $currentAfter;
45
46
}elseif ( is_page() && !$post->post_parent ) {
47
echo $currentBefore;
48
the_title();
49
echo $currentAfter;
50
51
}elseif ( is_page() &&$post->post_parent ) {
52
$parent_id =$post->post_parent;
53
$breadcrumbs =array();
54
while ($parent_id) {
55
$page = get_page($parent_id);
56
$breadcrumbs[] ='' . get_the_title($page->ID) .'';
57
$parent_id =$page->post_parent;
58
}
59
$breadcrumbs =array_reverse($breadcrumbs);
60
foreach ($breadcrumbs as $crumb)echo $crumb .' ' .$delimiter .' ';
61
echo $currentBefore;
62
the_title();
63
echo $currentAfter;
64
65
}elseif ( is_search() ) {
66
echo $currentBefore .'搜索结果' . get_search_query() .'' .$currentAfter;
67
68
}elseif ( is_tag() ) {
69
echo $currentBefore .'搜索标签: ';
70
single_tag_title();
71
echo '' .$currentAfter;
72
73
}elseif ( is_author() ) {
74
global $author;
75
$userdata = get_userdata($author);
76
echo $currentBefore .'Articles posted by ' .$userdata->display_name .$currentAfter;
77
78
}elseif ( is_404() ) {
79
echo $currentBefore .'Error 404' .$currentAfter;
80
}
81
82
if ( get_query_var('paged') ) {
83
if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() )echo ' (';
84
echo __('第') .'' . get_query_var('paged') .'页';
85
if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() )echo ')';
86
}
87
echo '';
88
}
89
}

显示面包屑导航(category.php或single.php等)

1
4.  文章访问量(点击数)
wordpress二次开发技巧之functions.php篇
01
//文章点击数
02
function getPostViews($postID){
03
$count_key ='post_views_count';
04
$count = get_post_meta($postID,$count_key, true);
05
if($count==''){
06
delete_post_meta($postID,$count_key);
07
add_post_meta($postID,$count_key,'0');
08
return "0";
09
}
10
return $count;
11
}
12
function setPostViews($postID) {
13
$count_key ='post_views_count';
14
$count = get_post_meta($postID,$count_key, true);
15
if($count==''){
16
$count = 0;
17
delete_post_meta($postID,$count_key);
18
add_post_meta($postID,$count_key,'0');
19
}else{
20
$count++;
21
update_post_meta($postID,$count_key,$count);
22
}
23
}

显示点击量(如category.php或single.php)

1

5. 文章中所有链接新窗口中打开

1

//为文章中所有链接添加target="_blank"属性

2
function autoblank($content) {
3
$content = preg_replace("//","",$content);
4
return $content;
5
}
6
add_filter('the_content','autoblank');

6. 清除wp自带无用头部信息

01
//清除头部信息
02
//remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
03
remove_action('wp_head','feed_links', 2 );
04
remove_action('wp_head','feed_links_extra', 3 );
05
remove_action('wp_head','rsd_link' );
06
remove_action('wp_head','wlwmanifest_link' );
07
remove_action('wp_head','index_rel_link' );
08
remove_action('wp_head','parent_post_rel_link', 10, 0 );
09
remove_action('wp_head','start_post_rel_link', 10, 0 );
10
remove_action('wp_head','adjacent_posts_rel_link_wp_head', 10, 0 );
11
//remove_action( 'wp_head', 'locale_stylesheet' );
12
remove_action('publish_future_post','check_and_publish_future_post', 10, 1 );
13
//remove_action( 'wp_head', 'noindex', 1 );
14
//remove_action( 'wp_head', 'wp_print_styles', 8 );
15
//remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
16
remove_action('wp_head','wp_generator' );
17
//remove_action( 'wp_head', 'rel_canonical' );
18
remove_action('wp_footer','wp_print_footer_scripts' );
19
remove_action('wp_head','wp_shortlink_wp_head', 10, 0 );
20
remove_action('template_redirect','wp_shortlink_header', 11, 0 );
21
add_action('widgets_init','my_remove_recent_comments_style');
22
function my_remove_recent_comments_style() {
23
global $wp_widget_factory;
24
remove_action('wp_head',array($wp_widget_factory->widgets['WP_Widget_Recent_Comments'],'recent_comments_style'));
25
}

7. 自动保存和文章修订功能

wordpress二次开发技巧之functions.php篇
1
//自动保存和文章修订功能
2
define('AUTOSAVE_INTERVAL', 120 );// 设置自动保存间隔,单位是秒,默认60
3
define('WP_POST_REVISIONS', false);// 如果不禁用自动修订,最多允许保存的版本数,3表示最多保存3个修订版
8. 彩色静态标签云
wordpress二次开发技巧之functions.php篇
01
// 彩色静态标签云 Color Tag Cloud
02
function colorCloud($text) {
03
$text = preg_replace_callback('||i','colorCloudCallback',$text);
04
return $text;
05
}
06
function colorCloudCallback($matches) {
07
$text =$matches[1];
08
$color =dechex(rand(0,16777215));
09
$pattern ='/style=('|")(.*)('|")/i';
10
$text = preg_replace($pattern,"style="color:#{$color};$2;"",$text);
11
return "";
12
}
13
add_filter('wp_tag_cloud','colorCloud', 1);

输出标签

1

<?php wp_tag_cloud('smallest=10&largest=14&number=32&order=RAND') ?>

9. 搜索结果关键词高亮显示

具体实现,再另写文章介绍,后续可通过搜索找到。

wordpress二次开发技巧之functions.php篇

01
// 搜索结果关键词高亮显示
02
function lee_set_query() {
03
$query  = attribute_escape(get_search_query());
04
if(strlen($query) > 0){
05
echo '
06
07
var lee_query  ="'.$query.'";
08
09
';
10
}
11
}
12
function lee_init_jquery() {
13
wp_enqueue_script('jquery');
14
}
15
add_action('init','lee_init_jquery');
16
add_action('wp_print_scripts','lee_set_query');

10. 自定义登录界面

在不更改html的情况下,可通过引入样式文件,自定义登录界面。

wordpress二次开发技巧之functions.php篇

01
// 自定义登录界面
02
function custom_login(){
03
echo '. get_bloginfo('template_directory') . '/css/login.css" />';
04
}
05
add_action('login_head','custom_login');
06
07
function login_headerurl($url) {
08
return get_bloginfo('url');
09
}
10
add_filter('login_headerurl','login_headerurl');
11
12
function login_headertitle($title){
13
return __('轩枫阁');
14
}
15
add_filter('login_headertitle','login_headertitle');

11. 获得当前文章的位置

wordpress二次开发技巧之functions.php篇

wordpress二次开发技巧之functions.php篇

01
// 当前文章
02
function num_Pcurrent_post() {
03
global $wpdb;
04
$postid = get_the_ID();//获取当前文章的ID
05
$getpost = get_post($postid);
06
$daysago =$getpost->post_date;//获取当前文章的发布时间
07
$today =gmdate('Y-m-d H:i:s', time() + 3600 * 8);//获取当前服务器的时间
08
$count_posts = wp_count_posts();
09
$num_all_posts =$count_posts->publish;//总的文章数量
10
$result =$wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_date BETWEEN '$daysago' AND '$today' AND post_status='publish' AND post_type='post' ORDER BY post_date DESC ");
11
foreach ($result as $Item) {
12
$post_ID[] =$Item->ID;
13
}
14
$num_current_post =count($post_ID)-1;//当前文章发布以前的文章数量总数
15
$output .=$num_current_post.'/'.$num_all_posts;
16
echo $output;
17
}
18
function num_Ncurrent_post() {
19
global $wpdb;
20
$postid = get_the_ID();//获取当前文章的ID
21
$getpost = get_post($postid);
22
$daysago =$getpost->post_date;//获取当前文章的发布时间
23
$today =gmdate('Y-m-d H:i:s', time() + 3600 * 8);//获取当前服务器的时间
24
$count_posts = wp_count_posts();
25
$num_all_posts =$count_posts->publish;//总的文章数量
26
$result =$wpdb->get_results("SELECT ID FROM $wpdb->posts WHERE post_date BETWEEN '$daysago' AND '$today' AND post_status='publish' AND post_type='post' ORDER BY post_date DESC ");
27
foreach ($result as $Item) {
28
$post_ID[] =$Item->ID;
29
}
30
$num_current_post =count($post_ID)+1;//当前文章发布以前的文章数量总数
31
$output .=$num_current_post.'/'.$num_all_posts;
32
echo $output;
33
}

显示上下篇及位置,在single.php

1
<?phpif  (get_next_post()) {echo  next_post_link('%link',__('上一篇','lee'),$in_same_cat = false,$excluded_categories ='11');  }else {echo '已最新';  }?>
2
3
4
5
<?phpif  (get_previous_post()) {echo  previous_post_link('%link',__('下一篇','lee' ),$in_same_cat = false,$excluded_categories ='11');  }else {echo '已最后';  }?>

12. 热门标签ajax加载

点击换一换

wordpress二次开发技巧之functions.php篇
01
// 热门标签ajax部分
02
function tagLoad(){
03
if( isset($_GET['action'])){
04
if($_GET['action'] =='tag'  ){
05
echo wp_tag_cloud('smallest=10&largest=14&number=32&order=RAND');
06
die;
07
}
08
}
09
10
}
11
add_action('init','tagLoad');
HTML部分
1
)."/?action=tag"; ?>">换一换
使用JS实现点击交互
01
// 标签云ajax
02
$(".tag_change").click(function(){
03
$.ajax({
04
url: $(this).attr("href"),
05
type:'get',
06
beforeSend:function() {
07
// 可以显示loading
08
},
09
error:function(error) {
10
// 错误处理
11
},
12
success:function(data) {
13
// 成功返回数据,先清空初始标签,装载新数据淡入
14
$(".tag_content").empty().append($(data).fadeIn(200));
15
}
16
});
17
return false;
18
});
13. 外链加上nofollow

防止引入的网站有问题,被降权

01
// 文章外部链接加上nofollow
02
add_filter('the_content','cn_nf_url_parse');
03
function cn_nf_url_parse($content ) {
04
05
$regexp ="]*href=("??)([^" >]*?)1[^>]*>";
06
if(preg_match_all("/$regexp/siU",$content,$matches, PREG_SET_ORDER)) {
07
if( !empty($matches) ) {
08
09
$srcUrl = get_option('siteurl');
10
for ($i=0;$i 
11
{
12
13
$tag =$matches[$i][0];
14
$tag2 =$matches[$i][0];
15
$url =$matches[$i][0];
16
17
$noFollow ='';
18
19
$pattern ='/targets*=s*"s*_blanks*"/';
20
preg_match($pattern,$tag2,$match, PREG_OFFSET_CAPTURE);
21
if(count($match) < 1 )
22
$noFollow .=' target="_blank" ';
23
24
$pattern ='/rels*=s*"s*[n|d]ofollows*"/';
25
preg_match($pattern,$tag2,$match, PREG_OFFSET_CAPTURE);
26
if(count($match) < 1 )
27
$noFollow .=' rel="nofollow" ';
28
29
$pos =strpos($url,$srcUrl);
30
if ($pos === false) {
31
$tag = rtrim ($tag,'>');
32
$tag .=$noFollow.'>';
33
$content =str_replace($tag2,$tag,$content);
34
}
35
}
36
}
37
}
38
39
$content =str_replace(']]>',']]>',$content);
40
return $content;
41
42
}

14. 图片懒加载lazyload3. 外链加上nofollow

1
function lazyload($content) {
2
if(!is_feed()||!is_robots) {
3
$content=preg_replace('//i',"n",$content);
4
}
5
return $content;
6
}
7
add_filter ('the_content','lazyload');
JS代码(需引入jquery.lazyload.js)
1
// lazyload
2
$("img").lazyload({
3
effect :"fadeIn",
4
threshold : 100,
5
});

15. 获取文章中第一张图

如跑马灯图
wordpress二次开发技巧之functions.php篇
01
// 获取文章中第一张图
02
function wpdx_postimage($atts,$content = null) {
03
extract(shortcode_atts(array(
04
"size" =>'full',
05
"float" =>'none'
06
),$atts));
07
$images =& get_children('post_type=attachment&post_mime_type=image&post_parent='. get_the_id() );
08
foreach($images as $imageID =>$imagePost )
09
$fullimage = wp_get_attachment_image($imageID,$size, false);
10
$imagedata = wp_get_attachment_image_src($imageID,$size, false);
11
$width = ($imagedata[1]+2);
12
$height = ($imagedata[2]+2);
13
return $fullimage;
14
}
15
add_shortcode("postimage","wpdx_postimage");

显示图片

1

2
3
16. 截取摘要
wordpress二次开发技巧之functions.php篇
01
// 摘要字数限制
02
function new_excerpt_length($length) {
03
return 100;
04
}
05
add_filter('excerpt_length','new_excerpt_length');
06
07
// 摘要...
08
function new_excerpt_more($more ) {
09
return '...';
10
}
11
add_filter('excerpt_more','new_excerpt_more');
17. 获取文章第一个分类目录
因为一篇文章可能属于多个目录,有些地方只需要输出一个
1
// 获取文章第一个分类目录
2
function get_first_category(){
3
$category = get_the_category();
4
if($category[0]){
5
echo ''.$category[0]->cat_name.'';
6
}
7
}
8
add_filter('get_first_category','get_first_category');
HTML
1
18. 分类页获得文章简介
wordpress二次开发技巧之functions.php篇
1
// 获得category简介
2
function get_category_expert($length=240){
3
$content = get_the_content();
4
$trimmed_content = wp_trim_words($content,$length,' [...]' );
5
echo $trimmed_content;
6
}
7
add_filter('get_category_expert','get_category_expert');
19. 根据页面类型指定每页显示的文章数
01
// 根据页面类型指定每页显示的文章数
02
function custom_posts_per_page($query){
03
if(is_home()){
04
$query->set('posts_per_page',9);//首页每页显示8篇文章
05
}
06
if(is_search()){
07
$query->set('posts_per_page',5);//搜索页显示所有匹配的文章,不分页
08
}
09
if(is_archive()){
10
$query->set('posts_per_page',-1);//archive每页显示25篇文章
11
}
12
if(is_tag()){
13
$query->set('posts_per_page',4);//archive每页显示25篇文章
14
}
15
if(is_category()){
16
$query->set('posts_per_page',9);//archive每页显示25篇文章
17
}
18
if(is_category(11)){
19
$query->set('posts_per_page',-1);//archive每页显示25篇文章
20
}
21
}//function
22
//this adds the function above to the 'pre_get_posts' action
23
add_action('pre_get_posts','custom_posts_per_page');
20. 缩略图
01
//添加特色缩略图支持
02
if ( function_exists('add_theme_support') )add_theme_support('post-thumbnails');
03
04
/*
05
* 缩略图
06
*/
07
08
function dm_the_thumbnail() {
09
10
global $post;
11
12
// 判断该文章是否设置的缩略图,如果有则直接显示
13
14
if ( has_post_thumbnail() ) {
15
16
echo '';
17
18
the_post_thumbnail('thumbnail');
19
20
echo '';
21
22
}else {//如果文章没有设置缩略图,则查找文章内是否包含图片
23
24
$content =$post->post_content;
25
26
preg_match_all('//sim',$content,$strResult, PREG_PATTERN_ORDER);
27
28
$n =count($strResult[1]);
29
30
if($n > 0){// 如果文章内包含有图片,就用第一张图片做为缩略图
31
// 为了得到第一张图片的215x115尺寸,得用正则替换格式
32
$thumb_first =$strResult[1][0];
33
$thumb_split =strrpos($thumb_first,'.');
34
$thumb_before =substr($thumb_first, 0,$thumb_split);
35
$thumb_after =substr($thumb_first,$thumb_split,strlen($thumb_first));
36
$reg ="/-d*xd*/im";
37
$thumb_before = preg_replace($reg,"",$thumb_before);
38
$thumb_src =$thumb_before.'-215x115'.$thumb_after;
39
echo '';40
41
}else {// 如果文章内没有图片,则用默认的图片。
42
$random= mt_rand(0, 19);
43
echo '';44
45
}
46
47
}
48
49
}
显示缩略图
1
// 第一种
2
3
4
5
// 第二种
6