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

前言

最近又写了个网站,也是基于wordpress,LEE周刊官网:www.leeweekly.com。这个网站和轩枫阁的部分功能有所不同,部分功能困扰了挺久,通过Google搜索到了各种解决方案,记录成文备忘。

LEE周刊新版PC官网设计开发总结:http://t.cn/RyzrUD4

functions.php

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

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

1. widgets sidebar 侧边栏小工具

wordpress二次开发技巧-functions.php篇
wordpress二次开发技巧-functions.php篇
/** widgets sidebar 侧边栏小工具*/
if( function_exists('register_sidebar'<span class="crayon-sy">) ) {
  register_sidebar(array(
    'name' <span class="crayon-o">=> 'First_sidebar'<span class="crayon-sy">,
    'before_widget' <span class="crayon-o">=> ''<span class="crayon-sy">,
    'after_widget' <span class="crayon-o">=> ''<span class="crayon-sy">,
    'before_title' <span class="crayon-o">=> '<h4>'<span class="crayon-sy">,
    'after_title' <span class="crayon-o">=> '</h4>'
  ));
  register_sidebar(array(
    'name' <span class="crayon-o">=> 'Second_sidebar'<span class="crayon-sy">,
    'before_widget' <span class="crayon-o">=> ''<span class="crayon-sy">,
    'after_widget' <span class="crayon-o">=> ''<span class="crayon-sy">,
    'before_title' <span class="crayon-o">=> '<h4>'<span class="crayon-sy">,
    'after_title' <span class="crayon-o">=> '</h4>'
  ));
  register_sidebar(array(
    'name' <span class="crayon-o">=> 'Third_sidebar'<span class="crayon-sy">,
    'before_widget' <span class="crayon-o">=> ''<span class="crayon-sy">,
    'after_widget' <span class="crayon-o">=> ''<span class="crayon-sy">,
    'before_title' <span class="crayon-o">=> '<h4>'<span class="crayon-sy">,
    'after_title' <span class="crayon-o">=> '</h4>'
  ));
  register_sidebar(array(
    'name' <span class="crayon-o">=> 'Fourth_sidebar'<span class="crayon-sy">,
    'before_widget' <span class="crayon-o">=> ''<span class="crayon-sy">,
    'after_widget' <span class="crayon-o">=> ''<span class="crayon-sy">,
    'before_title' <span class="crayon-o">=> '<h4>'<span class="crayon-sy">,
    'after_title' <span class="crayon-o">=> '</h4>'
  ));
}
 
register_nav_menus(array("primary" => "Primary Navigation"));

2. 后台支持自定义菜单

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

3. 面包屑导航

asdfgvsdgsdf

// 面包屑导航注册代码
function wheatv_breadcrumbs() {
  $delimiter = '<i>></i>'<span class="crayon-sy">;
  $name = '首页'<span class="crayon-sy">; //text for the 'Home' link
  $currentBefore = ''<span class="crayon-sy">;
  $currentAfter = ''<span class="crayon-sy">;
 
  if ( !is_home() && !is_front_page() || is_paged() ) {
 
  echo ''<span class="crayon-sy">;
  global $post;
  // $home = get_bloginfo('url');
  $home = get_option('home'<span class="crayon-sy">);
  echo '<a href="'<span class="crayon-sy">.$home.'" >'<span class="crayon-sy">. $name . ' </a>' <span class="crayon-sy">. $delimiter . ' '<span class="crayon-sy">;
 
  if ( is_category() ) {
    global $wp_query;
    $cat_obj = $wp_query->get_queried_object();
    $thisCat = $cat_obj->term_id;
    $thisCat = get_category($thisCat);
    $parentCat = get_category($thisCat->parent);
    if ($thisCat->parent != 0) echo(get_category_parents($parentCat, TRUE, ' ' <span class="crayon-sy">. $delimiter . ' '<span class="crayon-sy">));
      echo $currentBefore . ''<span class="crayon-sy">;
      single_cat_title();
      echo '' <span class="crayon-sy">. $currentAfter;
 
    } elseif ( is_day() ) {
      echo '' <span class="crayon-sy">. get_the_time('Y'<span class="crayon-sy">) . ' ' <span class="crayon-sy">. $delimiter . ' '<span class="crayon-sy">;
      echo '' <span class="crayon-sy">. get_the_time('F'<span class="crayon-sy">) . ' ' <span class="crayon-sy">. $delimiter . ' '<span class="crayon-sy">;
      echo $currentBefore . get_the_time('d'<span class="crayon-sy">) . $currentAfter;
 
    } elseif ( is_month() ) {
      echo '' <span class="crayon-sy">. get_the_time('Y'<span class="crayon-sy">) . ' ' <span class="crayon-sy">. $delimiter . ' '<span class="crayon-sy">;
      echo $currentBefore . get_the_time('F'<span class="crayon-sy">) . $currentAfter;
 
    } elseif ( is_year() ) {
      echo $currentBefore . get_the_time('Y'<span class="crayon-sy">) . $currentAfter;
 
    } elseif ( is_single() ) {
      $cat = get_the_category(); $cat = $cat[0];
      echo get_category_parents($cat, TRUE, ' ' <span class="crayon-sy">. $delimiter . ' '<span class="crayon-sy">);
      echo $currentBefore;
      the_title();
      echo $currentAfter;
 
    } elseif ( is_page() && !$post->post_parent ) {
      echo $currentBefore;
      the_title();
      echo $currentAfter;
 
    } elseif ( is_page() && $post->post_parent ) {
      $parent_id = $post->post_parent;
      $breadcrumbs = array();
      while ($parent_id) {
        $page = get_page($parent_id);
        $breadcrumbs[] = '' <span class="crayon-sy">. get_the_title($page->ID) . ''<span class="crayon-sy">;
        $parent_id = $page->post_parent;
      }
      $breadcrumbs = array_reverse($breadcrumbs);
      foreach ($breadcrumbs as $crumb) echo $crumb . ' ' <span class="crayon-sy">. $delimiter . ' '<span class="crayon-sy">;
      echo $currentBefore;
      the_title();
      echo $currentAfter;
 
    } elseif ( is_search() ) {
      echo $currentBefore . '搜索结果' <span class="crayon-sy">. get_search_query() . '' <span class="crayon-sy">. $currentAfter;
 
    } elseif ( is_tag() ) {
      echo $currentBefore . '搜索标签: '<span class="crayon-sy">;
      single_tag_title();
      echo '' <span class="crayon-sy">. $currentAfter;
 
    } elseif ( is_author() ) {
      global $author;
      $userdata = get_userdata($author);
      echo $currentBefore . 'Articles posted by ' <span class="crayon-sy">. $userdata->display_name . $currentAfter;
 
    } elseif ( is_404() ) {
      echo $currentBefore . 'Error 404' <span class="crayon-sy">. $currentAfter;
  }
 
  if ( get_query_var('paged'<span class="crayon-sy">) ) {
    if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() ) echo ' ('<span class="crayon-sy">;
      echo __('第'<span class="crayon-sy">) . '' <span class="crayon-sy">. get_query_var('paged'<span class="crayon-sy">) . '页'<span class="crayon-sy">;
    if ( is_category() || is_day() || is_month() || is_year() || is_search() || is_tag() || is_author() ) echo ')'<span class="crayon-sy">;
  }
  echo ''<span class="crayon-sy">;
  }
}

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

