IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    轩枫发表于 2015-08-31 14:55:37
    love 0

    前言

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

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

    functions.php

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

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

    1. widgets sidebar 侧边栏小工具

    safdsf

    /** widgets sidebar 侧边栏小工具*/
    if( function_exists('register_sidebar') ) {
      register_sidebar(array(
        'name' => 'First_sidebar',
        'before_widget' => '',
        'after_widget' => '',
        'before_title' => '<h4>',
        'after_title' => '</h4>'
      ));
      register_sidebar(array(
        'name' => 'Second_sidebar',
        'before_widget' => '',
        'after_widget' => '',
        'before_title' => '<h4>',
        'after_title' => '</h4>'
      ));
      register_sidebar(array(
        'name' => 'Third_sidebar',
        'before_widget' => '',
        'after_widget' => '',
        'before_title' => '<h4>',
        'after_title' => '</h4>'
      ));
      register_sidebar(array(
        'name' => 'Fourth_sidebar',
        'before_widget' => '',
        'after_widget' => '',
        'before_title' => '<h4>',
        'after_title' => '</h4>'
      ));
    }
    
    register_nav_menus(array("primary" => "Primary Navigation"));

    2. 后台支持自定义菜单

    sdgfg

    /*nav  后台自定义菜单*/
    if(function_exists('register_nav_menus')){
      register_nav_menus(
        array(
        'header-menu' => __( '导航自定义菜单' ),
        'footer-menu' => __( '页角自定义菜单' ),
        'sider-menu' => __('侧边栏菜单'),
        'primary' => __( 'Primary Navigation', 'lee' ),
        )
      );
    }

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

    <?php wp_nav_menu( array( 'container' => '' ) ); ?>

    3. 面包屑导航

    asdfgvsdgsdf

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

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

    <?php wheatv_breadcrumbs(); ?>

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

    cascdas

    //文章点击数
    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";
        }
        return $count;
    }
    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);
        }
    }

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

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

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

    //为文章中所有链接添加target="_blank"属性
    function autoblank($content) {
        $content = preg_replace("/<a(.*?)>/", "<a$1 target=\"_blank\">", $content);
        return $content;
    }
    add_filter('the_content', 'autoblank');

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

    //清除头部信息
    //remove_action( 'wp_head', 'wp_enqueue_scripts', 1 );
    remove_action( 'wp_head', 'feed_links', 2 );
    remove_action( 'wp_head', 'feed_links_extra', 3 );
    remove_action( 'wp_head', 'rsd_link' );
    remove_action( 'wp_head', 'wlwmanifest_link' );
    remove_action( 'wp_head', 'index_rel_link' );
    remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
    remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
    remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
    //remove_action( 'wp_head', 'locale_stylesheet' );
    remove_action( 'publish_future_post', 'check_and_publish_future_post', 10, 1 );
    //remove_action( 'wp_head', 'noindex', 1 );
    //remove_action( 'wp_head', 'wp_print_styles', 8 );
    //remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
    remove_action( 'wp_head', 'wp_generator' );
    //remove_action( 'wp_head', 'rel_canonical' );
    remove_action( 'wp_footer', 'wp_print_footer_scripts' );
    remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
    remove_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
    add_action('widgets_init', 'my_remove_recent_comments_style');
    function my_remove_recent_comments_style() {
    global $wp_widget_factory;
    remove_action('wp_head', array($wp_widget_factory->widgets['WP_Widget_Recent_Comments'], 'recent_comments_style'));
    }

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

    asdfdasf

    //自动保存和文章修订功能
    define('AUTOSAVE_INTERVAL', 120 );  // 设置自动保存间隔,单位是秒,默认60
    define('WP_POST_REVISIONS', false); // 如果不禁用自动修订,最多允许保存的版本数,3表示最多保存3个修订版

    8. 彩色静态标签云

    dfsgfdg

    // 彩色静态标签云 Color Tag Cloud
    function colorCloud($text) {
      $text = preg_replace_callback('|<a (.+?)>|i', 'colorCloudCallback', $text);
      return $text;
    }
    function colorCloudCallback($matches) {
      $text = $matches[1];
      $color = dechex(rand(0,16777215));
      $pattern = '/style=(\'|\")(.*)(\'|\")/i';
      $text = preg_replace($pattern, "style=\"color:#{$color};$2;\"", $text);
      return "<a $text>";
    }
    add_filter('wp_tag_cloud', 'colorCloud', 1);

    输出标签

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

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

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

    sdafdasfgds

    // 搜索结果关键词高亮显示
    function lee_set_query() {
      $query  = attribute_escape(get_search_query());
      if(strlen($query) > 0){
        echo '
          <script type="text/javascript">
            var lee_query  = "'.$query.'";
          </script>
        ';
      }
    }
    function lee_init_jquery() {
     wp_enqueue_script('jquery');
    }
    add_action('init', 'lee_init_jquery');
    add_action('wp_print_scripts', 'lee_set_query');

    10. 自定义登录界面

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

    vdfvbfdb

    // 自定义登录界面
    function custom_login(){
        echo '<link rel="stylesheet" type="text/css" href="' . get_bloginfo('template_directory') . '/css/login.css" />';
    }
    add_action('login_head', 'custom_login');
    
    function login_headerurl($url) {
        return get_bloginfo('url');
    }
    add_filter('login_headerurl', 'login_headerurl');
    
    function login_headertitle($title){
        return __('轩枫阁');
    }
    add_filter('login_headertitle', 'login_headertitle');

    11. 获得当前文章的位置

    sacfdsvc

    dfgbfdg

    // 当前文章
    function num_Pcurrent_post() {
      global $wpdb;
      $postid = get_the_ID();//获取当前文章的ID
      $getpost = get_post($postid);
      $daysago = $getpost->post_date;//获取当前文章的发布时间
      $today = gmdate('Y-m-d H:i:s', time() + 3600 * 8);//获取当前服务器的时间
      $count_posts = wp_count_posts();
      $num_all_posts = $count_posts->publish;//总的文章数量
      $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 ");
      foreach ($result as $Item) {
      $post_ID[] = $Item->ID;
      }
      $num_current_post = count($post_ID)-1;//当前文章发布以前的文章数量总数
      $output .= $num_current_post.'/'.$num_all_posts;
      echo $output;
    }
    function num_Ncurrent_post() {
      global $wpdb;
      $postid = get_the_ID();//获取当前文章的ID
      $getpost = get_post($postid);
      $daysago = $getpost->post_date;//获取当前文章的发布时间
      $today = gmdate('Y-m-d H:i:s', time() + 3600 * 8);//获取当前服务器的时间
      $count_posts = wp_count_posts();
      $num_all_posts = $count_posts->publish;//总的文章数量
      $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 ");
      foreach ($result as $Item) {
      $post_ID[] = $Item->ID;
      }
      $num_current_post = count($post_ID)+1;//当前文章发布以前的文章数量总数
      $output .= $num_current_post.'/'.$num_all_posts;
      echo $output;
    }

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

    <?php if (get_next_post()) { echo  next_post_link('%link',__( '<span title="上一篇:%title">上一篇</span>', 'lee' ),$in_same_cat = false,$excluded_categories = '11');  } else { echo '<a class="arc_nav_new">已最新</a>';  }?>
    <?php num_Pcurrent_post(); ?>
    
    <?php num_Ncurrent_post(); ?>
    <?php if (get_previous_post()) { echo  previous_post_link('%link',__( '<span title="下一篇:%title">下一篇</span>', 'lee' ),$in_same_cat = false,$excluded_categories = '11');  } else { echo '<a class="arc_nav_new">已最后</a>';  }?>

    12. 热门标签ajax加载

    点击换一换

    sdafvdsf

    // 热门标签ajax部分
    function tagLoad(){
        if( isset($_GET['action'])){
            if($_GET['action'] == 'tag'  ){
                echo wp_tag_cloud('smallest=10&largest=14&number=32&order=RAND');
                die;
            }
        }
    
    }
    add_action('init', 'tagLoad');

    HTML部分

    <a class="tag_change" href="<?php echo get_option('home')."/?action=tag"; ?>">换一换</a>

    使用JS实现点击交互

    // 标签云ajax
        $(".tag_change").click(function(){
        	$.ajax({
                url: $(this).attr("href"),
                type: 'get',
                beforeSend: function() {
                	// 可以显示loading
                },
                error: function(error) {
    				// 错误处理
                },
                success: function(data) {
                	// 成功返回数据,先清空初始标签,装载新数据淡入
                    $(".tag_content").empty().append($(data).fadeIn(200));
                }
            });
            return false;
        });

    13. 外链加上nofollow

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

    // 文章外部链接加上nofollow
    add_filter( 'the_content', 'cn_nf_url_parse');
    function cn_nf_url_parse( $content ) {
    
      $regexp = "<a\s[^>]*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 = '/target\s*=\s*"\s*_blank\s*"/';
            preg_match($pattern, $tag2, $match, PREG_OFFSET_CAPTURE);
            if( count($match) < 1 )
              $noFollow .= ' target="_blank" ';
    
            $pattern = '/rel\s*=\s*"\s*[n|d]ofollow\s*"/';
            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. 图片懒加载lazyload

    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. 获取文章中第一张图

    如跑马灯图

    sdfdsf

    // 获取文章中第一张图
    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. 截取摘要

    xcvfvbf

    // 摘要字数限制
    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. 分类页获得文章简介

    sdff

    // 获得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*x\d*/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(); ?>

     

     



沪ICP备19023445号-2号
友情链接