• 兰州seo技术博客免费提供seo疑惑解答,seo学习教程,以及提供网站优化方案;网站目前有seo教程,seo工具,网站建设,以及seo变现等方面的知识

wordpress开发实用技巧

网站建设 www.niuseo.cn 3392次浏览 0个评论
欢迎访问本站的wordpress档案馆,所有的函数代码都是本站目前正在使用或者曾经使用过的。基本是全部可用状态但可能因为版本导致出错的。修改文件请勤于备份防止出现意外,函数功能大部分源自于网络收集,部分出自知更鸟和GIT云落。若有疑问或者错误可以再留言板进行说明!
WordPress 常用模板函数速查表:http://wpjam.qiniudn.com/cheatsheet
WordPress 主题教程:从零开始制作 WordPress 主题:http://blog.wpjam.com/article/wp-theme-lessons/
WordPress 插件教程:自己动手写 WordPress 插件:http://blog.wpjam.com/article/write-plugin-by-yourself/

1.实现创建多个wordpress评论框架,根据不同页面来调用模板
2.禁用wordpress后台主题编辑功能和,插件和主题上传功能
3.wordpress搜索结果不包含页面的内容
4.wordpress不用插件实现文章浏览次数统计
5.wordpress控制分类.首页.标签.显示文章数量各不相同
6.使用强大的timthumb来实现wordpress读取文章图片作为缩略图
7.wordpress给文章图片加入title和alt标签
8.wordpress统计当前文章图片数量+附文字数量统计
9.给当前主题增加文章类型的选项
10.wordpress文章发表编辑界面增加自定义字段
11.wordpress后台登陆错误,登陆成功。自动邮件提醒
12.wordpress后台地址加密,和增设额外的一道安全码
13.SMTP邮箱设置,让wordpress能正常收发邮件
14.wordpress检测当前页面百度是否收录
15.首页中不显示某些分类的文章
16.wordpress不同的分类使用不同的模板
17wordpress不同的分类下的文章,使用模板也不同
18.wordpress使用多个头部header和底部footer
19.wordpress首页或分类,输出文章内的多张图片(参考本站相册分类)
20.wordpress首页.搜索.标签根据文章所属分类。使用不同的模板展来展现。(参考本站搜索)
21.wordpress实现无线下拉刷新数据
22.wordpress 不用插件使用CDN加速的办法
23.wordpress统计大分类的文章总数量
24.wordpress自定义小代码
25.wordpress创建独立页面
26.刘亦菲水晶之家正在使用的插件
27.网站自由使用各种小图标,调用font-awesome图标库
28.wordpress文章发表自动推送给百度
29.判断对方是安卓还是苹果根据反馈加载不同的CSS样式表
30.wordpress搜索只限于文章标题
31.wordpress伪静态后去掉分类目录链接中category标志
32.wordpress增加网站统计信息
33.wordpress评论禁止纯英文和日语的评论
34.wordpress自定义新用户注册欢迎邮件
35.wordpress让用户可以本地上传头像
36.wordpress文章发表时间为:几小时前,几天前,几个月前
37.wordpress创建自定义栏目Post Type模块
38.WordPress 模板层次详细介绍
39.WordPress 技巧:通过图片地址获取 ID
40.WordPress 技巧:将所有文章的别名设置成自身的 ID
41.WordPress更改固定链接结构,IIS7配置伪静态和301重定向
42.WordPress删除文章,也会自动删除文章中的附件图片
43.WordPress创建自定义菜单,并且在前台调用出来
44.WordPress判断当前文章是否为置顶文章,是的话输出指定内容
45.WordPress纯代码给网站增加点赞功能
46.WordPress文章摘要内容,自定义输出文字数量
47.WordPress24小时内发表的文章增加图标或者额外文字
48.WordPress不同页面调用不同的侧边栏

实现创建多个wordpress评论框架,根据不同页面来调用模板

有时候网站设计需要到多个不同评论框架,比如独立页面一个评论框样式,文章默认评论框架又是另外一个样式。使用wordoress创建两个评论模板,根据需要来调用对应的模板方式如下。

  1. 默认评论框架模板是主题的comments.php,调用函数是<?php comments_template(, true); ?>
  1. 创建第二个评论模板框
  1. 命名为1comments.php,调用函数是<?php comments_template( ‘/1comments1.php’ ); ?>

禁用wordpress后台主题编辑功能和,插件和主题上传功能

有时候为了系统安全,防止不法之徒爆破成功登陆后台后利用修改主题函数,和上传恶意插件来植入影响服务器安全的后门。我们有必要禁用wordpress的后台主题编辑和上传插件的功能。这样即便对方入侵了后台也翻不了天。函数放在主题functions.<?php中

  1. define(‘DISALLOW_FILE_EDIT’, true); //禁用主题编辑功能
  2. define(‘DISALLOW_FILE_MODS’,true); //禁用后台主题上传安装功能

wordpress搜索结果不包含页面的内容

独立页面一般是做专题功能设计用处,我们可能并不需求搜索的时候展示这部分内容。还有些主题是每个文章模型都是独立样式和模板整体非常大气美观,而页面默认模板破坏了整体样式布局。无论是那种需要我们都要禁用wordpress搜索读取到页面

  1. //搜索结果排除所有页面
  2. function search_filter_page($query) {
  3. if ($query->is_search) {
  4. $query->set(‘post_type’, ‘post’);
  5. }
  6. return $query;
  7. }
  8. add_filter(‘pre_get_posts’,‘search_filter_page’);
  9. show_admin_bar(false);

wordpress不用插件实现文章浏览次数统计

wordpress虽然插件库是个极为强大的存在,但是不推荐大家极度依赖插件。插件越多会让wordpress变得臃肿不堪拖慢速度。能不用插件尽量不用,尤其是能用函数代码解决的东西就用代码解决。文章浏览统计近乎是每个网站都是必备的,大名鼎鼎的WP-PostViews相信大家都有所了解。但是我们可以不用插件也一样实现网站文章浏览统计。备注(PS:后台卸载PostViews会直接清空数据库views全部记录,请注意备份)
下方函数放入functions.<?php。需要调用地方插入:<?php post_views(‘ ‘, ‘ 次’); ?>

  1. //* 访问计数 post_views(‘ ‘, ‘ 次’);
  2. function record_visitors()
  3. {
  4. if (is_singular())
  5. {
  6. global $post;
  7. $post_ID = $post->ID;
  8. if($post_ID)
  9. {
  10. $post_views = (int)get_post_meta($post_ID, ‘views’, true);
  11. if(!update_post_meta($post_ID, ‘views’, ($post_views+1)))
  12. {
  13. add_post_meta($post_ID, ‘views’, 1, true); } } }}
  14. add_action(‘wp_head’, ‘record_visitors’);
  15. /// 函数名称:post_views
  16. /// 函数作用:取得文章的阅读次数
  17. function post_views($before = ‘(点击 ‘, $after = ‘ 次)’, $echo = 1)
  18. {
  19. global $post;
  20. $post_ID = $post->ID;
  21. $views = (int)get_post_meta($post_ID, ‘views’, true);
  22. if ($echo) echo $before, number_format($views), $after;
  23. else return $views;
  24. }

wordpress控制分类.首页.标签.显示文章数量各不相同

wordpress默认控制文章显示数量在后台-设置-阅读中更改,但是这里是控制全局的。如果我们要控制分类显示的数量和首页不相同可以采用下方函数来实现。如果需要控制指定分类文章数量。下方函数放入functions.<?php

  1. //控制文章显示数量,依次首页,分类,标签
  2. function iteblog_posts_per_page($query) {
  3. if (is_home()) {
  4. $query->set(‘posts_per_page’, 23);
  5. }
  6. if (is_category()) {
  7. $query->set(‘posts_per_page’, 23);
  8. }
  9. if( is_category(530) ){
  10. $query->set(‘posts_per_page’,6); //控制指定ID为530分类文章数量
  11. }
  12. if (is_tag()) {
  13. $query->set(‘posts_per_page’, 23);
  14. } //endif
  15. } //function
  16. add_action(‘pre_get_posts’, ‘iteblog_posts_per_page’);

使用强大的timthumb来实现wordpress读取文章图片作为缩略图