<?php wheatv_breadcrumbs(); ?>

4.  文章访问量(点击数)

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

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

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

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

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

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

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

8. 彩色静态标签云

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

输出标签

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

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

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

10. 自定义登录界面

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

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

11. 获得当前文章的位置

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

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

12. 热门标签ajax加载

点击换一换

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

HTML部分

使用JS实现点击交互

13. 外链加上nofollow

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

// 文章外部链接加上nofollow
add_filter( 'the_content', 'cn_nf_url_parse');
function cn_nf_url_parse( $content ) {
 
  $regexp = "<as[^>]*href=("??)([^" >]*?)1[^>]*>";
  if(preg_match_all("/$regexp/siU", $content, $matches, PREG_SET_ORDER)) {
    if( !empty($matches) ) {
 
      $srcUrl = get_option('siteurl');
      for ($i=0; $i < count($matches); $i++)
      {
 
        $tag = $matches[$i][0];
        $tag2 = $matches[$i][0];
        $url = $matches[$i][0];
 
        $noFollow = '';
 
        $pattern = '/targets*=s*"s*_blanks*"/';
        preg_match($pattern, $tag2, $match, PREG_OFFSET_CAPTURE);
        if( count($match) < 1 )
          $noFollow .= ' target="_blank" ';
 
        $pattern = '/rels*=s*"s*[n|d]ofollows*"/';
        preg_match($pattern, $tag2, $match, PREG_OFFSET_CAPTURE);
        if( count($match) < 1 )
          $noFollow .= ' rel="nofollow" ';
 
        $pos = strpos($url,$srcUrl);
        if ($pos === false) {
          $tag = rtrim ($tag,'>');
          $tag .= $noFollow.'>';
          $content = str_replace($tag2,$tag,$content);
        }
      }
    }
  }
 
  $content = str_replace(']]>', ']]>', $content);
  return $content;
 
}

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

function lazyload($content) {
  if(!is_feed()||!is_robots) {
    $content=preg_replace('/<img(.+)src=['"]([^'"]+)['"](.*)>/i',"<img$1data-original="$2" src="data:image/gif;base64,R0lGODlhAQABAIAAAOHh4QAAACH5BAAAAAAALAAAAAABAAEAQAICRAEAOw=="$3>n",$content);
  }
  return $content;
}
add_filter ('the_content', 'lazyload');

JS代码(需引入jquery.lazyload.js)

// lazyload
$("img").lazyload({
    effect : "fadeIn",
    threshold : 100,
});

15. 获取文章中第一张图

如跑马灯图

