月度归档:2014年05月

wordpress模板标签-wp_list_authors()

说明

该标签显示博客作者(用户)列表,若用户在博客上发表过文章,则该用户名会显示为一个指向其文章的链接。该标签可显示用户的文章总数和RSS订阅链接。

用法

<?php wp_list_authors( $args ); ?>

默认用法

<?php 
$args = array(
'optioncount' => false,
'exclude_admin' => true,
'show_fullname' => false,
'hide_empty' => true,
'echo' => true,
'feed' => [empty string],
'feed_image' => [empty string],
'style' => list,
'html' => [empty string] ); 
?>

默认情况下的用法:

  • 不显示文章总数

  • 从用户列表中排除'admin(管理者)'

  • 显示“公开显示名称为”中设置的作者名

  • 排除没有发表过文章的用户

  • 显示结果

  • 不显示作者订阅文本或图片

  • 列表格式

  • 返回的条目具备有效的HTML代码

参数

optioncount

(布尔型)显示每个用户所发表的文章总数。有效值包括:

  • 1 (true)

  • 0(false)——默认值

exclude_admin

(布尔型)从用户列表中排除'admin(登录名为admin的用户)'有效值包括:

  • 1 (true)——默认值

  • 0(false)

show_fullname

(布尔型)显示用户的全名(姓+名)。若值为false,显示“公开显示名称为”中设置的用户名。

有效值包括:

  • 1 (true)

  • 0(false)——默认值

hide_empty

(布尔型)不显示没有发表过文章的用户。有效值包括:

  • 1 (true)——默认值

  • 0(false)

echo

(布尔型)显示结果。有效值包括:

  • 1 (true)——默认值

  • 0(false)

feed

(字符串)每位文章作者的RSS订阅链接的链接文本。默认无链接文本,不显示RSS。

feed_image

(字符串)图片的路径/文件名。可作为作者RSS订阅的链接,改写feed参数。

style

(字符串)用以显示作者列表的样式表。list为其默认值,表示以无序列表方式显示作者名;值none可生成常规显示方式(列表项由逗号隔开)。若html为false,该选项将被忽略。始见于WP 2.8。有效值包括:

  • list —— 默认值

  • none

html

(布尔型)以HTML形式或普通文本形式列出作者名。默认设置为true。若html为false,style设置将被覆盖,函数返回由逗号隔开的列表项。始见于WP 2.8。有效值包括:

  • 1 —— 默认值

  • 0

示例

显示作者全名和发表的文章总数

下面的示例显示的作者列表中列出了作者的全名(姓+名)和该作者发表的文章总数。此外,默认情况下,列表中会排出admin用户并隐藏没有发表过文章的作者,不显示RSS订阅或图片。

<?php wp_list_authors('show_fullname=1&optioncount=1'); ?>

wordpress模板标签-wp_list_authors()-wordpress标签模板-代码笔记

历史记录

  • 始见于WordPress 1.2.0版本

  • WP 2.8.0中新增'style'和'html'参数

源文件

wp_list_authors()位于 wp-includes/author-template.php

wordpress后台文章列表显示文章附件数量

随着wordpress这款php+mysql的建站程序热门起来之后很多资源分享站也开始使用wordpress来搭建了,由于是资源分享站,所以有时候一篇文章就要上传多个文件,很多时候网站管理员需要了解某篇文章中有没有附件,还需要点击到文章的编辑页面才能知道该篇文章有没有附件这样管理起来就非常不方便,今天小V就教大家如何在wordpress后台的文章列表页直接显示文章包含了多少个附件,代码如下:

add_filter('manage_posts_columns', 'v7v3_attachment_count', 5);
add_action('manage_posts_custom_column', 'v7v3_columns_attachment_count', 5, 2);
function v7v3_attachment_count($defaults){
    $defaults['wps_post_attachments'] = __('附件数量');
    return $defaults;
}
function v7v3_columns_attachment_count($column_name, $id){
        if($column_name === 'wps_post_attachments'){
        $attachments = get_children(array('post_parent'=>$id));
        $count = count($attachments);
        if($count !=0){echo $count;}
    }
}

