“立即发布”,具有自定义帖子状态

时间:2016-06-29 作者:jetlej

我已注册了自定义帖子状态“编辑”。每当帖子更改为使用该状态时,发布时间将设置为状态更改的时间,而不是“立即”。

这很令人沮丧,因为我的编辑们通常没有注意到这一点,并且在过去的两天内发布了文章。

代码如下:

// Register Custom Post Status
function custom_post_status() {

    $args = array(
        \'label\'                     => _x( \'Editing\', \'Status General Name\', \'futurism\' ),
        \'label_count\'               => _n_noop( \'Editing (%s)\',  \'Editing (%s)\', \'futurism\' ),
        \'public\'                    => false,
        \'internal\' => true,
        \'private\' => true,
        \'protected\' => false,
        \'show_in_admin_all_list\'    => true,
        \'show_in_admin_status_list\' => true,
        \'exclude_from_search\'       => true,
        );
    register_post_status( \'editing\', $args );

}
add_action( \'init\', \'custom_post_status\' );

// Add the option to the select menu in wp-admin because Wordpress doesn\'t do this for you
function append_post_status_list(){
    global $post;
    $complete = \'\';
    $label = \'\';
    if($post->post_status == \'editing\'){
        $complete = \' selected=\\"selected\\"\';
        $label = \'<span id=\\"post-status-display\\"> Editing</span>\';
    }
    echo \'
    <script>
        jQuery(document).ready(function($){
            $("select#post_status").append("<option value=\\"editing\\" \'.$complete.\'>Editing</option>");
            $(".misc-pub-section label").append("\'.$label.\'");
        });
    </script>
    \';
}
add_action(\'admin_footer-post.php\', \'append_post_status_list\');

1 个回复
最合适的回答,由SO网友:birgire 整理而成

几点注意事项我们可以在post_submit_meta_box(()post_date_gmt 等于\'0000-00-00 00:00:00\'.

我们可以看到here 在内部wp_update_post()herehere 在内部wp_insert_post(), 如何起草、待决或自动起草帖子没有日期戳。

看起来我们在post状态数组上有一个过滤器herehere 我们可以很容易地为客户解决这个问题editing 地位我还想知道从register_post_status() 设置?

应该可以修改post_date_gmtwp_insert_post_data 滤器在这里,我们可以尝试从hidden_post_statushidden_post_status $postarr 字段。

方便的transition_post_status 钩子,在更新帖子之前但在wp_insert_post_data 滤器因此,在这个阶段调整相应的数据库值是行不通的,因为它将在不久后被覆盖。

post_updated 更新帖子后,钩子将激发。此挂钩提供了一种简单的方法来比较更新之前和更新之后的post对象。

示例这里有一个示例,我们可以post_updated 清除post_date_gmt 对于发布,当新状态为编辑,而前一状态既不是发布也不是编辑时:

add_action( \'post_updated\', function( $post_ID, $post_after, $post_before ) use ( &$wpdb )
{
    if( 
           \'editing\' === $post_after->post_status
        && ! in_array( $post_before->post_status, [ \'editing\', \'publish\' ]  )
        && \'post\' === $post_after->post_type
    )
        $wpdb->update( 
            $wpdb->posts, 
            [ \'post_date_gmt\' => \'0000-00-00 00:00:00\' ], 
            [ \'ID\' => $post_ID ] 
        );      

}, 10, 3 );
希望您可以进一步测试这一点,并根据您的需要进行调整。

相关推荐