wordpress二次开发技巧-functions.php篇
wordpress二次开发技巧-functions.php篇
// 获取文章中第一张图
function wpdx_postimage($atts, $content = null) {
  extract(shortcode_atts(array(
    "size" => 'full',
    "float" => 'none'
  ), $atts));
  $images =& get_children( 'post_type=attachment&post_mime_type=image&post_parent=' . get_the_id() );
  foreach( $images as $imageID => $imagePost )
  $fullimage = wp_get_attachment_image($imageID, $size, false);
  $imagedata = wp_get_attachment_image_src($imageID, $size, false);
  $width = ($imagedata[1]+2);
  $height = ($imagedata[2]+2);
  return $fullimage;
}
add_shortcode("postimage", "wpdx_postimage");

显示图片

<a href="<?php the_permalink(); ?>" target="_blank">
    <?php echo do_shortcode("[postimage]"); ?>
</a>

16. 截取摘要

wordpress二次开发技巧-functions.php篇
wordpress二次开发技巧-functions.php篇
// 摘要字数限制
function new_excerpt_length($length) {
  return 100;
}
add_filter('excerpt_length', 'new_excerpt_length');
 
// 摘要...
function new_excerpt_more( $more ) {
  return '...';
}
add_filter('excerpt_more', 'new_excerpt_more');

17. 获取文章第一个分类目录

因为一篇文章可能属于多个目录,有些地方只需要输出一个

// 获取文章第一个分类目录
function get_first_category(){
  $category = get_the_category();
  if($category[0]){
    echo '<a class="col_cat" href="'.get_category_link($category[0]->term_id ).'">'.$category[0]->cat_name.'</a>';
  }
}
add_filter('get_first_category', 'get_first_category');

HTML

<?php get_first_category(); ?>

18. 分类页获得文章简介

wordpress二次开发技巧-functions.php篇
wordpress二次开发技巧-functions.php篇
// 获得category简介
function get_category_expert($length=240){
  $content = get_the_content();
  $trimmed_content = wp_trim_words( $content, $length, '<a href="'. get_permalink() .'"> [...]</a>' );
  echo $trimmed_content;
}
add_filter('get_category_expert', 'get_category_expert');

19. 根据页面类型指定每页显示的文章数

// 根据页面类型指定每页显示的文章数
function custom_posts_per_page($query){
    if(is_home()){
        $query->set('posts_per_page',9);//首页每页显示8篇文章
    }
    if(is_search()){
        $query->set('posts_per_page',5);//搜索页显示所有匹配的文章,不分页
    }
    if(is_archive()){
        $query->set('posts_per_page',-1);//archive每页显示25篇文章
      }
    if(is_tag()){
        $query->set('posts_per_page',4);//archive每页显示25篇文章
    }
    if(is_category()){
        $query->set('posts_per_page',9);//archive每页显示25篇文章
    }
    if(is_category(11)){
        $query->set('posts_per_page',-1);//archive每页显示25篇文章
    }
}//function
//this adds the function above to the 'pre_get_posts' action
add_action('pre_get_posts','custom_posts_per_page');

20. 缩略图

//添加特色缩略图支持
if ( function_exists('add_theme_support') )add_theme_support('post-thumbnails');
 
/*
* 缩略图
*/
 
function dm_the_thumbnail() {
 
    global $post;
 
    // 判断该文章是否设置的缩略图,如果有则直接显示
 
    if ( has_post_thumbnail() ) {
 
        echo '<a class="at_feature" href="'.get_permalink().'" title="阅读全文">';
 
        the_post_thumbnail('thumbnail');
 
        echo '</a>';
 
    } else { //如果文章没有设置缩略图,则查找文章内是否包含图片
 
        $content = $post->post_content;
 
        preg_match_all('/<img.*?(?: |t|r|n)?src=['"]?(.+?)['"]?(?:(?: |t|r|n)+.*?)?>/sim', $content, $strResult, PREG_PATTERN_ORDER);
 
        $n = count($strResult[1]);
 
        if($n > 0){ // 如果文章内包含有图片,就用第一张图片做为缩略图
            // 为了得到第一张图片的215x115尺寸,得用正则替换格式
            $thumb_first = $strResult[1][0];
            $thumb_split = strrpos($thumb_first, '.');
            $thumb_before = substr($thumb_first, 0, $thumb_split);
            $thumb_after = substr($thumb_first, $thumb_split, strlen($thumb_first));
            $reg = "/-d*xd*/im";
            $thumb_before = preg_replace($reg, "", $thumb_before);
            $thumb_src = $thumb_before.'-215x115'.$thumb_after;
            echo '<a class="at_feature" href="'.get_permalink().'" title="阅读全文"><img class="animated" src="'.$thumb_src.'" alt="缩略图" /></a>';
 
        }else { // 如果文章内没有图片,则用默认的图片。
            $random= mt_rand(0, 19);
            echo '<a class="at_feature" href="'.get_permalink().'" title="阅读全文"><img class="animated" src="'.get_bloginfo('template_url').'/images/thumbnail/default_thumbnail_'.$random.'.jpg" alt="缩略图" /></a>';
 
        }
 
    }
 
}

显示缩略图

// 第一种
<?php if (has_post_thumbnail()){ the_post_thumbnail();} ?>
 

// 第二种
<?php dm_the_thumbnail(); ?>

 

本文:wordpress二次开发技巧-functions.php篇

Leave a Reply