将以上代码加入到当前主题的functions.php文件即可下面是效果图:

wordpress后台文章列表显示文章附件数量-wordpress教程-代码笔记

如果文章中包含附件则会显示附件的数量,如果不包含则什么都不显示。

wordpress远程图片文件自动本地化

使用过百度ueditor编辑器插件的小伙伴一定会发现,ueditor编辑器会自动把外链的原创图片抓取到本地,并且使用本地的图片链接来显示在网站上,这个对于很多怕外链图片不稳定又不愿意自己下载上传图片的小伙伴来说简直就是神器~,可是呢不使用ueditor小伙伴就享受不到这个神器般的功能,正好在某老外博客看到一篇远程图片自动本地化的代码小V这就立即分享给大家,代码如下:

add_filter('content_save_pre', 'auto_save_image'); 
function auto_save_image($content) { 
 $upload_path = ''; 
 $upload_url_path = get_bloginfo('url'); 
  
 //上传目录 
 if (($var = get_option('upload_path')) !=''){ 
 $upload_path = $var; 
 } else { 
 $upload_path = 'wp-content/uploads'; 
 } 
 if(get_option('uploads_use_yearmonth_folders')) { 
 $upload_path .= '/'.date("Y",time()).'/'.date("m",time()); 
 } 
  
 //文件地址 
 if(($var = get_option('upload_url_path')) != '') { 
 $upload_url_path = $var; 
 } else { 
 $upload_url_path = bloginfo('url'); 
 } 
 if(get_option('uploads_use_yearmonth_folders')) { 
 $upload_url_path .= '/'.date("Y",time()).'/'.date("m",time()); 
 } 
  
 require_once ("../wp-includes/class-snoopy.php"); 
 $snoopy_Auto_Save_Image = new Snoopy; 
  
 $img = array(); 
  
 //以文章的标题作为图片的标题 
 if ( !empty( $_REQUEST['post_title'] ) ) 
 $post_title = wp_specialchars( stripslashes( $_REQUEST['post_title'] )); 
 $text = stripslashes($content); 
 if (get_magic_quotes_gpc()) $text = stripslashes($text); 
 preg_match_all("/ src=(\"|\'){0,}(http:\/\/(.+?))(\"|\'|\s)/is",$text,$img); 
 $img = array_unique(dhtmlspecialchars($img[2])); 
 foreach ($img as $key => $value){ 
 set_time_limit(180); //每个图片最长允许下载时间,秒 
 if(str_replace(get_bloginfo('url'),"",$value)==$value&&str_replace(get_bloginfo('home'),"",$value)==$value){ 
 //判断是否是本地图片,如果不是,则保存到服务器 
 $fileext = substr(strrchr($value,'.'),1); 
 $fileext = strtolower($fileext); 
 if($fileext==""||strlen($fileext)>4) 
 $fileext = "jpg"; 
 $savefiletype = array('jpg','gif','png','bmp'); 
 if (in_array($fileext, $savefiletype)){ 
 if($snoopy_Auto_Save_Image->fetch($value)){ 
 $get_file = $snoopy_Auto_Save_Image->results; 
 }else{ 
 echo "error fetching file: ".$snoopy_Auto_Save_Image->error."<br>"; 
 echo "error url: ".$value; 
 die(); 
 } 
 $filetime = time(); 
 $filepath = "/".$upload_path;//图片保存的路径目录 
 !is_dir("..".$filepath) ? mkdirs("..".$filepath) : null; 
 //$filename = date("His",$filetime).random(3); 
 $filename = substr($value,strrpos($value,'/'),strrpos($value,'.')-strrpos($value,'/')); 
  
 //$e = '../'.$filepath.$filename.'.'.$fileext; 
 //if(!is_file($e)) { 
 // copy(htmlspecialchars_decode($value),$e); 
 //} 
 $fp = @fopen("..".$filepath.$filename.".".$fileext,"w"); 
 @fwrite($fp,$get_file); 
 fclose($fp); 
  
  
  
 $wp_filetype = wp_check_filetype( $filename.".".$fileext, false ); 
 $type = $wp_filetype['type']; 
 $post_id = (int)$_POST['temp_ID2']; 
 $title = $post_title; 
 $url = $upload_url_path.$filename.".".$fileext; 
 $file = $_SERVER['DOCUMENT_ROOT'].$filepath.$filename.".".$fileext; 
  
 //添加数据库记录 
 $attachment = array( 
 'post_type' => 'attachment', 
 'post_mime_type' => $type, 
 'guid' => $url, 
 'post_parent' => $post_id, 
 'post_title' => $title, 
 'post_content' => '', 
 ); 
 $id = wp_insert_attachment($attachment, $file, $post_parent); 
 $text = str_replace($value,$url,$text); //替换文章里面的图片地址 
 } 
 } 
 } 
 $content = AddSlashes($text); 
 remove_filter('content_save_pre', 'auto_save_image'); 
 return $content; 
} 
  
