WordPress中如何按照分类调取不同模板

默认的分类模板文件为category.php,但通常在开发中的需求不会这么简单

分类页面按按分类调取不同模板

如果想要不同分类调取不同分类的话,可以使用category加中间杠后接需使用该模板的分类Id号或别名(slug)来进行命名,如category-2.php或category-wordpress.php

也可以通过在category.php中通过判断id号来调用不同模板,比如

if ( is_category(array(1,2,3)) ) {
  include(TEMPLATEPATH . '/abc.php');
}else{
  include(TEMPLATEPATH . '/def.php');
}

上述方法可以还满足多个分类调用同一模板的需求,还有一种类似的方法,通过获取slug来调取对应的模板,如若模板不存在则调用默认的模板

$cat_ID = get_query_var('cat');
$cat = get_category($cat_ID);
$slug=$name = $cat->slug;
if ( '' !== locate_template( array("template-parts/category-$slug.php") ) ) {
  get_template_part( 'template-parts/category', $slug );
}else{
  get_template_part( 'template-parts/category', 'default');
}

以上代码可以精简为,因为在category-$slug.php不存在时,会自动调用该目录下的category.php

$cat_ID = get_query_var('cat');
$cat = get_category($cat_ID);
$slug=$name = $cat->slug;
get_template_part( 'template-parts/category', $slug );

文章页面按所属分类调取模板

很多时候我们需要分类下的文章页面根据不同分类使用不同的模板,类似地,我们可以通过in_category()函数来判断文章所属分类来调用不同模板,该函数中可以传入分类id,也可以使用分类别名(slug)

if ( in_category(array(1,2,3)) ) {
  include('template-parts/content-a.php');
}else {
  include('template-parts/content-b.php');
}

另外一种方法是根据所属分类别名来创建模板,如content-wordpress.php,不存在的直接调用content.php。不过这个方法存在一个问题,就是当文章属于多个分类时,需从数组中选择一个分类。

 $cat = get_the_category($post->ID); $slug = $cat[0]->slug; get_template_part('template-parts/content', $slug); 

独立页面调用不同模板

独立页面默认调用index.php作为模板,可通过新建page.php来作为独立页面模板。如果要单独为某一独立页面设置模板的话,可以在模板根目录中创建page-id.php,其中的id为该独立页面的id号。同样地,也可以采用页面别名page-slug.php的方式。

 

WordPress中多语言的实现方法

WordPress中有诸如qTranslate-X等插件可实现文章标题和内容的多语言,不过本文主要讲解模板开发中所涉及到的提示文本等的多语言实现。

首先需要在主题目录下创建一个languages文件夹,用于存放语言包文件。然后在模板目录下的functions.php,然后在代码中添加函数加载该文件夹,示例代码如下:

add_action('after_setup_theme', 'alanhou_setup');
function alanhou_setup(){
  load_theme_textdomain('alanhou', get_template_directory.'/languages');
}

完成以上准备工作后就需要用到Poedit软件了

Poedti软件界面

打开Poedit软件,如果已有语言包可在界面点击编辑翻译,否则点击文件>新建来创建您自己的语言包,然后在弹出窗口中选择要翻译的语言,本例中将英文翻译为中文,所以选择简体中文

简体中文

然后点击工具栏中的保存按钮,保存到相应主题的languages目录中,名称为zh_CN.po,然后点击从源代码中提取,在弹出的编目属性窗口中设置源路径源关键字,源路径采用主题根目录,源关键字这里使用Wordpress中默认的_e和__(前者直接输出,后者调取值),点击确定软件会自动解析所选目录下符合格式的文本(在代码中体现为_e(‘Category’,’alanhou’)或__(‘Author’,’alanhou’)),然后逐一翻译即可

源文本翻译

 

WordPress主题开发系列之自建模板

WordPress的默认集成有twentyfifteen之类的模板,位置在wp-content/themes下。如果想要安装或者开发主题,都需要在这个目录下来完成。

本例将在wp-content/themes目录下创建一个名为alanhou的文件夹,自开发的模板要求至少有index.php和style.css这两个文件。通常在style.css最上方会有一大段注释,用于在设置主题名称、版本等相关信息。细心的你一定还会发现在后台查看主题时还会有一张图片,这张图片来自主题文件夹下的screeshot.png, 建议大小为880*660px(或相似比例的图片)。

/*
Theme Name: Alan Hou
Theme URI: http://alanhou.org/
Author: Alan Hou
Author URI: http://alanhou.org/
Description: Alan Hou自开发主题,用于研究Wordpress二次开发相关知识
Version: 1.0.1
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Tags: alan, translation-ready, custom-menu
Text Domain: alanhou
*/