获取文章第一张图片作为缩略图,这个功能非常实用也经常用得到。大众普遍方式是用函数获取到得是文章原图,如果网站图片比较多会严重拖慢速度的。这里极力推荐timthumb来获取网站缩略图,它会根据你定义的大小来截取缩略图然后缓存到本地,而且支持外链图片的。步骤如下
1.下载timthumb文件到当前主题目录下timthumb
2.将以下函数代买放入到functions中

  1. //添加特色缩略图支持
  2. if ( function_exists(‘add_theme_support’) )add_theme_support(‘post-thumbnails’);
  3. //输出缩略图地址 From wpdaxue.com
  4. function post_thumbnail_src(){
  5. global $post;
  6. if( $values = get_post_custom_values(“thumb”) ) { //输出自定义域图片地址
  7. $values = get_post_custom_values(“thumb”);
  8. $post_thumbnail_src = $values [0];
  9. } elseif( has_post_thumbnail() ){ //如果有特色缩略图,则输出缩略图地址
  10. $thumbnail_src = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID),‘full’);
  11. $post_thumbnail_src = $thumbnail_src [0];
  12. } else {
  13. $post_thumbnail_src = ;
  14. ob_start();
  15. ob_end_clean();
  16. $output = preg_match_all(‘/<img.+src=[\'”]([^\'”]+)[\'”].*>/i’, $post->post_content, $matches);
  17. $post_thumbnail_src = $matches [1] [0]; //获取该图片 src
  18. if(empty($post_thumbnail_src)){ //如果日志中没有图片,则显示随机图片
  19. $random = mt_rand(1, 10);
  20. echo get_bloginfo(‘template_url’);
  21. echo ‘/images/pic/’.$random.‘.jpg’;
  22. //如果日志中没有图片,则显示默认图片
  23. //echo ‘/images/default_thumb.jpg’;
  24. }
  25. };
  26. echo $post_thumbnail_src;
  27. }

3.需要调用缩略图的地方,使用以下代码。图片大小根据需要自定义

  1. <a target=”_blank” href=”<?php
  2. the_permalink(); ?>“><?php
  3. if (git_get_option(‘git_cdnurl_b’) ) {
  4. echo ‘<img class=”thumb” style=”width:200px;height:125px” src=”‘;
  5. echo post_thumbnail_src();
  6. echo ‘?imageView2/1/w/200/h/123/q/75″ alt=”‘ . get_the_title() . ‘” />’;
  7. } else {
  8. echo ‘<img class=”thumb” style=”width:200px;height:125px” src=”‘ . get_template_directory_uri() . ‘/timthumb.php?src=’;
  9. echo post_thumbnail_src();
  10. echo ‘&h=125&w=200&q=90&zc=1&ct=1″ alt=”‘ . get_the_title() . ‘” />’;
  11. } ?></a>

wordpress统计当前文章图片数量+附文字数量统计

wordpress开发实用技巧
有些图片比较多wordpress网站会比较需要获取文章图片总数,函数放到functions中即可。调用的地方加入<?php echo pic_total(); ?>

  1. function pic_total() {
  2. global $post;
  3. $post_img = ;
  4. ob_start();
  5. ob_end_clean();
  6. $output = preg_match_all(‘/\<img src=”(.+?)” />/is ‘, $post->post_content, $matches, PREG_SET_ORDER);
  7. $post_img_src = $matches [0][1];
  8. $cnt = count($matches);
  9. if($cnt == ‘1’ || $cnt == ‘0’){
  10. return . $cnt . ;//其中的Image可以换成中文的“张”、“图片”等
  11. }
  12. else {
  13. return . $cnt . ;//这个同理,因为中文没有复数,所以也可以换成同样的或者自己把这个else的function去掉
  14. }
  15. }

统计文章字数的数量

  1. //字数统计
  2. function count_words ($text) {
  3. global $post;
  4. if ( == $text ) {
  5. $text = $post->post_content;
  6. if (mb_strlen($output, ‘UTF-8’) < mb_strlen($text, ‘UTF-8’)) $output .= ‘本文共’ . mb_strlen(preg_replace(‘/\s/’,,html_entity_decode(strip_tags($post->post_content))),‘UTF-8’) . ‘个字’;
  7. return $output;
  8. }
  9. }

调用方式<?php echo count_words ($text); ?>

给当前主题增加文章类型的选项

wordpress开发实用技巧
非常多的主题没有加入文章类型选项,就是文章发表编辑界面默认主题,有一个[图片,日志,视频,连接]文章类型的选择。有个别用户非常依赖这个功能,如果你的主题恰巧没有可以再function加入这段函数

  1. add_theme_support( ‘post-formats’, array( ‘status’, ‘aside’, ‘gallery’, ‘video’, ‘audio’ ) );

standard – 标准,也就是默认的文章形式
aisde – 日志,实质上就是个不显示标题的标准文章,类似于 Facebook 或人人网中更新的一条日志;
link – 链接,链接到其它网站的链接。类似 Tumblr 的链接分享;
quote – 引语,展示为引用的一段文字,通常使用 blockquote 来包裹引用内容。或者,可能直接将引语写入文章,并将其出处写在标题栏;
status – 状态,简而言之就像是一条 Tweet,通常最多 140 个字符。类似于微博 Twitter 状态消息;
image – 图像,发布单张图片;
gallery – 相册,也就是扩充的图像功能
audio – 音频,……需要说吗
video – 视频,……同上
chat – 聊天,以专门格式显示聊天记录
有时候我们想把wordpress内置文章形式(post-formats)的名字重命名,比如说把日志、状态、聊天、这些名字改成自己想要的名字怎么办?。给functions添加如下代码,代码的意思就是:如果是图像,就显示茜茜相册、如果是引语就显示影视作品、如果是视频就显示亦菲视频。(前者是类型中文名称,后者是要改的名称)

  1. function rename_post_formats( $safe_text ) {
  2. if ( $safe_text == ‘图像’ )
  3. return ‘茜茜相册’;
  4. if ( $safe_text == ‘引语’ )
  5. return ‘影视作品’;
  6. if ( $safe_text == ‘视频’ )
  7. return ‘亦菲视频’;
  8. return $safe_text;
  9. }
  10. add_filter( ‘esc_html’, ‘rename_post_formats’ );

wordpress文章发表编辑界面增加自定义字段

wordpress开发实用技巧
网站肯定或多或少都要用到自定义字段来丰富网站的内容和展现方式。如果你要给你的文章增加自定义字段请参考如下代码。放在functions

  1. // Register the metabox
  2. function pinthis_add_quote_settings_box() {
  3. add_meta_box(‘pinthis_quote_settings_box’, __(‘影视专栏发表框’, ‘pbpanel’), ‘pinthis_show_quote_settings_box’, ‘post’, ‘normal’, ‘high’);
  4. }
  5. add_action(‘add_meta_boxes’, ‘pinthis_add_quote_settings_box’);
  6.  
  7. // Output the metabox
  8.  
  9. function pinthis_show_quote_settings_box($object) {
  10. wp_nonce_field(basename( __FILE__ ), ‘pinthis_quote_settings_box_nonce’); ?>
  11. <p>
  12. <label for=“quote_text”><?php echo __(‘填写影视的基本信息,注意hr分区’, ‘pbpanel’); ?>:<br /></label>
  13. <textarea class=“large-text” name=“quote_text” id=“quote_text” cols=“50” rows=“10”><?php echo esc_attr(get_post_meta($object->ID, ‘quote_text’, true)); ?></textarea>
  14. </p>
  15.  
  16. <p>
  17. <label for=”quote_text1″><?php echo __(‘填写影视的剧情简介’, ‘pbpanel’); ?><br /></label>
  18. <input type=“text” class=“large-text event-src-field” name=“quote_text1” id=“quote_text1” value=“<?php echo esc_attr(get_post_meta($object-/>ID, ‘quote_text1’, true)); ?>” placeholder=“<?php echo __(‘
  19. 影片简介’, ‘pbpanel’); ?>”>
  20. </p>
  21. <p>
  22. <label for=”quote_yun”><?php echo __(‘百度云网盘地址’, ‘pbpanel’); ?><br /></label>
  23. <input type=“text” class=“large-text event-src-field” name=“quote_yun” id=“quote_yun” value=“<?php echo esc_attr(get_post_meta($object-/>ID, ‘quote_yun’, true)); ?>” placeholder=“<?php echo __(‘
  24. 网盘地址’, ‘pbpanel’); ?>”>
  25. </p>
  26. <p>
  27. <label for=”quote_bili”><?php echo __(‘bilibili在线观看’, ‘pbpanel’); ?><br /></label>
  28. <input type=“text” class=“large-text event-src-field” name=“quote_bili” id=“quote_bili” value=“<?php echo esc_attr(get_post_meta($object-/>ID, ‘quote_bili’, true)); ?>” placeholder=“<?php echo __(‘
  29. B站地址’, ‘pbpanel’); ?>”>
  30. </p>
  31. <p>
  32. <label for=”quote_baike”><?php echo __(‘百科地址’, ‘pbpanel’); ?><br /></label>
  33. <input type=“text” class=“large-text event-src-field” name=“quote_baike” id=“quote_baike” value=“<?php echo esc_attr(get_post_meta($object-/>ID, ‘quote_baike’, true)); ?>” placeholder=“<?php echo __(‘
  34. 百科地址’, ‘pbpanel’); ?>”>
  35. </p>
  36. <p>
  37. <label for=”quote_npc”><?php echo __(‘饰演角色名称’, ‘pbpanel’); ?><br /></label>
  38. <input type=“text” class=“large-text event-src-field” name=“quote_npc” id=“quote_baike” value=“<?php echo esc_attr(get_post_meta($object-/>ID, ‘quote_npc’, true)); ?>” placeholder=“<?php echo __(‘
  39. 角色名称’, ‘pbpanel’); ?>”>
  40. </p>
  41. <p>
  42. <label for=”quote_author”><?php echo __(‘Quote Author’, ‘pbpanel’); ?>:<br /></label>
  43. <input type=“text” class=“large-text” name=“quote_author” id=“quote_author” value=“<?php echo esc_attr(get_post_meta($object-/>ID, ‘quote_author’, true)); ?>”>
  44. </p>
  45. <?php
  46. }
  47.  
  48. // Save the metabox values
  49. function pinthis_save_quote_settings_box($post_id) {
  50. // Verify the nonce. If insn’t there, stop the script
  51. if (!isset($_POST[‘pinthis_quote_settings_box_nonce’]) || !wp_verify_nonce($_POST[‘pinthis_quote_settings_box_nonce’], basename( __FILE__ ))) return;
  52.  
  53. // Stop the script if the user does not have edit permissions
  54. if (!current_user_can(‘edit_post’)) return;
  55.  
  56. // Data
  57. foreach ($_POST as $key => $value) {
  58. $exist_value = get_post_meta($post_id, $key, true);
  59. if ($value && $exist_value == ) {
  60. add_post_meta($post_id, $key, $value, true);
  61. }
  62. elseif ($value && $value != $exist_value) {
  63. update_post_meta($post_id, $key, $value, $exist_value);
  64. }
  65. elseif ($value == && $exist_value) {
  66. delete_post_meta($post_id, $key, $exist_value);
  67. }
  68. }
  69. }
  70. add_action(‘save_post’, ‘pinthis_save_quote_settings_box’);

假如我要前台显示“角色名称”这个自定义字段。那么输出<?php echo get_post_meta($post->ID, ‘quote_npc’, true) ?>

wordpress后台登陆错误,登陆成功。自动邮件提醒

wordpress的安全要重多方面去做,邮件提醒是个双刃剑。如果遇到对方暴力猜测密码那么邮箱可能会爆满。好处在于可能被攻击的时候能追踪到对方IP方便拉黑。该功能需要配置SMTP邮箱才能使用,如何配置SMTP邮箱请在网下翻

  1. /*****************************************************
  2. 函数名称:wp_login_notify
  3. 函数作用:有登录wp后台就会email通知博主
  4. ******************************************************/
  5. function wp_login_notify()
  6. {
  7. date_default_timezone_set(‘PRC’);
  8. $admin_email = get_bloginfo (‘admin_email’);
  9. $to = $admin_email;
  10. $subject = ‘你的博客空间登录提醒’;
  11. $message = ‘<p>你好!你的博客空间(‘ . get_option(“blogname”) . ‘)有登录!</p>’ .
  12. ‘<p>请确定是您自己的登录,以防别人攻击!登录信息如下:</p>’ .
  13. ‘<p>登录名:’ . $_POST[‘log’] . ‘</p><p>’ .
  14. ‘</p><p>登录密码:’ . $_POST[‘pwd’] . ‘</p><p>’ .
  15. ‘</p><p>登录时间:’ . date(“Y-m-d H:i:s”) . ‘</p><p>’ .
  16. ‘</p><p>登录IP:’ . $_SERVER[‘REMOTE_ADDR’] . ‘</p><p>’;
  17. $wp_email = ‘no-reply@’ . preg_replace(‘#^www\.#’, , strtolower($_SERVER[‘SERVER_NAME’]));
  18. $from = “From: \”” . get_option(‘blogname’) . “\” < $wp_email>”;
  19. $headers = “$from\nContent-Type: text/html; charset=” . get_option(‘blog_charset’) . “\n”;
  20. wp_mail( $to, $subject, $message, $headers );
  21. }
  22.  
  23. add_action(‘wp_login’, ‘wp_login_notify’);</p>
  1. /*****************************************************
  2. 函数名称:wp_login_failed_notify v1.0 by DH.huahua.
  3. 函数作用:有错误登录wp后台就会email通知博主
  4. ******************************************************/
  5. function wp_login_failed_notify()
  6. {
  7. date_default_timezone_set(‘PRC’);
  8. $admin_email = get_bloginfo (‘admin_email’);
  9. $to = $admin_email;
  10. $subject = ‘你的博客空间登录错误警告’;
  11. $message = ‘<p>你好!你的博客空间(‘ . get_option(“blogname”) . ‘)有登录错误!</p>’ .
  12. ‘<p>请确定是您自己的登录失误,以防别人攻击!登录信息如下:</p>’ .
  13. ‘<p>登录名:’ . $_POST[‘log’] . ‘</p><p>’ .
  14. ‘</p><p>登录密码:’ . $_POST[‘pwd’] . ‘</p><p>’ .
  15. ‘</p><p>登录时间:’ . date(“Y-m-d H:i:s”) . ‘</p><p>’ .
  16. ‘</p><p>登录IP:’ . $_SERVER[‘REMOTE_ADDR’] . ‘</p><p>’;
  17. $wp_email = ‘no-reply@’ . preg_replace(‘#^www\.#’, , strtolower($_SERVER[‘SERVER_NAME’]));
  18. $from = “From: \”” . get_option(‘blogname’) . “\” < $wp_email>”;
  19. $headers = “$from\nContent-Type: text/html; charset=” . get_option(‘blog_charset’) . “\n”;
  20. wp_mail( $to, $subject, $message, $headers );
  21. }
  22. add_action(‘wp_login_failed’, ‘wp_login_failed_notify’);
  23. </p>

wordpress后台地址加密,和增设额外的一道安全码

给自己的后台加密还是比较有必要的,但是这个只能拦住菜鸟黑客。所以除了后台加密还建议设置多层密码。即便正常找到了网站后台真是地址,还需要一道安全码防线。需要值得一提的事,有些插件和主题存在后门的。最严重的是后门可能在我们登录后台的时候会自动把管理员账号密码和登录地址发送给指定邮箱或者网站。这个后门是有存在的,所以额外一道安全码能很大程度组织黑客成功入侵。

  1. //保护后台登录
  2. add_action(‘login_enqueue_scripts’,‘login_protection’);
  3. function login_protection(){
  4. if($_GET[‘word’] != ‘press’)
  5. header(‘Location: https://www.baidu.com/s?wd=%E5%88%98%E4%BA%A6%E8%8F%B2%E6%B0%B4%E6%99%B6%E4%B9%8B%E5%AE%B6&ie=UTF-8&tn=39042058_20_oem_dg’);/* 不用密码登录,直接滚到百度去 */
  6. }

真实的后台地址为:http://www.babylyf.com/wp-login?word=press 如果不是这个地址访问后台,都会自动跳到你设定网址上。

给后台额外加一道安全码验证,防止被后门捕获到账号密码后直接入侵后台

  1. //安全码验证:
  2. function bd_login_form()
  3. {
  4. ?>
  5. <p>
  6. <label for=“user_pass_2”>安全码登陆<br />
  7. <input type=“password” name=“pwd_2” id=“user_pass_2” value=“” size=“20” tabindex=“20” /></label>
  8. </p>
  9. <?
  10. }
  11. add_action(‘login_form’, ‘bd_login_form’);
  12. function bd_authenticate_username_password($user, $username = ”, $password = ”)
  13. {
  14. if ( isset($_POST[‘log’]) )
  15. {
  16. $bDone = false;
  17. if ( isset( $_REQUEST[‘pwd_2’] ) )
  18. {
  19. $pwd2 = $_REQUEST[‘pwd_2’];
  20. if ( $pwd2 === ‘babycrystalqew22’ ) // 自由修改认证码
  21. $bDone = true;
  22. }
  23. if ( $bDone == false )
  24. {
  25. remove_filter(‘authenticate’, ‘wp_authenticate_username_password’, 20, 3);
  26. $error = new WP_Error();
  27. $error->add(‘incorrect_password’, __(‘<strong>错误</strong>:身份认证失败。’));
  28. return $error;
  29. }
  30. }
  31. return $user;
  32. }
  33. add_filter(‘authenticate’, ‘bd_authenticate_username_password’);
  34.  

SMTP邮箱设置,让wordpress能正常收发邮件

虽然有插件能更方便配置,但是wordpress能少用插件尽量少用。需要值得一提的是QQ邮箱是办法配置的,因为腾讯增加了多重验证。推荐使用126邮箱来配置smtp邮箱

  1. //SMTP邮箱设置
  2. function googlo_mail_smtp($phpmailer) {
  3. $phpmailer->From = git_get_option(‘laoshiaaa@126.com’); //发件人地址
  4. $phpmailer->FromName = git_get_option(‘刘亦菲水晶之家b’); //发件人昵称
  5. $phpmailer->Host = git_get_option(‘smtp.126.com’); //SMTP服务器地址
  6. $phpmailer->Port = git_get_option(’25’); //SMTP邮件发送端口
  7. if (git_get_option(‘git_smtpssl_b’)) {
  8. $phpmailer->SMTPSecure = ‘ssl’;
  9. }else{
  10. $phpmailer->SMTPSecure = ;
  11. }//SMTP加密方式(SSL/TLS)没有为空即可
  12. $phpmailer->Username = git_get_option(‘laoshiaaa@126.com’); //邮箱帐号
  13. $phpmailer->Password = git_get_option(‘邮箱密码’); //邮箱密码
  14. $phpmailer->IsSMTP();
  15. $phpmailer->SMTPAuth = true; //启用SMTPAuth服务
  16.  
  17. }

wordpress检测当前页面百度是否收录

对于新上线网站总会去查询网页收录了多少,哪些还没收录。这个功能实用性极佳。打开文章直接显示网页是否被百度收录,没有收录可以直接点击提交给百度。

  1. //百度收录提示
  2. if(git_get_option(‘git_baidurecord_b’) && function_exists(‘curl_init’)):
  3. function baidu_check($url) {
  4. global $wpdb;
  5. $post_id = (null === $post_id) ? get_the_ID() : $post_id;
  6. $baidu_record = get_post_meta($post_id, ‘baidu_record’, true);
  7. if ($baidu_record != 1) {
  8. $url = ‘http://www.baidu.com/s?wd=’ . $url;
  9. $curl = curl_init();
  10. curl_setopt($curl, CURLOPT_URL, $url);
  11. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  12. $rs = curl_exec($curl);
  13. curl_close($curl);
  14. if (!strpos($rs, ‘没有找到’)) {
  15. if ($baidu_record == 0) {
  16. update_post_meta($post_id, ‘baidu_record’, 1);
  17. } else {
  18. add_post_meta($post_id, ‘baidu_record’, 1, true);
  19. }
  20. return 1;
  21. } else {
  22. if ($baidu_record == false) {
  23. add_post_meta($post_id, ‘baidu_record’, 0, true);
  24. }
  25. return 0;
  26. }
  27. } else {
  28. return 1;
  29. }
  30. }
  31. function baidu_record() {
  32. if (baidu_check(get_permalink()) == 1) {
  33. echo ‘<a title=”点击查看” href=”https://www.baidu.com/s?wd=’ . get_the_title() . ‘” target=”_blank” rel=”external nofollow”>已收录</a>’;
  34. } else {
  35. echo ‘<a style=”color: red;” title=”点击提交,谢谢您!” href=”http://zhanzhang.baidu.com/sitesubmit/index?sitename=’ . get_permalink() . ‘” target=”_blank” rel=”external nofollow”>未收录</a>’;
  36. }
  37. }
  38. endif;

上面的函数式放在functions文件中,然后在文章内容页面适合地方加入下方这段代码

  1. <?php
  2. if (git_get_option(‘git_baidurecord_b’) && function_exists(‘curl_init’)) { ?><span class=“muted”><i class=“fa fa-flag”></i> <?php
  3. baidu_record(); ?></span>

首页中不显示某些分类的文章

使用wordpress博客模式,如果不想要某个分类的文章在首页中出现,可以在主题functions进行屏蔽

  1. //在首页中排除某些分类
  2. function exclude_category_home( $query ) {
  3. if ( $query->is_home ) {
  4. $query->set( ‘cat’, ‘-000, -222’ ); //你要排除的分类ID
  5. }
  6. return $query;
  7. }
  8. add_filter( ‘pre_get_posts’, ‘exclude_category_home’ );

wordpress不同的分类使用不同的模板

  1. wordpressCMS资讯站必然要指定分类模板不尽相同,比如视频文章分类要做视频的分类模板,相册文章分类要做相册的分类模板。其实这个功能极为简单就可以实现。
  2. 假如分类ID:529是相册,分类d:530是视频。
  3. 那么在主题目录下创建category529.phpcategory530.php两个文件wordpress会提前检测。
  4. 如果当前访问相册分类,检测到category529.php文件会优先读取,如果不存在则读取默认模板。

wordpress不同的分类下的文章,使用模板也不同

前面我们说了wordpress不同分类使用不同的模板,那么视频分类的文章页面和相册分类的文章页面要如何使用不同的分类呢。
打开当前主题的single.<?php文件,内容全部清空。用以下代码替换。然后自己根据清空去修改。

  1. <?php
  2. if ( in_category(array( 1,528,525 )) ) {
  3. get_template_part(‘single001’ );//分类id为1.528.525的文章,使用single001.<?php模板
  4. } elseif ( in_category( 803 )) {
  5. get_template_part(‘single002’ );//分类ID为803的文章,使用single002.<?php模板
  6. } elseif( in_category (( 889 )) ) {
  7. get_template_part(‘single004’ );//分类ID为889的文章,使用single004.<?php模板
  8. } else {
  9. get_template_part(‘single003’ );//除了上面的分类,全部使用single003.<?php模板
  10. }
  11. ?>

wordpress使用多个头部header和底部footer

可能我们首页要底部要调用有友情链接,可又不希望友情链接部分在首页之外地方显示。又或者我们独立页面头部和网站的头部要有所区别。实现这个功能也是异常简单

  1. 默认的头部文件是主题目录下的header.php 调用代码是<?php get_header(); ?>
  2. 创建第二个头部模板命名为header1.php 调用代码是<?php get_header(1); ?>
  3. —只要放入不同的调用代码,那么模板就会自动读取你设定的那一个。底部也是一样

wordpress首页或分类,输出文章内的多张图片(参考本站相册分类)

wordpress开发实用技巧
对于图片类网站,这个功能可谓极为实用的。整体美观度大大提高。这个功能很早就有人实现,可是读取的是文章原图。因为是分类和首页,调用很多原图会导致用户消耗大量流量及时间去加载非常不实用。现在这个问题我们得到了很完美的解决,依赖timthumb来获取所有缩略图。请使用了上面介绍的timthumb获取缩略图功能后在使用下方函数

  1. <?php
  2. $args = array(
  3. ‘post_type’ => ‘attachment’,
  4. ‘numberposts’ => 3,//读取文章图片数量
  5. ‘post_status’ => null,
  6. ‘post_parent’ => $post->ID,
  7. ‘post_mime_type’ => ‘image’,
  8. ‘order’ => ‘ASC’,
  9. ‘orderby’ => ‘menu_order’,
  10. ‘exclude’ => array (get_post_thumbnail_id())
  11. );
  12. $attachments = get_children( $args );
  13. if ( $attachments ) {
  14. foreach($attachments as $v){
  15. echo ‘<img class=”QQ” style=”width:127px;height:115px” src=”‘ . get_template_directory_uri() . ‘/timthumb.php?src=’;
  16. echo ‘&h=150&w=200&q=90&zc=1&ct=1″ alt=”‘ . get_the_title() . ‘” />’;
  17. }
  18. }?>
  19. //</pre/>

wordpress[首页.搜索.标签]根据文章所属分类。使用不同的模板展来展现。(参考本站搜索)

wordpress开发实用技巧
首页和搜索都是调用网站所有分类的内容,默认是一个模板展现出来的。如果我们为了更美观,视频分类和相册分类采用不同的模板展现出来可能会更好些。实现这个效果其实很简单的
在准备文章内容输出的地方,加入下方函数作为一个判断。模板根据情况去改

  1. <?php
  2. if ( in_category(array( 1,528,525 )) ) {
  3. get_template_part(‘list-video’ );//如果文章分类ID是1,528,525那么输出list-video.<?php文件。
  4. } elseif ( in_category( 889 )) {
  5. get_template_part(‘list-news’ );//如果文章分类ID是889那么输出list-news.<?php文件
  6. } else {
  7. get_template_part(‘list-photo’ );//除以上分类输出ist-photo文件
  8. }
  9. ?>

wordpress实现无线下拉刷新数据

wordpress开发实用技巧
最近在用Framework7框架做一个webAPP,与其说是做APP其实就是在Framework7框架下作一个wordpress的主题。既然是面对移动手机用户使用那么数据展现肯定是以下拉刷新最实用,摸索了很久看了不少文章终于花了一上午做出来了,思路是取自官方主题模板。其实看着复杂其实很简单,下面三个步骤就可以实现无限加载效果。
1.首先下载 jquery-ias.min.js到对应主题的JS文件夹:
2.将以下代码加入到对应主题的functions.PHP中前面 ?>

  1. //这是无限加载用到的,页面分页
  2. if ( ! function_exists( twentytwelve_content_nav ) ) :
  3. /**
  4. * Displays navigation to next/previous pages when applicable.
  5. *
  6. * @since Twenty Twelve 1.0
  7. */
  8. function twentytwelve_content_nav( $html_id ) {
  9. global $wp_query;
  10.  
  11. if ( $wp_query->max_num_pages > 1 ) : ?>
  12. <nav id=”<?php echo esc_attr( $html_id ); ?>” class=”navigation role=”navigation”>
  13. <h3 class=”assistivetext”><?php _e( Post navigation’, twentytwelve ); ?></h3>
  14. <div class=”navprevious”><?php next_posts_link( __( ‘<span class=”metanav”>←</span> Older posts’, twentytwelve ) ); ?></div>
  15. <div class=”navnext”><?php previous_posts_link( __( Newer posts <span class=”metanav”>→</span>’, twentytwelve ) ); ?></div>
  16. </nav>< !– .navigation –>
  17. <?php endif;
  18. }
  19. endif;

3.将主题index.php备份,然后用下面代码替换。打开你的首页就可以看到效果了

  1. < !–使用本页代码之前需要做两件事
  2. 1.下载一个jquery-ias.min.js放到指定目录
  3. 2.functions.PHP中加一段分页代码。两者缺一不可
  4. 刘亦菲水晶之家:www.babylyf.com–>
  5. < !– #无限加载需要的两个js–>
  6. <script type=”text/javascript” src=”http://libs.baidu.com/jquery/1.11.1/jquery.js”></script>
  7. <script src=”<?php%20echo%20get_template_directory_uri();%20?>/js/jqueryias.min.js type=”text/javascript”></script>
  8. <script type=”text/javascript”>
  9. var ias = $.ias({
  10. container: “#content”, //包含所有文章的元素
  11. item: “.post”, //文章元素
  12. pagination: “.navigation”, //分页元素
  13. next: “.navprevious a”, //下一页元素
  14. });
  15.  
  16. ias.extension(new IASTriggerExtension({
  17. text: ‘点击加载更多的内容’, //此选项为需要点击时的文字
  18. offset: 2, //设置此项后,到 offset+1 页之后需要手动点击才能加载,取消此项则一直为无限加载
  19. }));
  20. ias.extension(new IASSpinnerExtension());
  21. ias.extension(new IASNoneLeftExtension({
  22. text: You reached the end.’, // 加载完成时的提示
  23. }));
  24. </script>
  25.  
  26. <div id=”content”>< !– 包含所有文章的元素–>
  27. <?php if ( have_posts() ) : ?><?php while ( have_posts() ) : the_post(); ?> < !–读取数据的–>
  28.  
  29. <article id=”post”<?php post_class(); ?>
  30. < !– # article里面的表单时需要无线加载的数据–>
  31. < !–这里是无限加载数据开始–>
  32. <?php the_title(); ?>发表时间:<?php the_time(‘Ynj日’) ?>
  33. < !–这里是无限加载内容结束–>
  34. </article>
  35. <?php endwhile; ?>
  36. <?php twentytwelve_content_nav( navbelow ); ?>< !–下一页元素–>
  37. <?php else : ?>
  38. <?php endif; // end have_posts() check ?>
  39.  
  40. </div>

wordpress 不用插件使用CDN加速的办法

现在越来越多人使用CDN来缓存自己网站的图片视频数据了,所谓的CDN就是自己配置一个域名到提供CDN服务运营商,然后将镜像源设置为自己的网站。假如我配置的CDN加速域名为photo.babylyf.com
1.原来的一张图片地址是:http://www.babylyf.com/1.JPG 现在我可以使用:http://photo.babylyf.com/1.jpg访问
2.配置好CND加速以后,使用以下函数批量替换媒体库的路径。//http://photo.babylyf.com是你的CDN域名

  1. //将网站附件本地存储地址改为cdn加速地址
  2. function replace_text_wps($text){
  3. $replace = array(
  4. ‘/wp-content/uploads/’ => ‘https://photo.babylyf.com/wp-content/uploads/’,
  5. //http://photo.babylyf.com是你的CDN域名
  6. ‘function’ => ‘<a href=”#”>function</a>’
  7. );
  8. $text = str_replace(array_keys($replace), $replace, $text);
  9. return $text;
  10. }
  11. add_filter(‘the_content’, ‘replace_text_wps’);
  12. add_filter(‘the_excerpt’, ‘replace_text_wps’);

当我们使用CND域名请求访问的时候,会自动存储镜像网站的内容然后直接给用户展现。已经存储过的镜像文件不会再请求源站。大大减少网站原来服务器的压力。

wordpress统计大分类的文章数量

wordpress自带的分类统计函数只能统计小分类的文章数,如果想要获取大分类的文章数量只能通过自定义函数来实现了。以下函数放入function,调用代码<?php ludou_get_cat_postcount(分类ID); ?>

  1. 获取大分类文章总数。ludou_get_cat_postcount(530);
  2. function ludou_get_cat_postcount($id) {
  3. // 获取当前分类信息
  4. $cat = get_category($id);
  5. // 当前分类文章数
  6. $count = (int) $cat->count;
  7. // 获取当前分类所有子孙分类
  8. $tax_terms = get_terms(‘category’, array(‘child_of’ => $id));
  9. foreach ($tax_terms as $tax_term) {
  10. // 子孙分类文章数累加
  11. $count +=$tax_term->count;
  12. }
  13. return $count;
  14. }

wordpress自定义小代码

我们难免用到各种HTM代码,但是在文章发表界面直接输出htm代码不安全也不好用。可以试着自己创建短代码来解决这个问题。
//自定义段代码演示[bg][/bg]。创建完成以后可以直接在文章编辑页面使用该指令

  1. function warningbox($atts, $content=null, $code=“”) {
  2. $return = ‘<style type=”text/css”>
  3. .article-content{background: url(‘;//这里是开始的代码
  4. $return .= $content;//这里前台输出内容
  5. $return .= ‘);}
  6. .article-content p{color:#fff}
  7. </style>’;//这里是[/BG]结束的代码
  8. return $return;
  9. }
  10. add_shortcode(‘bg’ , ‘warningbox’ );

如果需要在前台编辑器显示这个按钮,可以继续添加如下。

  1. // 添加HTML按钮
  2. function appthemes_add_quicktags() {
  3. ?>
  4. <script type=“text/javascript”>
  5. QTags.addButton( ‘bg’, ‘文章图片’, “[bg]”,“[/bg]” );
  6. </script>
  7. <?php
  8. }
  9. add_action(‘admin_print_footer_scripts’, ‘appthemes_add_quicktags’ );

wordpress创建独立页面

网站友情链接,文章归档,专题页面之类都可以利用创建独立页面来解决。在当前主题目录创建一个pages文件夹,然后该目录创建1.php,内容如下

  1. <?php
  2. /*
  3. template name: 你的页面模板命名
  4. description: template for Git theme
  5. */
  6. get_header();//网站头部
  7. ?>
  8. <!–这里放你独立页面的内容–>
  9. <?php get_footer(); ?>//这是网站底部

创建完毕后,进入wordpress后台-新建页面。模板选择刚才创建的即可

刘亦菲水晶之家正在使用的插件

a3 Lazy Load:
这个 jQuery 插件,是用来缓冲加载图片的插件。如果一篇文章很长有很多图片的话,下载图片就需要很多时间。而这款插件,会检测你的滚动情况,只有你要看到那个图片的时候,它才会从后台请求下载图片,然后显示出来。使用这个插件,可以在需要显示图片的时候,才下载图片,所以可以减少服务器的压力,避免不必要的资源下载。如果一个人不看下面的图片,那加载下面的图片就是一种浪费。
Any Mobile Theme Switcher:
是一款可以让使用者指定各种不同的移动设备使用不同的主题其中有iPhone、iPad、iPod、Android、Blackberry、Windows Phone、Opera Mini、Parm OS等多总不同的设备,让不同的手机访问网站可以有不一样的呈现效果。如果你的网站主题不是响应式或者你想要设计独立的移动主题来应对手机端用户,那么请务必要安装。
Google XML Sitemaps:
Google XML Sitemaps 是一个使用非常广泛的XML网站地图插件,通过它,你可以很轻松为你的 WordPress 博客生成 Sitemap,方便搜索引擎抓取你博客的文章,同时这也wordpress是近乎必装了一款插件。谷歌的友好度简直报表能深入引导谷歌一直检测你网站的变动。同时你也可以像百度提交这个地图,它是能识别的。
Multiple Themes:
这款插件可以实现 不同文章、页面、分类等等使用不同的主题,这个功能也许很少人用的到吧。但是刘亦菲水晶之家目前是离不开的。因为网站初期采用的是pinthis主题做了大量的改动,后来换到了现在的主题,但是搜索和标签一直没去优化。只能暂且用插件两双边切换。
QQOQ登录插件:QQOQ登录插件是一个快捷简洁的用户登录插件,网站绑定了QQ互联API之后。用户可以直接使用QQ登录网站。功能简单但是极为实用。没有太多繁琐的功能,只要登录就好啦
畅言评论系统:
畅言是一个简单而强大的社会化评论及聚合平台。用户可以直接用自己的社会化网络账户在第三方网站发表评论,并且一键评论同步至社交网络将网站内容和自己的评论分享给好友。增加第三方网站用户活跃度,调动好友参与评论,帮助网站实现社会化网络优化,有效提升网站社会化流量!

网站自由使用各种小图标,调用font-awesome图标库

wordpress开发实用技巧
网站是引用了font-awesome图标库,所以能随意使用它所提供的几百个百个图标。如何使用这个图标库呢?下面

  1. 1.在当前网站主题header.<?php引用它的CSS。比如360公共库CND加速所提供的fontawesome4.7版本
  2. <link href=“//lib.baomitu.com/font-awesome/4.7.0/css/font-awesome.min.css” rel=“stylesheet”/>
  3. 2.打开http://fontawesome.io/icons/官方网站,点击自己需要的图标样式。
  4. 比如这个<i class=“fa fa-id-card”></i>复制它,粘贴到需要显示的地方即可

wordpress文章发表自动推送给百度

wordpress开发实用技巧
只要发表了文章,就会主动推送给百度搜索引擎告知百度我的网站有新内容快来抓取,也是最为快速的提交方式。token值请登录百度站长工具获取,详情看上方图片

  1. //百度主动推送
  2. if(!function_exists(‘Baidu_Submit’)){
  3. function Baidu_Submit($post_ID) {
  4. $WEB_TOKEN = ‘xxxxxxxxxxx’; //这里请换成你的网站的百度主动推送的token值
  5. $WEB_DOMAIN = get_option(‘home’);
  6. //已成功推送的文章不再推送
  7. if(get_post_meta($post_ID,‘Baidusubmit’,true) == 1) return;
  8. $url = get_permalink($post_ID);
  9. $api = ‘http://data.zz.baidu.com/urls?site=’.$WEB_DOMAIN.‘&token=’.$WEB_TOKEN;
  10. $request = new WP_Http;
  11. $result = $request->request( $api , array( ‘method’ => ‘POST’, ‘body’ => $url , ‘headers’ => ‘Content-Type: text/plain’) );
  12. $result = json_decode($result[‘body’],true);
  13. //如果推送成功则在文章新增自定义栏目Baidusubmit,值为1
  14. if (array_key_exists(‘success’,$result)) {
  15. add_post_meta($post_ID, ‘Baidusubmit’, 1, true);
  16. }
  17. }
  18. add_action(‘publish_post’, ‘Baidu_Submit’, 0);
  19. }

判断对方是安卓还是苹果根据反馈加载不同的CSS样式表

众所皆知安卓和苹果存在或多或少的兼容难题,如果你的主题有这方面的困扰可以尝试使用两套CSS来应对问题。

  1. <script>
  2. var addStyleLink = function(href){
  3. var head = document.getElementsByTagName(‘head’)[0];
  4. var styleLink = document.createElement(‘link’);
  5. styleLink.setAttribute(‘rel’,‘stylesheet’);
  6. styleLink.setAttribute(‘href’,href);
  7. head.appendChild(styleLink);
  8. }
  9. // 苹果手机采用CSS1
  10. if(/iphone/i.test(navigator.userAgent))
  11. addStyleLink(‘http://www.babylyf.com/wp-content/themes/crystal/css/qwe.css’);
  12. // 安卓手机采用CSS2
  13. if(/android/i.test(navigator.userAgent))
  14. addStyleLink(‘http://www.babylyf.com/wp-content/themes/crystal/css/framework7.ios.min.css’);
  15. </script>

wordpress搜索只限于文章标题

如果想让 WordPress 自带的搜索功能只搜索文章标题,让搜索结果更加精确也为了加快搜索查询。(其实WordPress 自带的搜索功能本来模糊查找就很弱),可以将下面的代码添加到当前主题functions.

  1. function __search_by_title_only( $search, &$wp_query )
  2. {
  3. global $wpdb;
  4. if ( empty( $search ) )
  5. return $search; // skip processing – no search term in query
  6. $q = $wp_query->query_vars;
  7. $n = ! empty( $q[‘exact’] ) ? : ‘%’;
  8. $search =
  9. $searchand = ;
  10. foreach ( (array) $q[‘search_terms’] as $term ) {
  11. $term = esc_sql( like_escape( $term ) );
  12. $search .= “{$searchand}($wpdb->posts.post_title LIKE ‘{$n}{$term}{$n}’)”;
  13. $searchand = ‘ AND ‘;
  14. }
  15. if ( ! empty( $search ) ) {
  16. $search = ” AND ({$search}) “;
  17. if ( ! is_user_logged_in() )
  18. $search .= ” AND ($wpdb->posts.post_password = ”) “;
  19. }
  20. return $search;
  21. }
  22. add_filter( ‘posts_search’, ‘__search_by_title_only’, 500, 2 );

wordpress伪静态后去掉分类目录链接中category标志

wordpress使用伪静态之后,访问网站分类会多一个category的目录。有些人强迫症可能就不喜欢了,解决办法可以修改wordpress系统文件或者插件来实现。但都不是很方便,下面这段函数放入functions就能轻松解决该问题。

  1. add_action( ‘load-themes.php’, ‘no_category_base_refresh_rules’);
  2. add_action(‘created_category’, ‘no_category_base_refresh_rules’);
  3. add_action(‘edited_category’, ‘no_category_base_refresh_rules’);
  4. add_action(‘delete_category’, ‘no_category_base_refresh_rules’);
  5. function no_category_base_refresh_rules() {
  6. global $wp_rewrite;
  7. $wp_rewrite -> flush_rules();
  8. }
  9. // register_deactivation_hook(__FILE__, ‘no_category_base_deactivate’);
  10. // function no_category_base_deactivate() {
  11. // remove_filter(‘category_rewrite_rules’, ‘no_category_base_rewrite_rules’);
  12. // // We don’t want to insert our custom rules again
  13. // no_category_base_refresh_rules();
  14. // }
  15. // Remove category base
  16. add_action(‘init’, ‘no_category_base_permastruct’);
  17. function no_category_base_permastruct() {
  18. global $wp_rewrite, $wp_version;
  19. if (version_compare($wp_version, ‘3.4’, ‘< ‘)) {
  20. // For pre-3.4 support
  21. $wp_rewrite -> extra_permastructs[‘category’][0] = ‘%category%’;
  22. } else {
  23. $wp_rewrite -> extra_permastructs[‘category’][‘struct’] = ‘%category%’;
  24. }
  25. }
  26. // Add our custom category rewrite rules
  27. add_filter(‘category_rewrite_rules’, ‘no_category_base_rewrite_rules’);
  28. function no_category_base_rewrite_rules($category_rewrite) {
  29. //var_dump($category_rewrite); // For Debugging
  30. $category_rewrite = array();
  31. $categories = get_categories(array(‘hide_empty’ => false));
  32. foreach ($categories as $category) {
  33. $category_nicename = $category -> slug;
  34. if ($category -> parent == $category -> cat_ID)// recursive recursion
  35. $category -> parent = 0;
  36. elseif ($category -> parent != 0)
  37. $category_nicename = get_category_parents($category -> parent, false, ‘/’, true) . $category_nicename;
  38. $category_rewrite[‘(‘ . $category_nicename . ‘)/(?:feed/)?(feed|rdf|rss|rss2|atom)/?$’] = ‘index.php?category_name=$matches[1]&feed=$matches[2]’;
  39. $category_rewrite[‘(‘ . $category_nicename . ‘)/page/?([0-9]{1,})/?$’] = ‘index.php?category_name=$matches[1]&paged=$matches[2]’;
  40. $category_rewrite[‘(‘ . $category_nicename . ‘)/?$’] = ‘index.php?category_name=$matches[1]’;
  41. }
  42. // Redirect support from Old Category Base
  43. global $wp_rewrite;
  44. $old_category_base = get_option(‘category_base’) ? get_option(‘category_base’) : ‘category’;
  45. $old_category_base = trim($old_category_base, ‘/’);
  46. $category_rewrite[$old_category_base . ‘/(.*)$’] = ‘index.php?category_redirect=$matches[1]’;
  47. //var_dump($category_rewrite); // For Debugging
  48. return $category_rewrite;
  49. }
  50. // Add ‘category_redirect’ query variable
  51. add_filter(‘query_vars’, ‘no_category_base_query_vars’);
  52. function no_category_base_query_vars($public_query_vars) {
  53. $public_query_vars[] = ‘category_redirect’;
  54. return $public_query_vars;
  55. }
  56. // Redirect if ‘category_redirect’ is set
  57. add_filter(‘request’, ‘no_category_base_request’);
  58. function no_category_base_request($query_vars) {
  59. //print_r($query_vars); // For Debugging
  60. if (isset($query_vars[‘category_redirect’])) {
  61. $catlink = trailingslashit(get_option(‘home’)) . user_trailingslashit($query_vars[‘category_redirect’], ‘category’);
  62. status_header(301);
  63. header(“Location: $catlink”);
  64. exit();
  65. }
  66. return $query_vars;
  67. }

wordpress增加网站统计信息

如果你网站需要显示统计信息,可以在适宜的地方加入下方的代码。

  1. 文章:<?php $count_posts = wp_count_posts(); echo $published_posts = $count_posts->publish; ?>
  2. 页面:<?php $count_pages = wp_count_posts(‘page’); echo $page_posts = $count_pages->publish; ?>
  3. 草稿:<?php $count_posts = wp_count_posts(); echo $draft_posts = $count_posts->draft; ?>
  4. 分类:<?php echo $count_categories = wp_count_terms(‘category’); ?>
  5. 分类文章:<?php echo get_category(cat_ID)->count; ?>//cat_ID为你需要统计的分类
  6. 标签:<?php echo $count_tags = wp_count_terms(‘post_tag’); ?>
  7. 会员:<?php $users = $wpdb->get_var(“SELECT COUNT(ID) FROM $wpdb->users”); echo $users; ?>
  8. 链接:<?php $link = $wpdb->get_var(“SELECT COUNT(*) FROM $wpdb->links WHERE link_visible = ‘Y'”); echo $link; ?>
  9. 评论:<?php $total_comments = get_comment_count(); echo $total_comments[‘approved’];?>
  10. 浏览:<?php get_totalviews(); ?> //需要你安装PostViews插件,如果没装不要用
  11. 运行:<?php echo floor((time()-strtotime(“2010-04-02”))/86400);?>天
  12. 更新:<?php $last = $wpdb->get_results(“SELECT MAX(post_modified) AS MAX_m FROM $wpdb->posts WHERE (post_type = ‘post’ OR post_type = ‘page’) AND (post_status = ‘publish’ OR post_status = ‘private’)”);$last = date(‘Y年n月j日’, strtotime($last[0]->MAX_m));echo $last; ?>

如果你要显示当前页面加载时间和查询数据库的请求次数。请在function加入这段

  1. //显示页面查询次数、加载时间和内存占用 From mfbuoluo.com
  2. function performance( $visible = false ) {
  3. $stat = sprintf( ‘%d queries in %.3f seconds, using %.2fMB memory’,
  4. get_num_queries(),
  5. timer_stop( 0, 3 ),
  6. memory_get_peak_usage() / 1024 / 1024
  7. );
  8. echo $visible ? $stat : “<!– {$stat} –>” ;
  9. }

在需要的页面调用下方这段

  1.  
  2. <?php timer_stop(1); ?> 秒内总共 <?php echo get_num_queries(); ?> 次查询

wordpress评论禁止纯英文和日语的评论

对于wordpress垃圾评论相信很多人都深恶痛绝,尤其是被某些国外IP盯上无休止发广告链接。下面这段函数放入function可以杜绝纯英文日文的评论

  1. //屏蔽纯英文评论和纯日文
  2. function refused_english_comments($incoming_comment) {
  3. $pattern = ‘/[一-龥]/u’;
  4. // 禁止全英文评论
  5. if(!preg_match($pattern, $incoming_comment[‘comment_content’])) {
  6. wp_die( “您的评论中必须包含汉字!” );
  7. }
  8. $pattern = ‘/[あ-んア-ン]/u’;
  9. // 禁止日文评论
  10. if(preg_match($pattern, $incoming_comment[‘comment_content’])) {
  11. wp_die( “评论禁止包含日文!” );
  12. }
  13. return( $incoming_comment );
  14. }
  15. add_filter(‘preprocess_comment’, ‘refused_english_comments’);

wordpress自定义新用户注册欢迎邮件

wordpress开发实用技巧
每当wordpress有新用户注册,系统会发送一封邮件给用户。如果你要自定义这封邮件的内容可以通过创建一个自定义小插件来实现。
1.创建一个wpdx-new-user-notification.php文件到plugins插件根目录
2.wpdx-new-user-notification.php放入下面的代码,根据自己情况修改内容。
3.到wordpress后台启用该插件即可。邮件需要你开启了smtp服务

  1. <?php
  2. /* Plugin Name: WPDX New User Notification
  3. Description:重新定义新用户注册邮件
  4. Version: 1.0 */
  5. if ( !function_exists(‘wp_new_user_notification’) ) {
  6. function wp_new_user_notification( $user_id, $plaintext_pass = ) {
  7. $user = new WP_User($user_id);
  8. //获取用户名和邮箱
  9. $user_login = stripslashes($user->user_login);
  10. $user_email = stripslashes($user->user_email);
  11. //获取管理员邮箱和博客名称
  12. $admin_email = stripslashes(get_option(‘admin_email’));
  13. $blog_name = wp_specialchars_decode(get_option(‘blogname’), ENT_QUOTES);
  14. //自定义管理员邮件
  15. $headers = ‘From: ‘.$blog_name.‘ < ‘.$admin_email.‘>’;
  16. $headers .= ‘MIME-Version: 1.0’;
  17. $headers .= ‘Content-type: text/html; charset=uft-8’;
  18. $headers .= ‘Content-Transfer-Encoding: 8bit’;
  19. $message = ‘<html><head><meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/></head><body><div>’;
  20. $message .= ‘<p>’.sprintf(__(‘你的网站[%s] 有新用户注册:’), $blog_name ) . ‘</p>’;
  21. $message .= ‘<p>’.sprintf(__(‘Username: %s’), $user_login) . ‘</p>’;
  22. $message .= ‘<p>’.sprintf(__(‘E-mail: %s’), $user_email) . ‘</p></div></body></html>’;
  23. @wp_mail($admin_email, sprintf(__(‘[%s] New User Registration’), $blog_name), $message, $headers);
  24. //判断新用户密码是否为空
  25. if ( empty($plaintext_pass) )
  26. //自定义新用户欢迎邮件
  27. $headers .= ‘MIME-Version: 1.0’;
  28. $headers .= ‘Content-type: text/html; charset=uft-8’;
  29. $headers .= ‘Content-Transfer-Encoding: 8bit’;
  30. $message = ‘<html><head><meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″/></head><body><div>’;
  31. $message .= ‘<div style=”background-color:#ECECEC; padding: 35px;”>
  32. <table cellpadding=”0″ align=”center” style=”width: 600px; margin: 0px auto; text-align: left; position: relative; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; font-size: 14px; font-family:微软雅黑, 黑体; line-height: 1.5; box-shadow: rgb(153, 153, 153) 0px 0px 5px; border-collapse: collapse; background-position: initial initial; background-repeat: initial initial;background:#fff;”>
  33. <tbody><tr>
  34. <th valign=”middle” style=”height: 25px; line-height: 25px; padding: 15px 35px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #C46200; background-color: #FEA138; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;”>
  35. <font face=”微软雅黑” size=”5″ style=”color: rgb(255, 255, 255); “>[水晶之家]存储你的微笑,收藏我的回忆</font>
  36. </th></tr><tr><td>
  37. <div style=”padding:25px 35px 40px; background-color:#fff;”>
  38. <h2 style=”margin: 5px 0px; “><font color=”#333333” style=”line-height: 20px; “></font><font style=”line-height: 22px; ” size=”4″>’; $message .= ‘<p>’.__(‘亲爱的:’) .$user_login. ‘</p>’; $message .= ‘</font></h2>
  39. <p>恭喜你注册成功!这个平台是为了方便大家查阅检索亦菲照片和视频而筹建的,发言时要遵守法律法规哦!
  40. 亦菲QQ群:21463917[有任何建议及其想法都可以加群说明]请务必保管好自己的账号</p>
  41. <p align=”right”>CryStal-Home</p>
  42. <p align=”right”>www.babylyf.com</p>
  43. </div>
  44. </td>
  45. </tr></tbody>
  46. <center>如果您没有在(刘亦菲水晶之家)注册过任何信息,请直接忽略本邮件!</center><hr /><br />
  47.  
  48. </table>
  49. </div>’; @wp_mail($user_email, sprintf(__(‘[%s] Your username and password’), $blog_name), $message , $headers);
  50. }
  51. //让邮件支持html
  52. add_filter( ‘wp_mail_content_type’, ‘wpdx_set_html_content_type’ );
  53. function wpdx_set_html_content_type() {
  54. return ‘text/html’;
  55. }
  56. }
  57. </div></body></html>

wordpress让用户可以本地上传头像

wordpress开发实用技巧
wordpress用户头像是调用Gravatar,在国内经常访问不了。为此我们可以给用户加一个头像上传功能

  1. //本地头像
  2. class Simple_Local_Avatars {
  3. private $user_id_being_edited;
  4. public function __construct() {
  5. add_filter(‘get_avatar’, array(
  6. $this,
  7. ‘get_avatar’
  8. ) , 10, 5);
  9. add_action(‘admin_init’, array(
  10. $this,
  11. ‘admin_init’
  12. ));
  13. add_action(‘show_user_profile’, array(
  14. $this,
  15. ‘edit_user_profile’
  16. ));
  17. add_action(‘edit_user_profile’, array(
  18. $this,
  19. ‘edit_user_profile’
  20. ));
  21. add_action(‘personal_options_update’, array(
  22. $this,
  23. ‘edit_user_profile_update’
  24. ));
  25. add_action(‘edit_user_profile_update’, array(
  26. $this,
  27. ‘edit_user_profile_update’
  28. ));
  29. add_filter(‘avatar_defaults’, array(
  30. $this,
  31. ‘avatar_defaults’
  32. ));
  33. }
  34. public function get_avatar($avatar = , $id_or_email, $size = 96, $default = , $alt = false) {
  35. if (is_numeric($id_or_email)) $user_id = (int)$id_or_email;
  36. elseif (is_string($id_or_email) && ($user = get_user_by(’email’, $id_or_email))) $user_id = $user->ID;
  37. elseif (is_object($id_or_email) && !empty($id_or_email->user_id)) $user_id = (int)$id_or_email->user_id;
  38. if (empty($user_id)) return $avatar;
  39. $local_avatars = get_user_meta($user_id, ‘simple_local_avatar’, true);
  40. if (empty($local_avatars) || empty($local_avatars[‘full’])) return $avatar;
  41. $size = (int)$size;
  42. if (empty($alt)) $alt = get_the_author_meta(‘display_name’, $user_id);
  43. // generate a new size
  44. if (empty($local_avatars[$size])) {
  45. $upload_path = wp_upload_dir();
  46. $avatar_full_path = str_replace($upload_path[‘baseurl’], $upload_path[‘basedir’], $local_avatars[‘full’]);
  47. $image_sized = image_resize($avatar_full_path, $size, $size, true);
  48. // deal with original being >= to original image (or lack of sizing ability)
  49. $local_avatars[$size] = is_wp_error($image_sized) ? $local_avatars[$size] = $local_avatars[‘full’] : str_replace($upload_path[‘basedir’], $upload_path[‘baseurl’], $image_sized);
  50. // save updated avatar sizes
  51. update_user_meta($user_id, ‘simple_local_avatar’, $local_avatars);
  52. } elseif (substr($local_avatars[$size], 0, 4) != ‘http’) {
  53. $local_avatars[$size] = home_url($local_avatars[$size]);
  54. }
  55. $author_class = is_author($user_id) ? ‘ current-author’ : ;
  56. //https无法解决,使用替换方式解决。以下为参考代码
  57. $text = $local_avatars[$size];
  58. $text = preg_replace(‘/http:/’, , $text);
  59. $avatar = “<img alt='” . esc_attr($alt) . “‘ src='” .$text .“‘ class=’avatar avatar-{$size}{$author_class} photo’ height='{$size}’ width='{$size}’ />”;
  60. return apply_filters(‘simple_local_avatar’, $avatar);
  61. }
  62. public function admin_init() {
  63. //load_plugin_textdomain( ‘simple-local-avatars’, false, dirname( plugin_basename( __FILE__ ) ) . ‘/localization/’ );
  64. register_setting(‘discussion’, ‘simple_local_avatars_caps’, array(
  65. $this,
  66. ‘sanitize_options’
  67. ));
  68. add_settings_field(‘simple-local-avatars-caps’, __(‘本地上传头像权限管理’, ‘simple-local-avatars’) , array(
  69. $this,
  70. ‘avatar_settings_field’
  71. ) , ‘discussion’, ‘avatars’);
  72. }
  73. public function sanitize_options($input) {
  74. $new_input[‘simple_local_avatars_caps’] = empty($input[‘simple_local_avatars_caps’]) ? 0 : 1;
  75. return $new_input;
  76. }
  77. public function avatar_settings_field($args) {
  78. $options = get_option(‘simple_local_avatars_caps’);
  79. echo
  80. <label for=”simple_local_avatars_caps”>
  81. <input type=”checkbox” name=”simple_local_avatars_caps” id=”simple_local_avatars_caps” value=”1″ ‘ . @checked($options[‘simple_local_avatars_caps’], 1, false) . ‘ />
  82. . __(‘仅具有头像上传权限的用户具有设置本地头像权限(作者及更高等级角色)。’, ‘simple-local-avatars’) .
  83. </label>
  84. ;
  85. }
  86. public function edit_user_profile($profileuser) {
  87. ?>
  88. <h3><?php
  89. _e(‘头像’, ‘simple-local-avatars’); ?></h3>
  90.  
  91. <table class=“form-table”>
  92. <tr>
  93. <th><label for=“simple-local-avatar”><?php
  94. _e(‘上传头像’, ‘simple-local-avatars’); ?></label></th>
  95. <td style=“width: 50px;” valign=“top”>
  96. <?php
  97. echo get_avatar($profileuser->ID); ?>
  98. </td>
  99. <td>
  100. <?php
  101. $options = get_option(‘simple_local_avatars_caps’);
  102. if (empty($options[‘simple_local_avatars_caps’]) || current_user_can(‘upload_files’)) {
  103. do_action(‘simple_local_avatar_notices’);
  104. wp_nonce_field(‘simple_local_avatar_nonce’, ‘_simple_local_avatar_nonce’, false);
  105. ?>
  106. <input type=”file” name=”simple-local-avatar” id=”simple-local-avatar” /><br />
  107. <?php
  108. if (empty($profileuser->simple_local_avatar)) echo ‘<span class=”description”>’ . __(‘尚未设置本地头像,请点击“浏览”按钮上传本地头像。’, ‘simple-local-avatars’) . ‘</span>’;
  109. else echo
  110. <input type=”checkbox” name=”simple-local-avatar-erase” value=”1″ /> ‘ . __(‘移除本地头像’, ‘simple-local-avatars’) . ‘<br />
  111. <span class=”description”>’ . __(‘如需要修改本地头像,请重新上传新头像。如需要移除本地头像,请选中上方的“移除本地头像”复选框并更新个人资料即可。<br />移除本地头像后,将恢复使用 Gravatar 头像。’, ‘simple-local-avatars’) . ‘</span>
  112. ;
  113. } else {
  114. if (empty($profileuser->simple_local_avatar)) echo ‘<span class=”description”>’ . __(‘尚未设置本地头像,请在 Gravatar.com 网站设置头像。’, ‘simple-local-avatars’) . ‘</span>’;
  115. else echo ‘<span class=”description”>’ . __(‘你没有头像上传权限,如需要修改本地头像,请联系站点管理员。’, ‘simple-local-avatars’) . ‘</span>’;
  116. }
  117. ?>
  118. </td>
  119. </tr>
  120. </table>
  121. <script type=”text/javascript“>var form = document.getElementById(‘your-profile’);form.encoding = ‘multipart/form-data’;form.setAttribute(‘enctype’, ‘multipart/form-data’);</script>
  122. <?php
  123. }
  124. public function edit_user_profile_update($user_id) {
  125. if (!isset($_POST[‘_simple_local_avatar_nonce’]) || !wp_verify_nonce($_POST[‘_simple_local_avatar_nonce’], ‘simple_local_avatar_nonce’)) //security
  126. return;
  127. if (!empty($_FILES[‘simple-local-avatar’][‘name’])) {
  128. $mimes = array(
  129. ‘jpg|jpeg|jpe’ => ‘image/jpeg’,
  130. ‘gif’ => ‘image/gif’,
  131. ‘png’ => ‘image/png’,
  132. ‘bmp’ => ‘image/bmp’,
  133. ‘tif|tiff’ => ‘image/tiff’
  134. );
  135. // front end (theme my profile etc) support
  136. if (!function_exists(‘wp_handle_upload’)) require_once (ABSPATH . ‘wp-inc/includes/file.php’);
  137. $this->avatar_delete($user_id); // delete old images if successful
  138. // need to be more secure since low privelege users can upload
  139. if (strstr($_FILES[‘simple-local-avatar’][‘name’], ‘.php’)) wp_die(‘For security reasons, the extension “.php” cannot be in your file name.’);
  140. $this->user_id_being_edited = $user_id; // make user_id known to unique_filename_callback function
  141. $avatar = wp_handle_upload($_FILES[‘simple-local-avatar’], array(
  142. ‘mimes’ => $mimes,
  143. ‘test_form’ => false,
  144. ‘unique_filename_callback’ => array(
  145. $this,
  146. ‘unique_filename_callback’
  147. )
  148. ));
  149. if (empty($avatar[‘file’])) { // handle failures
  150. switch ($avatar[‘error’]) {
  151. case ‘File type does not meet security guidelines. Try another.’:
  152. add_action(‘user_profile_update_errors’, create_function(‘$a’, ‘$a->add(“avatar_error“,__(“请上传有效的图片文件。“,”simplelocalavatars“));’));
  153. break;
  154.  
  155. default:
  156. add_action(‘user_profile_update_errors’, create_function(‘$a’, ‘$a->add(“avatar_error“,”<strong>”.__(“上传头像过程中出现以下错误:“,”simplelocalavatars“).”</strong> ‘ . esc_attr($avatar[‘error’]) . ‘”);’));
  157. }
  158. return;
  159. }
  160. update_user_meta($user_id, ‘simple_local_avatar’, array(
  161. ‘full’ => $avatar[‘url’]
  162. )); // save user information (overwriting old)
  163.  
  164. } elseif (!empty($_POST[‘simple-local-avatar-erase’])) {
  165. $this->avatar_delete($user_id);
  166. }
  167. }
  168. /**
  169. * remove the custom get_avatar hook for the default avatar list output on options-discussion.php
  170. */
  171. public function avatar_defaults($avatar_defaults) {
  172. remove_action(‘get_avatar’, array(
  173. $this,
  174. ‘get_avatar’
  175. ));
  176. return $avatar_defaults;
  177. }
  178. /**
  179. * delete avatars based on user_id
  180. */
  181. public function avatar_delete($user_id) {
  182. $old_avatars = get_user_meta($user_id, ‘simple_local_avatar’, true);
  183. $upload_path = wp_upload_dir();
  184. if (is_array($old_avatars)) {
  185. foreach ($old_avatars as $old_avatar) {
  186. $old_avatar_path = str_replace($upload_path[‘baseurl’], $upload_path[‘basedir’], $old_avatar);
  187. @unlink($old_avatar_path);
  188. }
  189. }
  190. delete_user_meta($user_id, ‘simple_local_avatar’);
  191. }
  192. public function unique_filename_callback($dir, $name, $ext) {
  193. $user = get_user_by(‘id’, (int)$this->user_id_being_edited);
  194. $name = $base_name = sanitize_file_name(substr(md5($user->user_login) , 0, 12) . ‘_avatar’);
  195. $number = 1;
  196. while (file_exists($dir . “/$name$ext”)) {
  197. $name = $base_name . ‘_’ . $number;
  198. $number++;
  199. }
  200. return $name . $ext;
  201. }
  202. }
  203. $simple_local_avatars = new Simple_Local_Avatars;
  204. function get_simple_local_avatar($id_or_email, $size = ’96’, $default = , $alt = false) {
  205. global $simple_local_avatars;
  206. $avatar = $simple_local_avatars->get_avatar(, $id_or_email, $size, $default, $alt);
  207. if (empty($avatar)) $avatar = get_avatar($id_or_email, $size, $default, $alt);
  208. return $avatar;
  209. }

wordpress文章发表时间为:几小时前,几天前,几个月前

wordpress开发实用技巧
非常实用日期显示方式,发表超过一年的文章也会显示对应的年份

  1. //时间显示方式‘xx以前’
  2. function time_ago($type = ‘commennt’, $day = 7) {
  3. $d = $type == ‘post’ ? ‘get_post_time’ : ‘get_comment_time’;
  4. if (time() $d(‘U’) > 60 * 60 * 24 * $day) return;
  5. echo ‘ (‘, human_time_diff($d(‘U’) , strtotime(current_time(‘mysql’, 0))) , ‘前)’;
  6. }
  7. function timeago($ptime) {
  8. $ptime = strtotime($ptime);
  9. $etime = time() $ptime;
  10. if ($etime < 1) return ‘刚刚’;
  11. $interval = array(
  12. 12 * 30 * 24 * 60 * 60 => ‘年前 (‘ . date(‘Y-m-d’, $ptime) . ‘)’,
  13. 30 * 24 * 60 * 60 => ‘个月前 (‘ . date(‘m-d’, $ptime) . ‘)’,
  14. 7 * 24 * 60 * 60 => ‘周前 (‘ . date(‘m-d’, $ptime) . ‘)’,
  15. 24 * 60 * 60 => ‘天前’,
  16. 60 * 60 => ‘小时前’,
  17. 60 => ‘分钟前’,
  18. 1 => ‘秒前’
  19. );
  20. foreach ($interval as $secs => $str) {
  21. $d = $etime / $secs;
  22. if ($d >= 1) {
  23. $r = round($d);
  24. return $r . $str;
  25. }
  26. };
  27. }

以上代码放入function,在需要调用的地方放入下面的

  1. <?php
  2. if (!$_time) { ?><span class=“muted”><i class=“fa fa-clock-o”></i> <?php
  3. echo timeago(get_gmt_from_date(get_the_time(‘Y-m-d G:i:s’))) ?></span><?php
  4. } ?>

wordpress创建自定义栏目Post Type模块

WordPress 里面内置了两种常用的 Post Type :Post(文章)、Page(页面),分别用来展示两种类型的内容,一种是相对动态的文章,另一种是相对固定的页面。除此之外,WordPress 还内置了其他几种 Post Type 用来展示不同类型的内容。但如果是一个比较复杂的网站或者需求自定义程度比较高,这时候就可以手动自己创建一个 Post Type 来展示某类信息。

  1. function my_custom_post_movie() {
  2. $labels = array(
  3. ‘name’ => _x( ‘Movies’, ‘post type 名称’ ),
  4. ‘singular_name’ => _x( ‘Movie’, ‘post type 单个 item 时的名称,因为英文有复数’ ),
  5. ‘add_new’ => _x( ‘新建电影’, ‘添加新内容的链接名称’ ),
  6. ‘add_new_item’ => __( ‘新建一个电影’ ),
  7. ‘edit_item’ => __( ‘编辑电影’ ),
  8. ‘new_item’ => __( ‘新电影’ ),
  9. ‘all_items’ => __( ‘所有电影’ ),
  10. ‘view_item’ => __( ‘查看电影’ ),
  11. ‘search_items’ => __( ‘搜索电影’ ),
  12. ‘not_found’ => __( ‘没有找到有关电影’ ),
  13. ‘not_found_in_trash’ => __( ‘回收站里面没有相关电影’ ),
  14. ‘parent_item_colon’ => ,
  15. ‘menu_name’ => ‘Movies’
  16. );
  17. $args = array(
  18. ‘labels’ => $labels,
  19. ‘description’ => ‘我们网站的电影信息’,
  20. ‘public’ => true,
  21. ‘menu_position’ => 5,
  22. ‘supports’ => array( ‘title’, ‘editor’, ‘thumbnail’, ‘excerpt’, ‘comments’ ),
  23. ‘has_archive’ => true
  24. );
  25. register_post_type( ‘movie’, $args );
  26. }
  27. add_action( ‘init’, ‘my_custom_post_movie’ );

为 Post Type 添加分类功能。就电影来说,可以分为科幻、动作、战争等类别,那么我们就为自定义的 Movie 添加分类功能,这样就可以编辑新分类以及归类我们的电影了。这个分类跟文章里面的分类性质是一样的。

  1. function my_taxonomies_movie() {
  2. $labels = array(
  3. ‘name’ => _x( ‘电影分类’, ‘taxonomy 名称’ ),
  4. ‘singular_name’ => _x( ‘电影分类’, ‘taxonomy 单数名称’ ),
  5. ‘search_items’ => __( ‘搜索电影分类’ ),
  6. ‘all_items’ => __( ‘所有电影分类’ ),
  7. ‘parent_item’ => __( ‘该电影分类的上级分类’ ),
  8. ‘parent_item_colon’ => __( ‘该电影分类的上级分类:’ ),
  9. ‘edit_item’ => __( ‘编辑电影分类’ ),
  10. ‘update_item’ => __( ‘更新电影分类’ ),
  11. ‘add_new_item’ => __( ‘添加新的电影分类’ ),
  12. ‘new_item_name’ => __( ‘新电影分类’ ),
  13. ‘menu_name’ => __( ‘电影分类’ ),
  14. );
  15. $args = array(
  16. ‘labels’ => $labels,
  17. ‘hierarchical’ => true,
  18. );
  19. register_taxonomy( ‘movie_category’, ‘movie’, $args );
  20. }
  21. add_action( ‘init’, ‘my_taxonomies_movie’, 0 );

我们想要添加的电影类型不能仅仅只有正文内容,我们还需要额外添加一些 导演 之类的有关内容。那么就需要添加自定义 Meta Box,Meta Box 可以在文章发表页面中添加自定义的表单,编写文章的时候可以填写额外的信息然后在前端调用出来。

  1. add_meta_box( $id, $title, $callback, $post_type, $context,$priority, $callback_args );

老规矩,具体参数内容查看官方文档,这里只介绍常用用法。我们注册一个 Meta Box :

  1. add_action( ‘add_meta_boxes’, ‘movie_director’ );
  2. function movie_director() {
  3. add_meta_box(
  4. ‘movie_director’,
  5. ‘电影导演’,
  6. ‘movie_director_meta_box’,
  7. ‘movie’,
  8. ‘side’,
  9. ‘low’
  10. );
  11. }

然后在配置参数里面指定了回调函数 movie_director_meta_box,我们需要在这个函数里面创建表单:

  1. function movie_director_meta_box($post) {
  2.  
  3. // 创建临时隐藏表单,为了安全
  4. wp_nonce_field( ‘movie_director_meta_box’, ‘movie_director_meta_box_nonce’ );
  5. // 获取之前存储的值
  6. $value = get_post_meta( $post->ID, ‘_movie_director’, true );
  7.  
  8. ?>
  9.  
  10. <label for=“movie_director”></label>
  11. <input type=“text” id=“movie_director” name=“movie_director” value=“<?php echo esc_attr( $value ); ?/>” placeholder=“输入导演名称” >
  12.  
  13. <?php
  14. }

但是这时候,你的表单是没法用的,因为你提交文章之后并没有保存这个 Meta Box 的内容,下面是验证保存内容的代码:

  1. add_action( ‘save_post’, ‘movie_director_save_meta_box’ );
  2. function movie_director_save_meta_box($post_id){
  3.  
  4. // 安全检查
  5. // 检查是否发送了一次性隐藏表单内容(判断是否为第三者模拟提交)
  6. if ( ! isset( $_POST[‘movie_director_meta_box_nonce’] ) ) {
  7. return;
  8. }
  9. // 判断隐藏表单的值与之前是否相同
  10. if ( ! wp_verify_nonce( $_POST[‘movie_director_meta_box_nonce’], ‘movie_director_meta_box’ ) ) {
  11. return;
  12. }
  13. // 判断该用户是否有权限
  14. if ( ! current_user_can( ‘edit_post’, $post_id ) ) {
  15. return;
  16. }
  17.  
  18. // 判断 Meta Box 是否为空
  19. if ( ! isset( $_POST[‘movie_director’] ) ) {
  20. return;
  21. }
  22.  
  23. $movie_director = sanitize_text_field( $_POST[‘movie_director’] );
  24. update_post_meta( $post_id, ‘_movie_director’, $movie_director );
  25.  
  26. }

列表空荡荡的,好难看,我可不可以加上导演字段?当然可以,使用 manage_$post_type_posts_custom_column 即可实现,我们添加:

  1. add_action(“manage_posts_custom_column”, “movie_custom_columns”);
  2. add_filter(“manage_edit-movie_columns”, “movie_edit_columns”);
  3. function movie_custom_columns($column){
  4. global $post;
  5. switch ($column) {
  6. case “movie_director”:
  7. echo get_post_meta( $post->ID, ‘_movie_director’, true );
  8. break;
  9. }
  10. }
  11. function movie_edit_columns($columns){
  12.  
  13. $columns[‘movie_director’] = ‘导演’;
  14.  
  15. return $columns;
  16. }

根据 WordPress 的模板调用规则 我们可以得知,我们只需要创建 archive-[post_type].php 和 single-[post_type].php 就可以实现该 Post Type 的列表自定义和文章自定义。当访问 Post Type,WordPress 会优先调用这些模板来渲染。class=”prettyprint linenums” >
现在我们就把主题里自带的 archive.php 和 single.php 文件复制一份命名为 archive-movie.php 和 single-movie.php,为了演示,这里我不做很多自定义,只是输出导演信息表示一下。

上面操作依赖模板,如果需要高度自定义或者在页面的某个模块中调用列表,就需要用到 WP_Query 类来调用:

  1. $args = array( ‘post_type’ => ‘product’, ‘posts_per_page’ => 10 );
  2. $loop = new WP_Query( $args );
  3. while ( $loop->have_posts() ) : $loop->the_post();
  4. the_title();
  5. echo ‘<div class=”entry-content”>’;
  6. the_content();
  7. echo ‘</div>’;
  8. endwhile;

虽然我们自定义好了 Post Type 同时也编写了一些内容,但是在首页的列表里面并没有显示出来。自定义的 Post Type 的内容不会自动混入主循环里面。那如何让自定义 Post Type 的内容显示出来?

  1. add_action( ‘pre_get_posts’, ‘add_my_post_types_to_query’ );
  2. function add_my_post_types_to_query( $query ) {
  3. if ( is_home() && $query->is_main_query() )
  4. $query->set( ‘post_type’, array( ‘post’, ‘page’, ‘movie’ ) );
  5. return $query;
  6. }

如果你要改变自定义文章类型的固定连接,以/movie/1332.html形式输出参考如下。(需支持伪静态)

  1. add_action(‘init’, ‘custom_book_rewrite’);
  2. function custom_book_rewrite() {
  3. global $wp_rewrite;
  4. $queryarg = ‘post_type=movie&p=’;
  5. $wp_rewrite->add_rewrite_tag(‘%qid%’, ‘([^/]+)’, $queryarg);
  6. $wp_rewrite->add_permastruct(‘movie’, ‘/movie/%qid%.html’, false);
  7. }
  8. add_filter(‘post_type_link’, ‘custom_book_permalink’, 1, 3);
  9. function custom_book_permalink($post_link, $post = 0) {
  10. global $wp_rewrite;
  11. if ( $post->post_type == ‘movie’ ){
  12. $post = &get_post($id);
  13. if ( is_wp_error( $post ) )
  14. return $post;
  15. $newlink = $wp_rewrite->get_extra_permastruct(‘movie’);
  16. $newlink = str_replace(“%qid%”, $post->ID, $newlink);
  17. $newlink = home_url(user_trailingslashit($newlink));
  18. return $newlink;
  19. } else {
  20. return $post_link;
  21. }
  22. }

WordPress 模板层次详细介绍

WordPress模板的定义非常方便,但是在定制模板之前,我们有必要知道WordPress的模板层次,了解WordPress是如何加载模板文件的,这将有利于开发模板时合理利用资源及提高工作效率。

万能的index.php

我们知道一个最简单的WordPress主题只需要 style.css 和 index.php 文件即可。这代表着 index.php 可以是任何一个页面的模板,无论是首页,还是文章页,或是分类页,再或者是搜索结果页面,它都能完美胜任。也就是说,当对应的模板不存在时, index.php 将是WordPress最后的底牌。

首页

1.首先WordPress会先检查是否有静态首页,如果有静态首页,就会加载这个页面内容并通过 front-page.php 模板文件展示,如果没有这个模板文件,就会通过页面模板展示
2.如果没有静态首页,就会加载 home.php 最新文章模板
3.如果没有 home.php 则加载 index.php 模板

文章页

1.首先被考虑的是 single-{post_type}.php 这样一个模板文件(如文章类型是 product 那么对应的文件名就是 single-product.php )
2.如果找不到,那么就会加载 single.php 模板
3.如果连 single.php 模板都没有则加载 index.php 模板。

页面

1.首先被考虑的是自定义模板,也就是编辑页面时所选择的模板
2.如果没有自定义模板,则查找 page-{slug}.php 别名模板(如页面别名是 about 对应的文件名就是 page-about.php )
3.如果别名模板也没有就查找 page-{id}.php ID模板(如页面ID是 2 对应的文件名就是 page-2.php )
4.如果ID模板也没有那就是 page.php 模板了
5.如果连 page.php 模板都没有则加载 index.php 模板

分类页

1.首先被考虑的是 category-{slug}.php 别名模板(如分类别名是 news 对应的文件名就是 category-news.php )
2.如果没有别名模板则查找 category-{id}.php ID模板(如分类ID是 1 对应的文件名就是 category-1.php )
3.如果ID模板也没有那就是 category.php 分类模板了
4.如果 category.php 分类模板也没有则加载 archive.php 通用归档模板
5.如果连 archive.php 通用归档模板都没有则加载 index.php 模板

标签页

标签页模板加载顺序和分类页一样,只不过前缀不过 category 而是 tag (如 tag-{slug}.php)。

自定义分类法

有时候除了WordPress默认的分类目录和标签我们还需要其他的分类方法,这时候我们就会注册一个新的分类法,那么在此之前知道分类法的模板加载顺序也是十分必要的。以下说明假设自定义分类法是 people 这个名字:
1.分类法分类页首先被考虑的是 taxonomy-{taxonomy}-{term}.php 别名模板(如分类别名 teacher 对应的文件名就是 taxonomy-people-teacher.php )
2.如果没有别名模板,则加载该分类法归档页(如 taxonomy-people.php )
3.如果分类法归档页模板也没有则加载 archive.php 通用归档模板
4.如果连 archive.php 通用归档模板都没有则加载 index.php 模板

自定义文章类型

除了自定义分类法,有时候我们也需要自定义文章类型:
1.自定义文章类型归档页首先被考虑的是 archive-{post_type}.php 别名模板(如文章类型是 product 那么对应的文件名就是 archive-product.php )
2.如果没有别名模板则加载 archive.php 通用归档模板
3.如果连 archive.php 通用归档模板都没有则加载 index.php 模板

作者归档页

1.首先被考虑的是 author-{nicename}.php 别名模板(如作者用户名是 steven 那么对应的文件名就是 author-steven.php )
2.如果没有别名模板则加载 author-{id}.php ID模板(如作者ID是 1 对应的文件名就是 author-1.php )
3.如果ID模板没有则加载 author.php 通用作者模板
4.如果通用作者模板也没有则加载 archive.php 通用归档模板
5.如果连 archive.php 通用归档模板都没有则加载 index.php 模板

日期归档页

1.首先被考虑的是 date.php 日期归档模板
2.如果日期归档模板没有则加载 archive.php 通用归档模板
3.如果连 archive.php 通用归档模板都没有则加载 index.php 模板

搜索结果页

1.首先被考虑的是 search.php 搜索结果模板
2.如果没有搜索结果模板则加载 index.php 模板

附件页

1.首先会按MIME类型加载模板(如 image.php, video.php, application.php,而 text/plain 类型则按顺序尝试加载 text.php, plain.php, text_plain.php 这三个文件。
2.如果没有对应的MIME类型模板则 attachment.php 附件模板(如没有 attachment.php 则加载 single-attachment.php )
3.如果没有附件模板则加载 single.php 文章页模板
4.如果连 single.php 文章页模板都没有则加载 index.php 模板

使用钩子修改模板

在某些使用场景(如插件),我们并不能直接修改模板文件,这时候我们可以使用钩子来实现修改模板文件,钩子名称是 {$type}_template 这样的格式,以下是对应的完整的钩子名称列表:

index_template
404_template
archive_template
author_template
category_template
tag_template
taxonomy_template
date_template
home_template
front_page_template
page_template
paged_template
search_template
single_template
text_template, plain_template, text_plain_template (all mime types)
attachment_template
comments_popup
以下是一个使用例子(让页面加载 single.php 文章页的模板):

  1. function page_template_filter( $templates= ){
  2. $templates=locate_template(“single.php”,false);
  3. return $templates;
  4. }
  5. add_filter( ‘page_template’, ‘page_template_filter’ );

模板页面判断

一般情况下,在一个特定的模板中我们能清楚知道应该怎么输出特定的样式和内容,但在一些通用模板中(如 header.php )我们想要知道用户当前访问的是哪个页面模板就需要借助WordPress内置的条件判断函数了,这些函数可以帮助我们判断当前是什么页面以方便加载不同的模板内容,如 is_home() 则是判断首页的条件标签,is_single() 则是判断文章页的条件标签,等等。

WordPress 技巧:通过图片地址获取 ID

当我们知道图片的地址的时候,需要知道这张图片在数据库中的 ID,从而获取图片的详细信息,比如高,宽等等,来做一些操作,那么首先第一个怎么通过图片地址获取 ID?可以通过下面函数实现:

  1. function wpjam_get_attachment_id ($img_url) {
  2. $cache_key = md5($img_url);
  3. $post_id = wp_cache_get($cache_key, ‘wpjam_attachment_id’ );
  4. if($post_id == false){
  5.  
  6. $attr = wp_upload_dir();
  7. $base_url = $attr[‘baseurl’].“/”;
  8. $path = str_replace($base_url, “”, $img_url);
  9. if($path){
  10. global $wpdb;
  11. $post_id = $wpdb->get_var(“SELECT post_id FROM $wpdb->postmeta WHERE meta_value = ‘{$path}'”);
  12. $post_id = $post_id?$post_id:;
  13. }else{
  14. $post_id = ;
  15. }
  16.  
  17. wp_cache_set( $cache_key, $post_id, ‘wpjam_attachment_id’, 86400);
  18. }
  19. return $post_id;
  20. }

WordPress 技巧:将所有文章的别名设置成自身的 ID

在中国,很多人的固定连接都是围绕着文章的 ID 展开的,而在国外则大多数都是文章的别名(默认为文章的标题小写并去除或转义一些特殊字符)。如果使用文章的别名作为固定连接,不手动设置别名,就会出现中文链接,非常不好。但如果有一天你想在固定连接里包含别名,那就最好手动设置每一篇文章的别名,防止出现中文。但这样,之前的文章还是会出现中文,又懒得去改,怎么办呢?本文就教你怎么把老文章的别名自动设置成自身的 ID.
首先把下边的代码放到主题的 functions.php 里:

  1. function Bing_post_name_id(){
  2. query_posts( ‘posts_per_page=-1’ );
  3. while( have_posts() ){
  4. the_post();
  5. $post_id = $GLOBALS[‘post’]->ID;
  6. wp_update_post( array(
  7. ‘ID’ => $post_id,
  8. ‘post_name’ => $post_id
  9. ) );
  10. }
  11. wp_reset_query();
  12. }
  13. if( $_GET[‘post_name_id’] == ‘yes’ ) add_action( ‘init’, ‘Bing_post_name_id’ );

放置好代码后,访问一下下边的网站,访问前注意一定要备份数据,以免出错。

  1. http://example.com?post_name_id=yes

文章多的话网页加载会比较慢,因为正在一篇文章一篇文章的修改别名,要耐心等到网页完全加载好才可以。加载好后,删除之前添加的代码,修改完成,所有文章的别名都会变成自身的 ID.

  1. /**
  2. * 新文章自动使用ID作为别名
  3. * 作用:即使你设置固定连接结构为 %postname% ,仍旧自动生成 ID 结构的链接
  4. * https://www.wpdaxue.com/wordpress-using-post-id-as-slug.html
  5. */
  6. add_action( ‘save_post’, ‘using_id_as_slug’, 10, 2 );
  7. function using_id_as_slug($post_id, $post){
  8. global $post_type;
  9. if($post_type==‘post’){ //只对文章生效
  10. // 如果是文章的版本,不生效
  11. if (wp_is_post_revision($post_id))
  12. return false;
  13. // 取消挂载该函数,防止无限循环
  14. remove_action(‘save_post’, ‘using_id_as_slug’ );
  15. // 使用文章ID作为文章的别名
  16. wp_update_post(array(‘ID’ => $post_id, ‘post_name’ => $post_id ));
  17. // 重新挂载该函数
  18. add_action(‘save_post’, ‘using_id_as_slug’ );
  19. }
  20. }

新文章自动使用ID作为别名,新建的文章都会自动使用ID作为别名

WordPress更改固定链接结构,IIS7配置伪静态和301重定向

wordpress开发实用技巧
网站如果更改wordpress结构请务必做301重定向,IIS7是在当前网站目录创建web.config文件来实现伪静态和301重定向。以下代码放入web.config实现wordpress全局伪静态,并且将原来的http://www.babylyf.com/?p=34362的访问定制301重定向到http://www.babylyf.com/34362.html请根据自己的固定连接来修改文件。使用http状态查是否301重定向成功。更高级的URL重写功能请打开IIS,当前站点-url重写

  1. < ?xml version=”1.0″ encoding=”UTF-8″?>
  2. <configuration>
  3. <system .webServer>
  4. <rewrite>
  5. <rules>
  6. <rule name=“category”>
  7. <match url=“category/?(.*)”></match>
  8. <conditions logicalGrouping=“MatchAll” trackAllCaptures=“false”></conditions>
  9. <action type=“Rewrite” url=“/index.php?category_name={R:1}” appendQueryString=“false” logRewrittenUrl=“false”></action>
  10. </rule>
  11. <rule name=“Main Rule” stopProcessing=“true”>
  12. <match url=“.*”></match>
  13. <conditions logicalGrouping=“MatchAll” trackAllCaptures=“false”>
  14. <add input=“{REQUEST_FILENAME}” matchType=“IsFile” negate=“true”></add>
  15. <add input=“{REQUEST_FILENAME}” matchType=“IsDirectory” negate=“true”></add>
  16. </conditions>
  17. <action type=“Rewrite” url=“index.php/{R:0}”></action>
  18. </rule>
  19. <rule name=“wordpress” patternSyntax=“Wildcard”>
  20. <match url=“*”></match>
  21. <conditions logicalGrouping=“MatchAll” trackAllCaptures=“false”>
  22. <add input=“{REQUEST_FILENAME}” matchType=“IsFile” negate=“true”></add>
  23. <add input=“{REQUEST_FILENAME}” matchType=“IsDirectory” negate=“true”></add>
  24. </conditions>
  25. <action type=“Rewrite” url=“index.php”></action>
  26. </rule>
  27. <rule name=“RedirectUserFriendlyURL1” stopProcessing=“true”>
  28. <match url=“^$”></match>
  29. <conditions>
  30. <add input=“{REQUEST_METHOD}” pattern=“^POST$” negate=“true”></add>
  31. <add input=“{QUERY_STRING}” pattern=“^p=([^=&]+)$”></add>
  32. </conditions>
  33. <action type=“Redirect” url=“/{C:1}.html” appendQueryString=“false”></action>
  34. </rule>
  35. <rule name=“RewriteUserFriendlyURL1” stopProcessing=“true”>
  36. <match url=“^/([^/]+)/?$”></match>
  37. <conditions>
  38. <add input=“{REQUEST_FILENAME}” matchType=“IsFile” negate=“true”></add>
  39. <add input=“{REQUEST_FILENAME}” matchType=“IsDirectory” negate=“true”></add>
  40. </conditions>
  41. <action type=“Rewrite” url=“?p={R:1}”></action>
  42. </rule></rules>
  43. </rewrite>
  44. </system>
  45. </configuration>

301重定向演示:原来地址:http://www.babylyf.com/tag/环法 重定向地址:http://www.babylyf.com/?tag=环法

  1. <rule name=“tag” stopProcessing=“true”>
  2. <match url=“tag/?(.*)”></match>
  3. <conditions logicalGrouping=“MatchAll” trackAllCaptures=“false”></conditions>
  4. <action type=“Redirect” url=“?tag={R:1}”></action>
  5. </rule>

WordPress删除文章,也会自动删除文章中的附件图片

WordPress删除文章时,文章内所上传到媒体库的图片等附件不会自动删除,占用了网站空间,因此下面说明通过几行代码的简单方式实现在删除文章时自动删除缩略图以及图片附件,这样就不用手动去媒体库寻找并删除,准确而且效率高。

  1. /* 删除文章时删除图片附件
  2. /* ———————— */
  3. function delete_post_and_attachments($post_ID) {
  4. global $wpdb;
  5. //删除特色图片
  6. $thumbnails = $wpdb->get_results( “SELECT * FROM $wpdb->postmeta WHERE meta_key = ‘_thumbnail_id’ AND post_id = $post_ID” );
  7. foreach ( $thumbnails as $thumbnail ) {
  8. wp_delete_attachment( $thumbnail->meta_value, true );
  9. }
  10. //删除图片附件
  11. $attachments = $wpdb->get_results( “SELECT * FROM $wpdb->posts WHERE post_parent = $post_ID AND post_type = ‘attachment'” );
  12. foreach ( $attachments as $attachment ) {
  13. wp_delete_attachment( $attachment->ID, true );
  14. }
  15. $wpdb->query( “DELETE FROM $wpdb->postmeta WHERE meta_key = ‘_thumbnail_id’ AND post_id = $post_ID” );
  16. }
  17. add_action(‘before_delete_post’, ‘delete_post_and_attachments’);

将上述代码放到主题functions.php文件中即可使用,其在删除文章时先执行函数内容,删除特色图片以及图片附件,如果在使用action delete_post而不是before_delete_post将导致删除文章后因媒体附件与文章关联已取消而无法正确删除。

WordPress加入自定义菜单,并且前台调用出来

首先我们要在functions中注册菜单,才能使用。将下方代码放入主题function中

  1. if (function_exists(‘register_nav_menus’)){
  2. register_nav_menus( array(
  3. ‘nav1’ => __(‘亦菲导航’),
  4. ‘nav2’ => __(‘亦菲专属’)
  5. ));
  6. }

在需要调用菜单的地方放入。nav1是菜单ID

  1. wp_nav_menu(array(‘theme_location’ => ‘nav1’))

WordPress判断当前文章是否为置顶文章,是的话输出指定内容

将以下判断函数放入functions中

  1. /*判断文章是否为置顶*/
  2. function Bing_is_sticky_posts( $ID = false ){
  3. if( $ID === false ){
  4. $post_ID = get_the_ID();
  5. if( $post_ID === false ) return false;
  6. $ID = $post_ID;
  7. }
  8. return in_array( $ID, (array) get_option( ‘sticky_posts’ ) );
  9. }

在需要判定的地方调用下面的代码,置顶文章才会输出内容

  1. <?php if( Bing_is_sticky_posts() ) echo ‘当前文章是置顶文章’; ?>

WordPress纯代码给网站增加点赞功能

通过自定义字段保存赞数量,通过cookies来禁止重复赞。将下面代码添加进function.php

  1. add_action(‘wp_ajax_nopriv_bigfa_like’, ‘bigfa_like’);
  2. add_action(‘wp_ajax_bigfa_like’, ‘bigfa_like’);
  3. function bigfa_like(){
  4. global $wpdb,$post;
  5. $id = $_POST[“um_id”];
  6. $action = $_POST[“um_action”];
  7. if ( $action == ‘ding’){
  8. $bigfa_raters = get_post_meta($id,‘bigfa_ding’,true);
  9. $expire = time() + 99999999;
  10. $domain = ($_SERVER[‘HTTP_HOST’] != ‘localhost’) ? $_SERVER[‘HTTP_HOST’] : false; // make cookies work with localhost
  11. setcookie(‘bigfa_ding_’.$id,$id,$expire,‘/’,$domain,false);
  12. if (!$bigfa_raters || !is_numeric($bigfa_raters)) {
  13. update_post_meta($id, ‘bigfa_ding’, 1);
  14. }
  15. else {
  16. update_post_meta($id, ‘bigfa_ding’, ($bigfa_raters + 1));
  17. }
  18. echo get_post_meta($id,‘bigfa_ding’,true);
  19. }
  20. die;
  21. }

将以下代码扔进footer.php文件

  1. <script type=“text/javascript”>
  2. $.fn.postLike = function() {
  3. if ($(this).hasClass(‘done’)) {
  4. return false;
  5. } else {
  6. $(this).addClass(‘done’);
  7. var id = $(this).data(“id”),
  8. action = $(this).data(‘action’),
  9. rateHolder = $(this).children(‘.count’);
  10. var ajax_data = {
  11. action: “bigfa_like”,
  12. um_id: id,
  13. um_action: action
  14. };
  15. $.post(“/wp-admin/admin-ajax.php”, ajax_data,
  16. function(data) {
  17. $(rateHolder).html(data);
  18. });
  19. return false;
  20. }
  21. };
  22. $(document).on(“click”, “.favorite”,
  23. function() {
  24. $(this).postLike();
  25. });
  26. </script>

在需要点赞的地方,是用下面的调用

  1. <div class=“post-like”>
  2. <a href=”javascript:;” data-action=”ding” data-id=”<?php the_ID(); ?>” class=”favorite <?php if(isset($_COOKIE[‘bigfa_ding_’.$post->ID])) echo ‘ done’;?>“>喜欢 <span class=“count”>
  3. <?php if( get_post_meta($post->ID,‘bigfa_ding’,true) ){
  4. echo get_post_meta($post->ID,‘bigfa_ding’,true);
  5. } else {
  6. echo ‘0’;
  7. }?></span>
  8. </a>
  9. </div>

效果还不好看,添加一段代码就好了,将这段代码扔进style.css文件,最底部就可以了

  1. .postlike{textalign:center;padding:10px}
  2. .postlike a{ backgroundcolor:#21759B;border-radius: 3px;color: #FFFFFF;font-size: 12px;padding: 5px 10px;text-decoration: none;outline:none}
  3. .postlike a.done, .postlike a:hover{backgroundcolor:#eee;color:#21759B;}
  4. .postlike a.done{cursor:notallowed}

WordPress文章摘要内容,自定义输出文字数量

wordpress自带摘要功能,但是字数无法控制。下面这段可以控制截取数量220是字节。

  1. <?php echo mb_strimwidth(strip_tags(apply_filters(‘the_excerpt’, $post->post_content)), 0, 220,“…”); ?>

WordPress24小时内发表的文章,输出自定义文字或者图标

调用文章的时候做一个判定,如果是80小时内的文章那么输出自定义文字或者图标(比如new)

  1. <?php
  2. $t1 = $post->post_date;
  3. $t2 = date(“Y-m-d H:i:s”);
  4. $diff = (strtotime($t2) strtotime($t1)) / 3600;
  5. if ($diff < 80) {
  6. echo ‘这是最新文章’;
  7. } ?>

WordPress不同页面调用不同的侧边栏

我们在wordpress主题开发过程中,有时候需要对不同的页面设计不同的侧边栏。首先我们要给当前主题注册多个侧边栏,后台小工具会显示你注册的侧边栏。再functions中加入注册函数

  1. if ( function_exists(‘register_sidebar’) ) {
  2. register_sidebar(array(
  3. ‘name’ => ‘首页侧栏’,
  4. ‘id’ => ‘widget_homesidebar’,
  5. ‘before_widget’ => ‘<li id=”%1$s” class=”widget %2$s”>’,
  6. ‘after_widget’ => ‘</li>’,
  7. ‘before_title’ => ‘<h2>’,
  8. ‘after_title’ => ‘</h2>’,
  9. ));
  10. register_sidebar(array(
  11. ‘name’ => ‘文章页侧栏’,
  12. ‘id’ => ‘widget_postsidebar’,
  13. ‘before_widget’ => ‘<li id=”%1$s” class=”widget %2$s”>’,
  14. ‘after_widget’ => ‘</li>’,
  15. ‘before_title’ => ‘<h2>’,
  16. ‘after_title’ => ‘</h2>’,
  17. ));
  18. }

以上代码注册了两个侧边栏:“首页侧栏”与“文章页侧栏”。然后在主题的侧边栏文件siderbar.php添加如下代码:(判断当前页面是那种类型,然后读取设定的侧边栏)举一反三,搜索页,分类,标签都可以进行判断

  1. <?php
  2. if(is_home() || is_front_page()) { //首页显示“首页侧栏”
  3. if (function_exists(‘dynamic_sidebar’) && dynamic_sidebar(‘widget_homesidebar’)){}
  4. }
  5. ?>
  6.  
  7. <?php
  8.  
  9. if ( is_single() ) {//文章页显示 “文章页侧栏”
  10. if (function_exists(‘dynamic_sidebar’) && dynamic_sidebar(‘widget_postsidebar’)){}
  11. }
  12. ?>

文章内容转自 刘亦菲水晶之家: www.babylyf.com/wordpress


兰州seo , 版权所有丨如未注明 , 均为原创丨转载请注明wordpress开发实用技巧
喜欢 (0)
发表我的评论
取消评论
表情 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址