function mkdirs($dir) 
{ 
 if(!is_dir($dir)) 
 { 
 mkdirs(dirname($dir)); 
 mkdir($dir); 
 } 
 return ; 
} 
function dhtmlspecialchars($string) { 
 if(is_array($string)) { 
 foreach($string as $key => $val) { 
 $string[$key] = dhtmlspecialchars($val); 
 } 
 }else{ 
 $string = str_replace('&', '&', $string); 
 $string = str_replace('"', '"', $string); 
 $string = str_replace('<', '<', $string); 
 $string = str_replace('>', '>', $string); 
 $string = preg_replace('/&(#\d;)/', '&\1', $string); 
 } 
 return $string; 
}

将次代码写入主题的functions.php文件或者是functions.php的引入文件中即可,以后每当在wordpress发布文章时如果文章中含有外链图片就会自动本地化了,无需任何设置操作非常方便。

为wordpress添加本地头像功能代替Gravatar

目前wordpress网站几乎都是使用Gravatar全球通头像来关联用户头像的,但是由于Gravatar的服务器是在国外,国内经常由于某些XXX原因而连接不上,为了解决这个问题小V之前提到过使用国内的cdn服务来镜像Gravatar头像:《wordpress加速优化教程:多种Gravatar头像缓存方案》,而开放注册性网站则可以使用simple-local-avatars插件将网站用户的头像完全本地化,这样就不用担心Gravatar头像超时造成网站经常打开缓慢的问题了。

今天小V就来教大家使用代码将Gravatar头像半本地化,那么什么是半本地化呢?也就是通过用户的邮箱判断用户是否拥有Gravatar头像,如果拥有则使用Gravatar头像,当用户拥有本地头像且拥有Gravatar头像时,则优先使用本地头像。

<?php
class Simple_Local_Avatars {
    private $user_id_being_edited;
       
    public function __construct() {
        add_filter( 'get_avatar', array( $this, 'get_avatar' ), 10, 5 );
       
        add_action( 'admin_init', array( $this, 'admin_init' ) );
       
        add_action( 'show_user_profile', array( $this, 'edit_user_profile' ) );
        add_action( 'edit_user_profile', array( $this, 'edit_user_profile' ) );
       
        add_action( 'personal_options_update', array( $this, 'edit_user_profile_update' ) );
        add_action( 'edit_user_profile_update', array( $this, 'edit_user_profile_update' ) );
       
        add_filter( 'avatar_defaults', array( $this, 'avatar_defaults' ) );
    }
       