完成上述操作后在后台的效果如下

Wordpress Alan自建主题

首先我们先在index.php中加入代码,调用主题CSS,并输出博客的标题和描述,主要用到了bloginfo(), get_option(), wp_header()和wp_footer()方法示例代码如下:

<!doctype html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/htm; charset=<?php bloginfo('charset'); ?>" />
  <?php if(is_home()): $title = get_bloginfo('name'); else: $title = wp_title('', false); endif; if($paged>0):
      $title .= '-第'.$paged.'页';
    endif;
  ?>
  <title><?php echo $title; ?></title>
  <meta name="description" content="<?php bloginfo('description'); ?>" />
  <link rel="stylesheet" href="<?php bloginfo('stylesheet_url') ?>" type="text/css" ?>
  <?php wp_head(); ?>
</head>
<body>

<div id="header" class="fl">

<div id="header-left" class="fl">

<h1><a href="<?php echo get_option('home'); ?>"><?php bloginfo('name'); ?></a></h1>


<div class="description"><?php bloginfo('description'); ?></div>

    </div>


<div id="header-right" class="fr">
      
    </div>

  </div>


<div id="nav">

<ul><?php wp_nav_menu(); ?></ul>

  </div>


<div id="main" class="fl">
  </div>

  <?php wp_footer(); ?>
</body>

通过简单的css控制后就得到如下这样的头部

自定义主题头部

循环输出文章内容







<div id="posts" class="fl">
  <?php //判断是否有文章存在 if(have_posts()): while(have_posts()): //获取文章信息并存入全局变量$post中 the_post(); ?>






<div class="post-item">






<div class="post-title">
      <?php /*输出文章标题和链接*/ ?>
      <a href="<?php the_permalink?>">






<h2><?php the_title(); ?></h2>






</a>
    </div>












<div class="post-content">
      <?php /*输出文章内容*/ ?>
      <?php the_content(); ?>
    </div>












<div class="post-meta">
      <?php /*输出文章所属分类*/ ?>
      <?php the_category(); ?>
      <?php /*输出文章作者*/ ?>
      <?php the_author(); ?>
      <?php /*输出文章发布时间*/ ?>
      <?php the_time('Y-m-d'); ?>
      <?php /*输出编辑文章链接*/ ?>
      <?php edit_post_link('Edit','|',''); ?>
    </div>






  </div>






  <?php endwhile; else: echo "当前博客没有文章可供显示"; endif; ?>
</div>







侧边栏和翻页

调出翻页功能只需使用posts_nav_link()即可,而侧边栏使用get_sidebar(),如








<div class="nav_link fl">
  <?php posts_nav_link(); ?>
</div>







<?php get_sidebar(); ?>

通常需首先在functions.php中注册小工具(可同时注册多个小工具),这样才会在后台外观菜单下出现小工具从而进行拖放编辑,例如:

//注册一个侧边栏的小工具
 register_sidebar(
  array(
    'name' => '侧边栏',
    'before_widget' => '






<div class="sbox">',
    'after_widget' => '</div>







',
    'before_title' => '






<h2>',
    'after_title' => '</h2>







'
  )

在主题根目录下创建sidebar.php,使用dynamic_sidebar()调出后台小工具中设置的内容(该函数中可传入register_sidebar中的name值)








<div class="fr rightbox">
  <?php dynamic_sidebar(); ?>
</div>







但有时为防止小工具中未加入内容或者只是为了提高一些灵活性,也可以在side.php中自行加入相应模块,只需通过is_dynamic_sidebar()进行判断,然后输出相应模块即可。比如:






<div class="fr rightbox">
	<?php if(is_dynamic_sidebar()): dynamic_sidebar(); else: ?>





<div class="sbox">





<h2>分类</h2>










<ul>
			<?php wp_list_cats(); ?>
		</ul>





	</div>










<div class="sbox">





<h2>页面</h2>










<ul>
			<?php wp_list_pages(); ?>
		</ul>





	</div>





	





<div class="sbox">





<h2>注册登录</h2>










<ul>
			<?php wp_register(); ?>
			<?php wp_loginout(); ?>
		</ul>





	</div>





		
	<?php endif; ?>
</div>





常用的封装文件

如同侧边栏一样,头部和底部通常也是相同的,所以较为推荐的做法是在主题目录下创建header.php和footer.php,然后使用get_header()和get_footer()函数来进行调用。

分类页模板:

category.php

如果想要不同分类调取不同分类的话,可以使用category加中间杠后接需使用该模板的分类Id号或别名(slug)来进行命名,如category-2.php或category-wordpress.php

也可以通过在category.php中通过判断id号来调用不同模板,比如

if ( is_category(array(1,2,3)) ) {
  include(TEMPLATEPATH . '/abc.php');
}else{
  include(TEMPLATEPATH . '/def.php');
}

还有一种类似的方法

$cat_ID = get_query_var('cat');
$cat = get_category($cat_ID);
$slug=$name = $cat->slug;

if ( '' !== locate_template(  array("template-parts/category-$slug.php")  ) ) {
     get_template_part( 'template-parts/category', $slug );
}else{
	get_template_part( 'template-parts/category', 'default');
}

 

文章页模板

single.php

除了前面介绍的方法外还可以通过previous_post_link()和next_post_link()来输出上一篇和下一篇文章标题链接,同是还可以自定义文本,如previous_post_link(‘上一篇:%link’)

文章页面后台编辑页面中可以添加自定义栏目,名称和值将存放在wp_postmeta表中,可通过get_post_meta()来获取,如

get_post_meta($post->ID, ‘test’, true),其中true返回字符串,false返回数组

独立页面模板

独立页面默认调用index.php作为模板,可通过新建page.php来作为独立页面模板。如果要单独为某一独立页面设置模板的话,可以在模板根目录中创建page-id.php,其中的id为该独立页面的id号。同样地,也可以采用页面别名page-slug.php的方式。

评论文件

评论文件为根目录下的comments.php,然后在相应位置中通过comments_template()进行调用,与评论相关的数据表为wp_comments, wp_commentmeta。

可以通过comments_open()方法判断是否开启了评论功能,对于文章页面可以通过讨论栏止开启或关闭评论(如未找到请点击右上角显示选项进行勾选显示),

对于有密码保护的页面可使用post_password_required()函数进行判断

if(!comments_open()):
  echo "评论功能已关闭";
elseif(post_password_required()):
  echo "请输入密码查看评论";
elseif(!have_comments()):
  echo "还没有评论,赶紧来评论吧!";
else:
  wp_list_comments();
endif;

comment_registration通过后台设置>讨论下的用户必须注册并登录才可以发表评论开启


if(get_option('comment_registration') && !is_user_logged_in()):
  echo '你必须<a href="'.wp_login_url().'">登录</a>才能发表评论';
elseif(comments_open()):
  comment_form();
endif;

搜索页面

和其它页面一样,如果没有search.php文件,搜索页将会调用index.php作为模板,所以请创建search.php文件作为搜索页面

404页面

和其它页面一样,如果没有404.php文件,404页面将会调用index.php作为模板,所以请创建404.php文件作为404页面

WordPress SEO Ultimate插件去广告

很多使用Wordpress的朋友都会使用SEO Ultimate这个插件,它涉及到SEO的方方面面,比如可以通过它设置文章的title和description,同时对于没有编程基础的朋友通过Code Inserter来在header和footer中插入一些统计代码之类的JS也相当便捷,还可以在不调取服务器日志的情况下查看有哪些蜘蛛或个人访问过的404页面等等。

但是Alan经常在笔记本电脑上查看这个404页面报表时会发现右边的广告遮挡导致没有办法展开查看User Agent信息,很明显广告下方提到想要去除广告升级到SEO Ultimate+就好了,自然这是需要付银子的。于是对于这小小的不便Alan查看了一下代码,发现还是比较容易解决的。

SEO Ulimate广告

具体解决方法(以最新版7.6.5.8为例),打开wp-content/plugins/seo-ultimate/modules/class.su-module.php将3062行以下的相关代码进行注释即可,注释后的代码如下:

	function promo_sdf_banners() {
		
		//if ($this->should_show_sdf_theme_promo()) {	
			?>
			<!--div id="sds_promo_blog_post" class="hide">
			<?php $this->promo_sdf_banners_rss_output( 'http://feeds.seodesignsolutions.com/SeoDesignSolutionsBlog', array('show_summary' => 1, 'show_date' => 0, 'items' => 1) ); ?>
			</div>


<div id="sdf-promo-carousel"></div>



Remove these ads?
			<a href="https://seoultimateplus.com/?ref=su-rmv-ad" target="_blank" title="Upgrade to SEO Ultimate+">Upgrade to SEO Ultimate+</a></p-->
			<?php
		//}	

WordPress主题模板开发系列之数据库

数据库表前缀在安装时指定,记录在根目录下的wp-config.php的$table_prefix变量中,默认值为wp_,共11张表:

Wordpress数据库结构

文章评论信息表
wp_commentmeta(文章评论额外信息表)
wp_comments(文章评论信息表)
链接信息表
wp_links
基本配置信息表(对应后台设置>常规中的配置)
wp_options
文章信息表
wp_postmeta(文章额外数据表,文章的自定义字段等所存储的表格)
wp_posts
分类信息表
wp_terms(分类、标签的基础信息表)
wp_term_relationships(分类与文章、链接、菜单的关联表)
wp_term_taxonomy(分类补充信息表,区分terms信息的分类类型,有category, link, tag, nav_menu四种分类类型)
用户信息表
wp_usermeta(用户额外信息表)
wp_users(用户基本信息表,存放系统所有用户基本信息)

WordPress主题模板开发系列之核心文件

WordPress之强大不仅在于创建博客上,它还可用于搭建论坛、官网乃至电商网站。Alan使用Wordpress也有一些年头了,但一直都没有深入研究过,最近出于工作需要,决定学习Wordpress开发相关的知识,于是便有了这个Wordpress主题模板开发系列,边学习边总结。

第一步决定先从安装完成后的官方文件结构开始,打开Wordpress根目录,会看到如下文件或目录:

Worpress根目录文件和目录
下面我就来逐个分析主要的文件或目录的作用

index.php – WordPress入口文件,调用wp-blog-header.php
license.txt – WordPress授权许可文件
readme.html – WordPress安装、升级和在线资源等说明文件
wp-activate.php – 用户注册激活文件
wp-blog-header.php – 用于加载Wordpress的环境和模板,调用wp-load.php和 wp-includes/template-loader.php
wp-comments-post.php – 接收评论并添加到数据库
wp-config.php – MySQL数据库连接信息的配置文件,安装后自动生成
wp-config-sample.php – wp-config.php的示例文件
wp-cron.php – 用于执行定时任务的文件
wp-links-opml.php – 生成OPML格式的友情链接列表(WordPress 3.5以后需安装Link Manager插件来添加友情链接)
wp-load.php – 加载wp-config.php、设置路径常量、加载Wordpress类库
wp-login.php – 处理用户注册、登录、密码重置等的页面代码
wp-mail.php – 通过接收邮件发布文章
wp-settings.php – 运行前的例行程序,包括检查安装是否正确、使用辅助函数、应用用户插件、初始化执行计时器等等
wp-signup.php – 定义注册新用户账号、新分站的页面
wp-trackback.php – 处理Trackback请求
xmlrpc.php – 远程发布功能

wp-admin – 存放后台管理需要的类和文件
wp-includes – 存放wordpress强大的类库及核心函数的定义
wp-content – 存放语言包,插件、模板、上传文件等

Worpress常用函数

为方便Wordpress的二次开发的常见修改,将在本帖中整理一些经常使用的Wordpress函数,以便查找。

主要文件和目录

index.php    首页

header.php    头部

footer.php    底部

sidebar.php    侧边栏

category.php    目录页

single.php   文章页

functions.php    主题自定义函数

style.css    主css文件

Action和Filter相关

add_action(‘alan’, ‘functionA’)    将函数functionA挂载到动作alan上,还有优先级等可选参数

do_action(‘alan’)    执行挂载在动作alan上的所有函数

WordPress内置的Action请参阅:http://codex.wordpress.org/Action_Reference

add_filter(‘alan’, ‘functionA’)   将函数functionA挂载到过滤器alan上,还有优先级等可选参数

apply_filters(‘alan’, $arg)    将$arg传入挂载在动作alan上的所有函数并执行

WordPress内置的Filter请参阅:http://codex.wordpress.org/Plugin_API/Filter_Reference

首页分类相关

bloginfo()    获取博客相关信息

get_header()

get_sidebar()    调用默认侧边栏的内容或sidebar.php的内容

register_sidebar()    用于在functions.php中注册小工具,在后台外观>小工具中进行编辑,并通过dynamic_sidebar()函数调用

get_footer()

get_template_part()

the_archive_title()

posts_nav_link()    输出页码,可进行上下页翻页

wp_list_cats()    获取分类列表

single_cat_title()    获取当前分类名称

数据库相关

get_option()    从options表中取出数据

update_option()    向options表中插入数据

$wpdb->insert()    向指定表插入一条数据

$wpdb->insert_id    获取最新插入行的id

$wpdb->prefix    获取数据表前缀

$wpdb->update()    更新指定数据表中满足指定条件的记录

$wpdb->get_var()    通过传入SQL语句来获取指定的数据

$wpdb->query()    执行原生的SQL语句(DELETE, UPDATE)

$wpdb->get_results()    获取SELECT语句查询结果

$wpdb->get_row()    获取一行SELECT语句查询结果

$wpdb->show_errors()    开启显示SQL报错(在执行语句前开启)

$wpdb->last_error    获取上一次SQL语句的执行错误信息

$wpdb->print_error()    打印当前执行的最后一条SQL错误信息(需要先开启报错)

$wpdb->hide_errors()    隐藏SQL报错

文章相关

have_posts()    判断是否有文章存在

get_post()/the_post()    获取或输出文章

get_posts()    根据传入的限定条件来显示多篇文章

get_permalink()    获取文章或页面链接

wp_list_pages()    获取页面列表

get_links()    获取友情链接

get_the_category()/the_category()    获取或输出文章分类

get_category_link()    获取分类链接

the_author()    输出文章作者

the_time(‘Y-m-d’)    输出文章发布时间(可自行定义格式)

edit_post_link(‘Edit’,’|’,”)    输出编辑文章链接(第一个值为输出的内容,第二个值为其前面输出的内容,第三个值为其后面输出的内容)

previous_post_link()/next_post_link()    当前文章上/下一篇文章标题链接(可自定义相关的文本,如previous_post_link(‘上一篇:%link’))

get_post_meta()    获取通过自定义栏目中所设定的值,如(get_post_meta($post->ID, ‘test’, true),true获取字符串,false获取数组,若名称前带下划线的则会在后台中隐藏,无法直接编辑),相关的函数还有add_post_meta(), update_post_meta(),和delete_post_meta()

get_the_ID()    获取文章的id号,等同于$post->ID

comments_open()    判断文章是否开启了评论功能

have_comments()    判断是否存在评论

wp_list_comments()    输出评论信息

comment_form()    输出评论表单

post_password_required()    判断是否密码保护的文章

is_user_logged_in()    判断用户是否登录

wp_login_url()    登录链接

get_search_form()    获取搜索框

get_search_query()  获取当前搜索词,也可使用$s来进行获取

wp_nav_menu()    调取导航,有多个菜单供选择时可传入array(‘menu’=>’test’)来获取指定菜单

is_home()/is_category()/is_search()/is_404()/is_page()/is_single()    判断是否首页、分类页、搜索页、404页、独立页面、文章页

$paged    当前页数,第一页值为0

获取所属的第一个分类名

$categories = get_the_category();
 
if ( ! empty( $categories ) ) {
    echo esc_html( $categories[0]->name );   
}

 

想要查看更全的参考手册,请参见:https://developer.wordpress.org/reference/functions/

WordPress常见问题

WordPress中如何为文章添加分页?
WordPress中的行距问题
WordPress迁移或更换域名相关
迁移主机后图片无法上传
删除或限制Wordpress中的revision
如何为Wordpress添加Gzip压缩?
WordPress如何切换域名?
WordPress如何防渗透黑客攻击?
WordPress如何为文章中指定关键词添加超链接?
访问后如出现File not found的报错(Nginx)
正在执行例行维护,请一分钟后回来。
如何自定义Wordpress登录后台

小技巧

1.Smartideo插件可用于直接输入QQ等视频网址而直接显示视频并自动适配电脑和移动端

另通过过vid获取QQ视频的网址方法:http://v.qq.com/page/y/o/0/{vid}.html

2.在Mac上编辑文章时可按下Command+Control+Space来调出Emoji窗口输入表情符号
Mac 在Wordpress上输入表情符号3.Google字体库, Gravitar等国内访问慢的问题,可以通过WP Acceleration for China等插件解决这一问题,对应的文件在wp-includes/script-loader.php中

 

WordPress中如何为文章添加分页?

在Wordpress中发表较长的文章时,会希望添加分页的功能,避免一个页面中内容过于庞杂。在默认的编辑器(TinyCME)中,却找不到相应按钮,只有一个插入Read More的按钮。细心的朋友在插入Read More后进入代码编辑部分会看到<!–more–>(快捷键Alt+Shift+T)这样一行代码,事实上添加页面可以使用相似的方法,即在代码对应部分添加<!–nextpage–>(在视图编辑模式也可使用快捷键Alt+Shift+P),这样就可以实现分页的功能了。

 Wordpress中的行距问题

在视图编辑窗口,按下Enter键会发现行距较大,中间间距占一行,事实上通过快捷键Shift+Enter 就不会出现大行距的情况了。

WordPress迁移或更换域名相关

WordPress迁移如同其它网站一样,需要两部分内容,一部分是网站代码文件,根据所使用系统不同位于public_html,www或htdocs等文件夹下;另一部分就是数据库文件(如使用phpmyadmin可使用export导出,import导入),可以分别打包进行迁移。如进行域名更换则需对后台Settings>General下Wordpress Address和Site Address的进行更换(也可更改数据库中wp_options表option name为siteurl和home的option_value值)。

对于已有内容的网站通常则更为复杂一些,因为之前的文章中会有链接、图片等内容写在wp_posts表中,以从www.foo.com/blog更换为blog.foo.com为例,需要对wp_posts表进行如下操作:
1.update wp_posts set guid = replace(guid, ‘http://www.foo.com/blog’,’http://blog.foo.com’)

2.update wp_posts set post_content = replace(post_content, ‘http://www.foo.com/blog’,’http://blog.foo.com’)

同时提醒各位关注.htaccess文件,很多时候需要对此文件也进行相应更改。

迁移主机后图片无法上传

这一错误提示内容类似:Unable to create directory uploads/2014/07. Is its parent directory writable by the server?
检查父级目录wp-content,如果所有者无可写权限(数字看是否为7,字母看是否为rwx),则将权限修改为755即可。如果权限没有问题,这通常会发生在通过GoDaddy等主机的一键安装Wordpress站点上,因为一键安装会默认在Settings>Media下写入一个绝对地址,而迁移站点后绝对地址会发生改变,将其修改为默认路径wp-content/uploads即可。

删除或限制Wordpress中的revision

WordPress会在对帖子进行编辑时进行autosave自动保存,同时每次对帖子修改后都会保存一个revision版本,这样导致如果对同一个帖子进行多次编辑后产生大量的垃圾文件,占用不必要的空间。(据考证这并不会像大家所认为的那样影响到网站的访问速度)
有这么几种方法可供参考,一是安装一款名为Better Delete Revision的插件,二是直接在数据库中进行删除处理,参考语句如下:
DELETE FROM wp_posts WHERE post_status!=’publish’ OR post_type=’revision’;
第三种方法是在wp-config.php文件上方添加如下代码(加粗部分),WP_POST_REVISIONS值表示保存的revision数量,设为false表示不保存
* @package WordPress
*/

define(‘WP_POST_REVISIONS’, 3);

// ** MySQL settings – You can get this info from your web host ** /

 

如何为Wordpress添加Gzip压缩?

WordPress中添加Gzip压缩的方法很多,这里介绍一种修改.htaccess文件来实现Gzip压缩的方法。开启Gzip压缩首先要先确认服务器是否已开户该模块,这个可以通过phpinfo()等方法进行验证。这里介绍的方法是在.htaccess中添加如下代码:

# Insert filters
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE image/svg+xml
# Drop problematic browsers
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E]!no-gzip !gzip-only-text/html
# Make sure proxies don‘t deliver the wrong content
Header append Vary User-Agent env=!dont-vary

禁止爬虫爬行

想要禁止搜索引擎爬行可通过在meta中添加noindex, nofollow信息或在robots.txt中添加disallow两种方式,前者是后台Settings>Reading下勾选Discourage search engines from indexing this site来实现的。这通常在调试安装博客时使用。

 删除所有垃圾评论

在博客有了一定的访问量后,垃圾评论会非常多,在后台删除会比较耗时,可以直接在数据库中删除所有未审核通过的评论:

DELETE FROM wp_comments WHERE comment_approved = 0

此外也可通过强制仅登录客户才可评论来减少垃圾评论,只需在Settings > Discussion内将Other comment settings下面的

文字换行

有时比较长的链接或字符串会导到前后内容断开而单独作为一行显示,这进只要在p标签或相应内容的css上添加上word-break:break-all;即可以了。

WordPress如何切换域名

主要需要修改如下数据表

UPDATE wp_options SET option_value = replace( option_value, 'http://旧域名', 'http://新域名') WHERE option_name = 'home' OR option_name ='siteurl' ;
UPDATE wp_posts SET post_content = replace(post_content, 'http://旧域名', 'http://新域名');
UPDATE wp_posts SET guid = replace( guid, 'http://旧域名', 'http://新域名') ;

此外出于seo考虑,应在.htaccess文件中添加301转向的相应代码

WordPress如何防渗透黑客攻击?

1.设置文件及目录权限

Linux下的参考命令(-type d为目录,-type f为文件):

find /path/to/your/wordpress/install/ -type d -exec chmod 755 {} \;
find /path/to/your/wordpress/install/ -type f -exec chmod 644 {} \;

2.设置自动更新
不论是禁止还是开启自动更新,都是在wp-config.php中设置,以下提供一些常用的设置代码
禁止一切更新

define( 'AUTOMATIC_UPDATER_DISABLED', true );

核心组件更新

define( 'WP_AUTO_UPDATE_CORE', false );

有三个可选值
true – 开发版,小更新,大更新都会自动更新。

false – 开发版,小更新,大更新都不会自动更新。

minor – 只有小版本更新才会自动更新
通过过滤器来设置是否自动更新
开启开发更新模式,和开发版本同步:

add_filter( 'allow_dev_auto_core_updates', '__return_true' );

关闭小版本更新:

add_filter( 'allow_minor_auto_core_updates', '__return_false' );

开启大版本更新:

add_filter( 'allow_major_auto_core_updates', '__return_true' );

开启插件自动更新:

add_filter( 'auto_update_plugin', '__return_true' );

开启主题自动更新:

add_filter( 'auto_update_theme', '__return_true' );

翻译更新默认是开启的,如果要关闭:

add_filter( 'auto_update_translation', '__return_false' );

3.数据库权限控制

WordPress中任何常规操作如添加文章、上传图片、添加评论、安装插件等都只涉及到增删改查的数据库操作,像DROP, ALTER, GRANT这样的权限则可不予以授权。

注:有些插件、主题或Wordpress的重大更新可能会更改数据库结构,这时则需要临时进行相关授权。

4.wp-includes的保护机制

通过更改根目录下的.htaccess文件可以防止攻击脚本使用mod_rewrite重写模块,注意请将以下代码放在# BEGIN WordPress和# END WordPress的外面,以防在更新时该内容被覆盖

# Block the include-only files.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

5.wp-config.php保护机制

可将wp-config.php从Wordpress的根目录中前移到上一级目录,另外可在.htacess的最上面添加如下代码禁止外部人员访问该文件

<files wp-config.php>
deny from all
</files>

6.禁止文件编辑

WordPress后台中默认允许管理员编辑PHP文件,可通在wp-config.php中添加以下代码来限制这种编辑

define( 'DISALLOW_FILE_EDIT', true );

攻击脚本中通常可能会包含eval(), exec(),base64_encode() / base64_decode, shell_exec(), gzinflate(), fopen(), curl_exec(), popen(),可在Linux下cd到博客根目录导出相关的文件进行查看,如

grep -irl "eval(\|exec(\|base64(" ./ > ../testlog

以上只是列举一部分例子,要保障自身博客的安全,需要在平时就多注意,比如在插件和主题的选择上等等。

WordPress如何为文章中指定关键词添加超链接?

这一功能可通过很多插件来实现,我们介绍一种无需插件即可轻松实现该功能的方法。找到当前主题目录下的functions.php文件(后台点击Appearance>Editor亦可找到该文件)并添加如下代码:

function replace_text_wp($text){  
    $replace = array(  
        'keyword1' => '<a href="http://alanhou.org/" rel="bookmark" title="keyword1">keyword1</a>',
	'keyword2' => '<a href="http://alanhou.org/" rel="bookmark" title="keyword2">keyword2</a>',  
    );  
    $text = str_replace(array_keys($replace), $replace, $text);  
    return $text;  
}  
  
add_filter('the_content', 'replace_text_wp');  

6/1/2016更新

1.此更新解决在img的alt属性或a标签的title属性出现同一关键词时会同时被替换导致代码错乱的问题

2.解决大小写替换问题(如需区分大小写请将str_ireplace替换为str_replace)

function replace_text_wp($text){  
	$parts = preg_split('/(<(?:img.*|a.*)>)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
	$replace = array(  
        'keyword1' => '<a href="http://alanhou.org/" rel="bookmark" title="keyword1">keyword1</a>',
	'keyword2' => '<a href="http://alanhou.org/" rel="bookmark" title="keyword2">keyword2</a>',  
    );  
	);  
	for ($i=0, $n=count($parts); $i<$n; $i+=2) {
		$parts[$i] = str_ireplace(array_keys($replace), $replace, $parts[$i]); 
	}
	$text = implode('', $parts);
	return $text;  
}
add_filter('the_content', 'replace_text_wp');

后台”添加媒体”、”插入或编辑链接”点击没有反应

打开wp-config.php,在最后面加上如下代码

define('CONCATENATE_SCRIPTS', false );

‘WP_Session_Tokens’ not found

这一报错发生在登录到后台时,出现这一问题的原因通常是由于不当升级所致,请下载最新的Wordpress版本并合并覆盖到根目录下(注意备份好wp-config.php),然后执行wp-admin/upgrade.php文件完成升级

Fatal error: Class 'WP_Session_Tokens' not found in D:\xampp\htdocs\wordpress\wp-includes\pluggable.php on line 900

 

访问后如出现File not found的报错

这一问题通常出现在Nginx服务器上,细心的朋友会发现url中间少了wp-admin这一块。解决这一问题需要在该网站Nginx配置文件server的结束花括号}前添加如下配置

rewrite /wp-admin$ $scheme://$host$uri/ permanent;

 

正在执行例行维护,请一分钟后回来。

一般在升级主题、插件时会进行维护模式,此时访问网站就会出现“正在执行例行维护,请一分钟后回来。”的提示,这时登录SSH或FTP,找到根目录下的.maintenance文件并删除即可。

It may be down for maintenance or configured incorrectly.

这一报错通常出现在升级未正常完成的时候,首先尝试删除根目录下的.maintenance文件,看是否还会出现同样的报错。如果报错依然存在,请打开根目录下的wp-config.php,并将

define(‘WP_DEBUG’, false);

修改为

define(‘WP_DEBUG’, true);

这样就会出现具体报错信息,比如升级文件缺失等,可以针对具体问题进行具体解决

Server error

500

The website encountered an error while retrievinghttp://XXX.com/XXX. It may be down for maintenance or configured incorrectly.

如何自定义Wordpress登录后台

很多朋友在使用Wordpress时都会有想要修改后台登录界面的冲动,下面就介绍如何进行相关修改

Wordpress登录后台

大家最希望修改的可能就是上面的logo部分,这个图片部分实际上是通过CSS写到如下内容中的

<a href="https://wordpress.org/" title="Powered by WordPress" tabindex="-1">记录点滴生活  | Alan Hou的个人博客</a>

想要修改图片,只需在主题文件的functions.php中添加如下代码

function my_login_logo() { ?>





<style type="text/css">
        .login h1 a {
            background-image: url(<?php echo get_stylesheet_directory_uri(); ?>/images/logo.png); //替换成相应的图片地址
            padding-bottom: 30px;
        }
    </style>





<?php }
add_action( 'login_enqueue_scripts', 'my_login_logo' );

与logo相关的还有其中的链接和title,这部分可以通过如下代码来进行修改

function my_login_logo_url() {
    return home_url();
}
add_filter( 'login_headerurl', 'my_login_logo_url' );

function my_login_logo_url_title() {
    return '记录点滴生活  | Alan Hou的个人博客';
}
add_filter( 'login_headertitle', 'my_login_logo_url_title' );

当然很多完美主义者一定会不满足于此,那么就可以添加自己的css和js文件,在functions.php中添加代码如下:

function my_login_stylesheet() {
    wp_enqueue_style( 'custom-login', get_template_directory_uri() . '/style-login.css' );
    wp_enqueue_script( 'custom-login', get_template_directory_uri() . '/style-login.js' );
}
add_action( 'login_enqueue_scripts', 'my_login_stylesheet' );

To perform the requested action wordpress needs to access your web server. 

在本地进行插件或主题安装时出现上述报错,解决方法是在wp-config.php中加入

隐藏Admin Toolbar

针对用户可在Users>Your Profile中进行操作,而全局隐藏可通过在functions.php中添加如下代码:

如何通过数据库修改主题

 

博客迁移完成随笔

暂别的博客终于回归正常,最近由于工作计划以及迁移服务器等原因,博客已经搁置一段时间了,迁移服务器中迁移域名花去了较长的时间。将域名转移到另一家服务商并非难事,只要获取授权码,将域名置于解锁状态,然后在新的服务商按照迁移的程序注册该域名即可。只是这中间等待原服务商的最终确认需要花费一些时间,Alan大概用去了一周时间,原本博客也不至于宕机这么多天,我也在老域名服务商处将域名解析到了新的空间,只时本博客安装在子目录下,Alan也无心去重新修改至根目录,就导致中断了这么些无法访问。
在这次迁移中,还发现了.htaccess中一些不当代码导致报出500错误,原本以为是服务商的问题,后来确认才发现是这个问题。对于迁移内容没啥好说的,拷贝目录中所有内容,并导入数据库即可,当然还需要重新设置配置文件,wordpress默认在在wp-config.php中设置数据库名称、用户等信息。
Alan的博客七拼八凑也快满100篇,也见证了Alan的一些进步,当然在电子商务这一行学习新事物是一门必修课,在这方面还需要做更多的努力。
欣慰的是我的测试站http://liuantea.com/在短短的时间内排名在百度上也有了进步(六安茶叶网排名第一,六安茶叶排名第二,六安瓜片核心关键词也挤入前十页),主要还是内容建设,当然作为新站百度的收录页面还是很少的,这是没有办法的事,绿萝算法等更新对于新站内容页的收录就是非常缓慢。现在计划也很简单,先做内容建设一段时间,等差不多过了沙盒期之后再开始逐步进行社交整合、产品页面的优化等更深入的部分。既然是一个测试项目,我也不会急于实现什么目标,而且任何项目都不排除失败和犯错的可能性,平常心最重要。

六安茶叶网首页