wordpress二次开发中对于functions.php的制作是非常多的,今天我们来分享关于wordpress二次开发技巧之functions.php的制作,希望大家可以喜欢!
下面根据需求,对各种能实现进行简单介绍。
先对functions.php文件进行介绍,通过代码实现各功能。
1. widgets sidebar 侧边栏小工具
01 |
/** widgets sidebar 侧边栏小工具*/ |
02 |
if ( function_exists( 'register_sidebar'
|
03 |
register_sidebar( array ( |
04 |
'name'
|
05 |
'before_widget'
|
06 |
'after_widget'
|
07 |
'before_title'
|
08 |
'after_title'
|
09 |
)); |
10 |
register_sidebar( array ( |
11 |
'name'
|
12 |
'before_widget'
|
13 |
'after_widget'
|
14 |
'before_title'
|
15 |
'after_title'
|
16 |
)); |
17 |
register_sidebar( array ( |
18 |
'name'
|
19 |
'before_widget'
|
20 |
'after_widget'
|
21 |
'before_title'
|
22 |
'after_title'
|
23 |
)); |
24 |
register_sidebar( array ( |
25 |
'name'
|
26 |
'before_widget'
|
27 |
'after_widget'
|
28 |
'before_title'
|
29 |
'after_title'
|
30 |
)); |
31 |
} |
32 |
|
33 |
register_nav_menus( array ( "primary" => "Primary Navigation" )); |
2. 后台支持自定义菜单
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'
|
09 |
) |
10 |
); |
11 |
} |
输出菜单,在如header.php插入显示菜单的代码
1 |
|
3. 面包屑导航
01 |
// 面包屑导航注册代码 |
02 |
function wheatv_breadcrumbs() { |
03 |
$delimiter = '>'
|
04 |
$name = '首页'
|
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 '
|
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, ' '
|
23 |
echo $currentBefore . ''
|
24 |
single_cat_title(); |
25 |
echo ''
|
26 |
|
27 |
} elseif ( is_day() ) { |
28 |
echo ''
|
29 |
echo ''
|
30 |
echo $currentBefore . get_the_time( 'd'
|
31 |
|
32 |
} elseif ( is_month() ) { |
33 |
echo ''
|
34 |
echo $currentBefore . get_the_time( 'F'
|
35 |
|
36 |
} elseif ( is_year() ) { |
37 |
echo $currentBefore . get_the_time( 'Y'
|
38 |
|
39 |
} elseif ( is_single() ) { |
40 |
$cat = get_the_category(); $cat = $cat [0]; |
41 |
echo get_category_parents( $cat , TRUE, ' '
|
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 [] = ''
|
57 |
$parent_id = $page ->post_parent; |
58 |
} |
59 |
$breadcrumbs = array_reverse ( $breadcrumbs ); |
60 |
foreach ( $breadcrumbs as $crumb ) echo $crumb . ' '
|
61 |
echo $currentBefore ; |
62 |
the_title(); |
63 |
echo $currentAfter ; |
64 |
|
65 |
} elseif ( is_search() ) { |
66 |
echo $currentBefore . '搜索结果'
|
67 |
|
68 |
} elseif ( is_tag() ) { |
69 |
echo $currentBefore . '搜索标签: '
|
70 |
single_tag_title(); |
71 |
echo ''
|
72 |
|
73 |
} elseif ( is_author() ) { |
74 |
global $author ; |
75 |
$userdata = get_userdata( $author ); |
76 |
echo $currentBefore . 'Articles posted by '
|
77 |
|
78 |
} elseif ( is_404() ) { |
79 |
echo $currentBefore . 'Error 404'
|
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 __( '第'
|
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. 文章访问量(点击数)
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. 文章中所有链接新窗口中打开
6. 清除wp自带无用头部信息
01 |
//清除头部信息 |
02 |
//remove_action( 'wp_head', 'wp_enqueue_scripts', 1 ); |
03 |
remove_action( 'wp_head'
|
04 |
remove_action( 'wp_head'
|
05 |
remove_action( 'wp_head'
|
06 |
remove_action( 'wp_head'
|
07 |
remove_action( 'wp_head'
|
08 |
remove_action( 'wp_head'
|
09 |
remove_action( 'wp_head'
|
10 |
remove_action( 'wp_head'
|
11 |
//remove_action( 'wp_head', 'locale_stylesheet' ); |
12 |
remove_action( 'publish_future_post'
|
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'
|
17 |
//remove_action( 'wp_head', 'rel_canonical' ); |
18 |
remove_action( 'wp_footer'
|
19 |
remove_action( 'wp_head'
|
20 |
remove_action( 'template_redirect'
|
21 |
add_action( 'widgets_init'
|
22 |
function my_remove_recent_comments_style() { |
23 |
global $wp_widget_factory ; |
24 |
remove_action( 'wp_head'
|
25 |
} |
7. 自动保存和文章修订功能
1 |
//自动保存和文章修订功能 |
2 |
define( 'AUTOSAVE_INTERVAL'
|
3 |
define( 'WP_POST_REVISIONS'
|
8. 彩色静态标签云
01 |
// 彩色静态标签云 Color Tag Cloud |
02 |
function colorCloud( $text ) { |
03 |
$text = preg_replace_callback( '||i'
|
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'
|
输出标签
1 |
|
9. 搜索结果关键词高亮显示
具体实现,再另写文章介绍,后续可通过搜索找到。
01 |
// 搜索结果关键词高亮显示 |
02 |
function lee_set_query() { |
03 |
$query = attribute_escape(get_search_query()); |
04 |
if ( strlen ( $query ) > 0){ |
05 |
echo ' |
06 |
|
09 |
' |
10 |
} |
11 |
} |
12 |
function lee_init_jquery() { |
13 |
wp_enqueue_script( 'jquery'
|
14 |
} |
15 |
add_action( 'init'
|
16 |
add_action( 'wp_print_scripts'
|
10. 自定义登录界面
在不更改html的情况下,可通过引入样式文件,自定义登录界面。
01 |
// 自定义登录界面 |
02 |
function custom_login(){ |
03 |
echo ' |
04 |
} |
05 |
add_action( 'login_head'
|
06 |
|
07 |
function login_headerurl( $url ) { |
08 |
return get_bloginfo( 'url'
|
09 |
} |
10 |
add_filter( 'login_headerurl'
|
11 |
|
12 |
function login_headertitle( $title ){ |
13 |
return __( '轩枫阁'
|
14 |
} |
15 |
add_filter( 'login_headertitle'
|
11. 获得当前文章的位置
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'
|
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 . '/'
|
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'
|
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 . '/'
|
32 |
echo $output ; |
33 |
} |
显示上下篇及位置,在single.php
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
12. 热门标签ajax加载
点击换一换
01 |
// 热门标签ajax部分 |
02 |
function tagLoad(){ |
03 |
if ( isset( $_GET [ 'action'
|
04 |
if ( $_GET [ 'action'
|
05 |
echo wp_tag_cloud( 'smallest=10&largest=14&number=32&order=RAND'
|
06 |
die ; |
07 |
} |
08 |
} |
09 |
|
10 |
} |
11 |
add_action( 'init'
|
HTML部分
使用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 = " ??)([^ " >]*?)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 < count ( $matches ); $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( '/ |
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. 获取文章中第一张图
如跑马灯图
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" ); |
显示图片
16. 截取摘要
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 '.get_category_link( $category [0]->term_id ). '">' . $category [0]->cat_name. '' ; |
6 |
} |
7 |
} |
8 |
add_filter( 'get_first_category' , 'get_first_category' ); |
HTML
1 |
|
18. 分类页获得文章简介
1 |
// 获得category简介 |
2 |
function get_category_expert( $length =240){ |
3 |
$content = get_the_content(); |
4 |
$trimmed_content = wp_trim_words( $content , $length , '. get_permalink() . '"> [...]' ); |
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 '.get_permalink(). '" title="阅读全文">' ; |
17 |
|
18 |
the_post_thumbnail( 'thumbnail' ); |
19 |
|
20 |
echo '' ; |
21 |
|
22 |
} else { //如果文章没有设置缩略图,则查找文章内是否包含图片 |
23 |
|
24 |
$content = $post ->post_content; |
25 |
|
26 |
preg_match_all( '/ |
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 '.get_permalink(). '" title="阅读全文">. $thumb_src . '" alt="缩略图" />' ; |
40 |
|
41 |
} else { // 如果文章内没有图片,则用默认的图片。 |
42 |
$random = mt_rand(0, 19); |
43 |
echo '.get_permalink(). '" title="阅读全文">.get_bloginfo( 'template_url' ). '/images/thumbnail/default_thumbnail_' . $random . '.jpg" alt="缩略图" />' ; |
44 |
|
45 |
} |
46 |
|
47 |
} |
48 |
|
49 |
} |
显示缩略图
1 |
// 第一种 |
2 |
|
3 |
|
4 |
5 |
// 第二种 |
6 |
|