    public function get_avatar( $avatar = '', $id_or_email, $size = 96, $default = '', $alt = false ) {
       
        if ( is_numeric($id_or_email) )
            $user_id = (int) $id_or_email;
        elseif ( is_string( $id_or_email ) && ( $user = get_user_by( 'email', $id_or_email ) ) )
            $user_id = $user->ID;
        elseif ( is_object( $id_or_email ) && ! empty( $id_or_email->user_id ) )
            $user_id = (int) $id_or_email->user_id;
       
        if ( empty( $user_id ) )
            return $avatar;
       
        $local_avatars = get_user_meta( $user_id, 'simple_local_avatar', true );
       
        if ( empty( $local_avatars ) || empty( $local_avatars['full'] ) )
            return $avatar;
       
        $size = (int) $size;
       
        if ( empty( $alt ) )
            $alt = get_the_author_meta( 'display_name', $user_id );
       
        // generate a new size
        if ( empty( $local_avatars[$size] ) ) {
            $upload_path = wp_upload_dir();
            $avatar_full_path = str_replace( $upload_path['baseurl'], $upload_path['basedir'], $local_avatars['full'] );
            $image_sized = image_resize( $avatar_full_path, $size, $size, true );       
            // deal with original being >= to original image (or lack of sizing ability)
            $local_avatars[$size] = is_wp_error($image_sized) ? $local_avatars[$size] = $local_avatars['full'] : str_replace( $upload_path['basedir'], $upload_path['baseurl'], $image_sized ); 
            // save updated avatar sizes
            update_user_meta( $user_id, 'simple_local_avatar', $local_avatars );
        } elseif ( substr( $local_avatars[$size], 0, 4 ) != 'http' ) {
            $local_avatars[$size] = home_url( $local_avatars[$size] );
        }
       
        $author_class = is_author( $user_id ) ? ' current-author' : '' ;
        $avatar = "<img alt='" . esc_attr( $alt ) . "' src='" . $local_avatars[$size] . "' class='avatar avatar-{$size}{$author_class} photo' height='{$size}' width='{$size}' />";
       
        return apply_filters( 'simple_local_avatar', $avatar );
    }
       
    public function admin_init() {
        //load_plugin_textdomain( 'simple-local-avatars', false, dirname( plugin_basename( __FILE__ ) ) . '/localization/' );
       
        register_setting( 'discussion', 'simple_local_avatars_caps', array( $this, 'sanitize_options' ) );
        add_settings_field( 'simple-local-avatars-caps', __('Local Avatar Permissions','simple-local-avatars'), array( $this, 'avatar_settings_field' ), 'discussion', 'avatars' );
    }
       
    public function sanitize_options( $input ) {
        $new_input['simple_local_avatars_caps'] = empty( $input['simple_local_avatars_caps'] ) ? 0 : 1;
        return $new_input;
    }
       
    public function avatar_settings_field( $args ) {        
        $options = get_option('simple_local_avatars_caps');
       
        echo '
            <label for="simple_local_avatars_caps">
                <input type="checkbox" name="simple_local_avatars_caps" id="simple_local_avatars_caps" value="1" ' . @checked( $options['simple_local_avatars_caps'], 1, false ) . ' />
                ' . __('仅具有头像上传权限的用户具有设置本地头像权限(作者及更高等级角色)。','simple-local-avatars') . '
            </label>
        ';
    }
       
    public function edit_user_profile( $profileuser ) {
    ?>
    <h3><?php _e( '头像','simple-local-avatars' ); ?></h3>
       
    <table class="form-table">
        <tr>
            <th><label for="simple-local-avatar"><?php _e('上传头像','simple-local-avatars'); ?></label></th>
            <td style="width: 50px;" valign="top">
                <?php echo get_avatar( $profileuser->ID ); ?>
            </td>
            <td>
            <?php
                $options = get_option('simple_local_avatars_caps');
       
                if ( empty($options['simple_local_avatars_caps']) || current_user_can('upload_files') ) {
                    do_action( 'simple_local_avatar_notices' ); 
                    wp_nonce_field( 'simple_local_avatar_nonce', '_simple_local_avatar_nonce', false ); 
            ?>
                    <input type="file" name="simple-local-avatar" id="simple-local-avatar" /><br />
            <?php
                    if ( empty( $profileuser->simple_local_avatar ) )
                        echo '<span class="description">' . __('尚未设置本地头像,请点击“浏览”按钮上传本地头像。','simple-local-avatars') . '</span>';
                    else
                        echo '
                            <input type="checkbox" name="simple-local-avatar-erase" value="1" /> ' . __('移除本地头像','simple-local-avatars') . '<br />
                            <span class="description">' . __('如需要修改本地头像,请重新上传新头像。如需要移除本地头像,请选中上方的“移除本地头像”复选框并更新个人资料即可。<br/>移除本地头像后,将恢复使用 Gravatar 头像。','simple-local-avatars') . '</span>
                        ';      
                } else {
                    if ( empty( $profileuser->simple_local_avatar ) )
                        echo '<span class="description">' . __('尚未设置本地头像,请在 Gravatar.com 网站设置头像。','simple-local-avatars') . '</span>';
                    else
                        echo '<span class="description">' . __('你没有头像上传全乡,如需要修改本地头像,请联系站点管理员。','simple-local-avatars') . '</span>';
                }
            ?>
            </td>
        </tr>
    </table>
    <script type="text/javascript">var form = document.getElementById('your-profile');form.encoding = 'multipart/form-data';form.setAttribute('enctype', 'multipart/form-data');</script>
    <?php        
    }
       
