使用 register_post_status() 在 WordPress 创建自定义文章状态

文 / @WordPress主题

关于WordPress自定义文章状态

大多数情况下,WordPress提供的“已发布”、“私密”、“密码保护”等文章状态足够我们使用,不需要创建自定义文章状态。但在遇到特殊需求时,创建自定义文章状态可以更清晰、更合理地处理内容。例如,有一个自定义文章状态需要显示为通知,而对用户而言仍然是可见的。默认的文章状态不能满足此需求,所以必须创建自定义文章状态。本文将介绍如何使用WordPress提供的函数来创建自定义文章状态,以及如何将其添加到文章状态下拉选项和文章类型列表中。

注册WordPress自定义文章状态‘archive’

要在当前主题中创建自定义文章状态,注册一个自定义文章状态,就可以在文章列表中看到筛选链接。要创建一个自定义文章状态,需要在主题的functions.php文件中添加下面的函数注册代码。

<?php
function wizhi_custom_post_status(){
    register_post_status('archive',array(
        'label' => _x('Archive','post'),
        'public' => true,
        'show_in_admin_all_list' => false,
        'show_in_admin_status_list' => true,
        'label_count' => _n_noop('Archive<span class="count">(%s)</span>','Archive<span class="count">(%s)</span>')
    ));
}
add_action('init','wizhi_custom_post_status');
?>

在WordPress初始化时,需要挂载注册自定义文章状态的函数,传入一个参数数组到函数register_post_status完成注册自定义文章状态。完整参数列表请参考官方文档。

添加自定义文章状态到WordPress文章状态下拉选项

WordPress自定义文章状态可以不要显示在编辑页面的文章状态下拉菜单中,而是通过代码添加到下拉菜单中。要完成此操作,需要在主题的functions.php文件中添加下面的代码:

add_action('admin_footer-post.php', 'wizhi_append_post_status_list');
function wizhi_append_post_status_list(){
    global $post;
    $complete= '';
    $label= '';
    if($post->post_type=='post'){
        if($post->post_status=='archive'){
            $complete='selected="selected"';
            $label='<span id="post-status-display">Archive</span>';
        }
        echo'
        <script>
        jQuery(document).ready(function($){
            $("select#post_status").append("<option value="archive"'.$complete.'>Archive</option>");
            $(".misc-pub-section label").append("'.$label.'");
        });
        </script>
        ';
    }
}

上面的代码将在post.php页面的页脚中添加一段jQuery代码。可以通过替换上面代码中的“post”来添加自定义文章状态到自定义文章类型的下拉菜单中。

添加好代码后,编辑一个已发布的文章,然后尝试修改文章状态,如果一切工作正常,应该能看到下拉菜单中的“Archive”选项,如下图所示。

post-status-select

设置文章状态为“Archive”,并更新文章。然后回到文章列表,我们应该看到文章状态筛选器后面的“Archive”链接,如下图所示。

post-status-index-filter

添加自定义文章状态到文章类型列表

为了更好地区分自定义文章状态和普通文章,我们可以添加一个文章状态后缀到文章标题后面,类似默认的“私有”文章状态。要实现此目的,可以在主题的functions.php文件中添加以下代码:

function wizhi_display_archive_state($states){
    global $post;
    $arg= get_query_var('post_status');
    if($arg!= 'archive'){
        if($post->post_status== 'archive'){
            return array('Archive');
        }
    }
    return $states;
}
add_filter('display_post_states', 'wizhi_display_archive_state');

通过自定义文章状态,可以为文章添加不同的状态,例如指定文章类型为“订单”,则可以为该类型添加“已支付”、“已发货”、“已完成”等状态。如果指定文章类型为“商品”,则可以为该类型添加“已过期”、“已上市”、“众筹中”等状态。通过自定义文章状态,可以实现不同的功能。但是,与其他功能注册函数不同,WordPress添加自定义文章状态的函数不太简单直接,如果需求比较多,可以通过插件来添加,从而减少代码量。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。