HMJ-Blog主题优化:wordpress分类目录实现自定义标题

自媒体 思享 3576浏览

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 } ?>

非常简单,就是判断自定义标题有没有输入,如果没有的话,即显示原标题,如果有自定义标题,则显示自定义标题。

推荐阅读

WordPress不同分类设置不同模板文件

最近想给博客添加一个问答板块,本来想用插件dw-question-answer实现的,但是后来感觉加在博客里会感觉怪怪的,还不如以后单独搞个社区,至于博客,设置一个单独的样式模板凑合着用就可以了,于是在网上找到了实现不同模板的代码,给大家参考...

如何通过修改标题、关键词,提升排名?

选择合适的关键词。 首先,你要知道你提供的产品或服务的普通叫法,了解产品或服务有没有其他的俗称,了解你的客户是怎么叫这个产品的。最好的办法是多与客户沟通,问问他们一般在网上搜这个产品会怎么搜。 查看同行业竞争对手怎样设置关键词的。 利用各种方式尽可能......

title的作用:如何为页面编写SEO标题

页面标题或“标题标记”是您在百度或其他搜索引擎中搜索内容后出现在搜索结果中的大型超链接,它们用于描述每个页面的内容。 页面标题是百度用于确定网页在SERP(搜索引擎结果页面)中出现的位置的主要SEO(搜索引擎优化)排名因素之一。 在搜索结果中,页面标......