    public function edit_user_profile_update( $user_id ) {
        if ( ! isset( $_POST['_simple_local_avatar_nonce'] ) || ! wp_verify_nonce( $_POST['_simple_local_avatar_nonce'], 'simple_local_avatar_nonce' ) )            //security
            return;
       
        if ( ! empty( $_FILES['simple-local-avatar']['name'] ) ) {
            $mimes = array(
                'jpg|jpeg|jpe' => 'image/jpeg',
                'gif' => 'image/gif',
                'png' => 'image/png',
                'bmp' => 'image/bmp',
                'tif|tiff' => 'image/tiff'
            );
       
            // front end (theme my profile etc) support
            if ( ! function_exists( 'wp_handle_upload' ) )
                require_once( ABSPATH . 'wp-admin/includes/file.php' );
       
            $this->avatar_delete( $user_id );    // delete old images if successful
       
            // need to be more secure since low privelege users can upload
            if ( strstr( $_FILES['simple-local-avatar']['name'], '.php' ) )
                wp_die('For security reasons, the extension ".php" cannot be in your file name.');
       
            $this->user_id_being_edited = $user_id; // make user_id known to unique_filename_callback function
            $avatar = wp_handle_upload( $_FILES['simple-local-avatar'], array( 'mimes' => $mimes, 'test_form' => false, 'unique_filename_callback' => array( $this, 'unique_filename_callback' ) ) );
       
            if ( empty($avatar['file']) ) {     // handle failures
                switch ( $avatar['error'] ) {
                    case 'File type does not meet security guidelines. Try another.' :
                        add_action( 'user_profile_update_errors', create_function('$a','$a->add("avatar_error",__("请上传有效的图片文件。","simple-local-avatars"));') );               
                        break;
                    default :
                        add_action( 'user_profile_update_errors', create_function('$a','$a->add("avatar_error","<strong>".__("上传头像过程中出现以下错误:","simple-local-avatars")."</strong> ' . esc_attr( $avatar['error'] ) . '");') );
                }
       
                return;
            }
       
            update_user_meta( $user_id, 'simple_local_avatar', array( 'full' => $avatar['url'] ) );      // save user information (overwriting old)
        } elseif ( ! empty( $_POST['simple-local-avatar-erase'] ) ) {
            $this->avatar_delete( $user_id );
        }
    }
       
    /**
     * remove the custom get_avatar hook for the default avatar list output on options-discussion.php
     */
    public function avatar_defaults( $avatar_defaults ) {
        remove_action( 'get_avatar', array( $this, 'get_avatar' ) );
        return $avatar_defaults;
    }
       
    /**
     * delete avatars based on user_id
     */
    public function avatar_delete( $user_id ) {
        $old_avatars = get_user_meta( $user_id, 'simple_local_avatar', true );
        $upload_path = wp_upload_dir();
       
        if ( is_array($old_avatars) ) {
            foreach ($old_avatars as $old_avatar ) {
                $old_avatar_path = str_replace( $upload_path['baseurl'], $upload_path['basedir'], $old_avatar );
                @unlink( $old_avatar_path );    
            }
        }
       
        delete_user_meta( $user_id, 'simple_local_avatar' );
    }
       
