wordpress主题分类目录标题一般都比较简单,而作为权重仅次于主页的一个页面,一个简单的标题往往会造成SEO资源的浪费,为此,思享在网上找了一个可以自定义分类目录标题的方法。同时,也弥补了HMJ-Blog主题meta关键词和描述和主页一样的缺陷。
functions.php中添加代码
代码如下:
//分类目录 SEO 优化
add_action('edit_category_form_fields', 'category_function');
function category_function(){
if(isset($_GET['action']) && $_GET['action'] == 'edit') $value = get_option('cat_set_' . $_GET['tag_ID']);
$title = 'cat_title';
$keywords = 'cat_keywords';
//$description = 'cat_description';
?>
<table class="form-table">
</table>
<h2>自定义SEO信息</h2>
<table class="form-table">
<tbody>
<tr class="form-field">
<th scope="row" valign="top"><label for="<?php echo $title ?>">标题</label></th>
<td>
<input name="<?php echo $title ?>" id="<?php echo $title ?>" type="text" value="<?php echo esc_attr(stripslashes($value['title']));?>">
<p class="description">默认调用分类名称作为Head中Title信息。</p>
</td>
</tr>
<tr class="form-field">
<th scope="row" valign="top"><label for="<?php echo $keywords; ?>">关键词</label></th>
<td>
<input name="<?php echo $keywords; ?>" id="<?php echo $keywords; ?>" type="text" value="<?php echo $value['keywords'];?>">
<p class="description">多个关键词用小写逗号“,”分隔开;默认调用分类名称作为Head中KeyWords信息。</p>
</td>
</tr>
<!--<tr class="form-field">
<th scope="row" valign="top"><label for="<?php echo $description; ?>">描述</label></th>
<td>
<textarea name="<?php echo $description; ?>" id="<?php echo $description; ?>" rows="3" cols="30">
<?php echo stripslashes($value['description']); ?>
</textarea>
<p class="description">若未设置,将显示为“关于‘某某’分类下的所有文章。”作为Head中Description信息。</p>
</td>
</tr>-->
</tbody>
</table>
<?php
}
add_action('edit_category', 'save_category_function');
function save_category_function(){
if(isset($_POST['action']) && isset($_POST['taxonomy']) && $_POST['action'] == 'editedtag' && $_POST['taxonomy'] == 'category'){
update_option(
'cat_set_' . $_POST['tag_ID'],
array(
'title' => $_POST['cat_title'],
//'description' => $_POST['cat_description'],
'keywords' => $_POST['cat_keywords'],
'template' => $_POST['cat_template'],
'orderby' => $_POST['cat_orderby'],
'per_page' => $_POST['cat_per_page'],
)
);
}
};
创建header-seo.php文件
文件代码如下:
<?php
if (is_home()){ //首页SEO
$title =get_bloginfo('description')." - ".get_bloginfo('name');
$description = get_option('swt_description');
$keywords = get_option('swt_keywords');
}elseif (is_category()){ //分类目录SEO
$cat_id = get_query_var('cat');
$val = get_option("cat_set_$cat_id");
//分类目录长标题
if(!Empty($val) && $val['title']!=''){
$title = $val['title'].' - '.get_bloginfo('name');
}else{
$title = single_cat_title('', false).' - '.get_bloginfo('name');
}
//分类目录关键词
if(!Empty($val) && $val['keywords']!=''){
$keywords = $val['keywords'];
}else{
$keywords = single_cat_title('', false);
}
//分类目录描述
$description = category_description();
}elseif (is_tag()){ //标签页
$title = single_cat_title('', false).' - '.get_bloginfo('name');
$description = tag_description();
$keywords = single_tag_title('', false);
}elseif (is_single()){ //文章页
$title = $post->post_title.' - '.get_bloginfo('name');
if ($post->post_excerpt){
$description = $post->post_excerpt;
} else {
$description = substr(strip_tags($post->post_content),0,400);
}
$keywords = "";
$tags = wp_get_post_tags($post->ID);
foreach ($tags as $tag ){
$keywords = $keywords . $tag->name . ", ";
}
}
?>
header.php 中引用
不过值得注意的事,因为所有的页面都是共用一个header.php,所以添加引用代码会出现重复的meta标签。所以,我们需要为分类目录创建一个单独的header.php文件,可以复制中代码,创建一个header-categroy.php(也利于自定义H标签)
删除原meta
<title><?php wp_title( '-', true, 'right' ); ?></title>
<meta name="keywords" content="<?php echo $keywords; ?>" />
<meta name="description" content="<?php echo $description; ?>" />
以及之前的一些主页判断代码,都可以删除
添加meta引用代码
代码如下:
<?php include "header-seo.php"; ?>
<title><?php echo $title; ?></title>
<meta name="keywords" content="<?php echo $keywords ?>" />
<meta name="description" content="<?php echo strip_tags($description); ?>" />
header引用修改
将categroy.php中
<?php get_header(); ?>
修改为
<?php get_header(categroy); ?>
设置分类目录
到这里基本已经完成了,到分类目录进行相应的设置即可
20170810更新
网上找到了另外一种方法,也挺简单
标签/分类目录自定义标题
创建如下代码的PHP文件,可以命名为title.php
<?php
//自定义分类标题
class zm_wp_title{
function __construct(){
// 分类
add_action( 'category_add_form_fields', array( $this, 'add_tax_title_field' ) );
add_action( 'category_edit_form_fields', array( $this, 'edit_tax_title_field' ) );
add_action( 'edited_category', array( $this, 'save_tax_meta' ), 10, 2 );
add_action( 'create_category', array( $this, 'save_tax_meta' ), 10, 2 );
// 标签
add_action( 'post_tag_add_form_fields', array( $this, 'add_tax_title_field' ) );
add_action( 'post_tag_edit_form_fields', array( $this, 'edit_tax_title_field' ) );
add_action( 'edited_post_tag', array( $this, 'save_tax_meta' ), 10, 2 );
add_action( 'create_post_tag', array( $this, 'save_tax_meta' ), 10, 2 );
}
public function add_tax_title_field(){
?>
<div class="form-field term-title-wrap">
<label for="term_meta[tax_zm_title]">自定义标题</label>
<input type="text" name="term_meta[tax_zm_title]" id="term_meta[tax_zm_title]" value="" />
<p class="description">搜索引擎优化自定义标题,不填写即为默认标题</p>
</div>
<?php
} // add_tax_title_field
public function edit_tax_title_field( $term ){
$term_id = $term->term_id;
$term_meta = get_option( "zm_taxonomy_$term_id" );
$zm_title = $term_meta['tax_zm_title'] ? $term_meta['tax_zm_title'] : '';
?>
<tr class="form-field term-title-wrap">
<th scope="row">
<label for="term_meta[tax_zm_title]">自定义标题</label>
<td>
<input type="text" name="term_meta[tax_zm_title]" id="term_meta[tax_zm_title]" value="<?php echo $zm_title; ?>" />
<p class="description">搜索引擎优化自定义标题,不填写即为默认标题</p>
</td>
</th>
</tr>
<?php
} // edit_tax_title_field
public function save_tax_meta( $term_id ){
if ( isset( $_POST['term_meta'] ) ) {
$t_id = $term_id;
$term_meta = array();
$term_meta['tax_zm_title'] = isset ( $_POST['term_meta']['tax_zm_title'] ) ? $_POST['term_meta']['tax_zm_title'] : '';
update_option( "zm_taxonomy_$t_id", $term_meta );
} // if isset( $_POST['term_meta'] )
} // save_tax_meta
} // zm_wp_title
$wptt_tax_title = new zm_wp_title();
function the_zm_title() {
$category = get_the_category();
$term_id = $category[0]->cat_ID;
$term_meta = get_option( "zm_taxonomy_$term_id" );
$tax_zm_title = $term_meta['tax_zm_title'] ? $term_meta['tax_zm_title'] : '';
echo $tax_zm_title;
}
function get_current_tag_id() {
$current_tag = single_tag_title('', false);
$tags = get_tags();
foreach($tags as $tag) {
if($tag->name == $current_tag) return $tag->term_id;
}
}
function zm_tag_title() {
$term_id = get_current_tag_id();
$term_meta = get_option( "zm_taxonomy_$term_id" );
$zm_tag_title = $term_meta['tax_zm_title'] ? $term_meta['tax_zm_title'] : '';
echo $zm_tag_title;
}
?>
更新:如果分类拥有子分类$term_id = $category[0]->cat_ID;将无法准确获取当前分类的ID 获取的是自分类的ID,可以改用get_query_var('cat')获取分类ID
把 title.php 文件引入到主题函数functions.php中
//自定义标题
require get_template_directory() . '/title.php';
完成上面的步骤之后,基本上后台就已经出现了分类、标签自定义标题填写框,接下来需要做的就是前台的调用。
把下面的代码放到自定义 Title 中 ,这个需要根据主题情况。
分类标题:
<?php if ( is_category() ) { ?><title><?php $title = the_zm_title(); echo ($title) ? ''.$title.'' : single_cat_title(); ?> - <?php bloginfo('name'); ?></title><?php } ?>
标签标题:
<?php if ( is_tag() ) { ?><title><?php $title = zm_tag_title(); echo ($title) ? ''.$title.'' : single_tag_title("", true); ?> - <?php bloginfo('name'); ?></title><?php } ?>
非常简单,就是判断自定义标题有没有输入,如果没有的话,即显示原标题,如果有自定义标题,则显示自定义标题。