    public function unique_filename_callback( $dir, $name, $ext ) {
        $user = get_user_by( 'id', (int) $this->user_id_being_edited ); 
        $name = $base_name = sanitize_file_name( substr(md5($user->user_login),0,12) . '_avatar' );
        $number = 1;
       
        while ( file_exists( $dir . "/$name$ext" ) ) {
            $name = $base_name . '_' . $number;
            $number++;
        }
       
        return $name . $ext;
    }
}
       
$simple_local_avatars = new Simple_Local_Avatars;
       
function get_simple_local_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) {
    global $simple_local_avatars;
    $avatar = $simple_local_avatars->get_avatar( '', $id_or_email, $size, $default, $alt );
       
    if ( empty ( $avatar ) )
        $avatar = get_avatar( $id_or_email, $size, $default, $alt );
       
    return $avatar;
}

将以上代码加入到functions.php或者functions.php引入的php文件中即可实现Gravatar头像半本地化,最后来张效果图:

为wordpress添加本地头像功能代替Gravatar-wordpress教程-代码笔记

wordpress使用代码在每篇文章尾部添加版权信息

随着互联网的普及,建站门槛的降低,很多没有专业知识的国人也加入到了建站大军之中,最初那批只为了讨论代码的以及建站经验的站长也都消失的差不多了,现在个人建站很少有不带商业目的的。随着网站的增加,但是互联网信息的资源却没有那么快速的增长,造成很多网站找不到可以发布的资源,很多不道德的站长也就打起来别人的主意,开始采集别人网站信息。少数善意的转载者既使没有看到版权信息也会主动自觉地添加上原文出处,但是大部分站长都是直接采集的,如果我们在网站文章的尾部添加一个版权信息,大部分站长采集后也不回去特意把每篇采集来的文章都去除版权,所以为文章添加一个版权信息和转载提示还是非常有必要的。

function feed_copyright($content) {
    if(is_single() or is_feed()) {
        $content.= '<div>转载请注明来源:<a rel="bookmark" title="'.get_the_title().'" href="'.get_permalink().'">'.get_the_title().'</a></div>';
        $content.= '<div>本文链接地址:<a rel="bookmark" title="'.get_the_title().'" href="'.get_permalink().'">'.get_permalink().'</a></div>';
        $content.= '<div>订阅本站:<a title="wordpress建站" href="http://www.v7v3.com/f/?t=dy">http://www.v7v3.com/f/?t=dy</a></div>';
        $content.= "</blockquote>";
    }
    return $content;
}
add_filter ('the_content', 'feed_copyright');

将以上代码加入到functions.php即可在每篇文章的末尾输出一个转载和版权提示,本站的文章尾部广告就是这样添加的,效果图:

wordpress使用代码在每篇文章尾部添加版权信息-wordpress教程-代码笔记

高效的扩展wordpress主题核心文件functions.php

相信大家对wordpress主题中的functions.php文件一定不陌生,本站很多教程中的代码也是直接加到functions.php就可以使用的,但是随着代码多了以后想修改functions.php就变得不方便了,而且一旦代码错误再恢复逐渐庞大的functions.php文件也就麻烦起来了,对于新手来说很可能就找不出问题所在了。今天小V就教大家一个更高效,更方便的方法来为functions.php扩展功能。

第一步:在主题文件夹下新建一个名为inc的文件夹

第二步:将以下代码加入到当前主题的functions.php文件中,代码如下:

define('INC', TEMPLATEPATH.'/inc');
IncludeAll( INC );
function IncludeAll($dir){
    $dir = realpath($dir);
    if($dir){
        $files = scandir($dir);
        sort($files);
        foreach($files as $file){
            if($file == '.' || $file == '..'){
                continue;
            }elseif(preg_match('/.php$/i', $file)){
                include_once $dir.'/'.$file;
            }
        }
    }
}

以后每次为主题扩展功能的时候只要将代码保存为一个新的php文件,文件名不限,但最好是英文或数字,然后将文件放入到inc目录下即可,效果和直接将代码加到functions.php文件一样,而且一旦代码出错只要直接删除出错代码的文件即可。此方法不仅降低了新人修改functions.php造成网站无法访问的风险,而且不用一个一个的去include php script,使得代码更加高效。