在私人发布帖子时保持POST_DATE与挂起的POST_DATE相同

时间:2017-04-03 作者:Mayeenul Islam

我正在保存我的CPTprivate status. 因此,过渡将从pendingprivate. 问题是,当这篇文章第一次提交并等待处理时,在post_date 字段(db)。但当帖子发布后,日期更新为当前日期。

我想保留发帖的原始提交日期,即使是后来私下发布的帖子。

所以我做了如下事情:

function mycpt_keep_pending_date_on_publishing( $new_status, $old_status, $post ) {
    if( \'mycpt\' === $post->post_type && \'pending\' === $old_status && \'private\' === $new_status ) :
        $pending_datetime = get_post_field( \'post_date\', $post->ID, \'raw\' );

        // Update the post  
        $modified_post = array(  
            \'ID\'            => $post->ID,  
            \'post_date\'     => $pending_datetime,
            \'post_date_gmt\' => get_gmt_from_date( $pending_datetime )
        );  

        // Update the post into the database  
        wp_update_post( $modified_post );

    endif;
}

add_action( \'transition_post_status\', \'mycpt_keep_pending_date_on_publishing\' );
但它不起作用。原因是什么?

2 个回复
最合适的回答,由SO网友:Paul \'Sparrow Hawk\' Biron 整理而成

@Howdy\\u McGee的评论是正确的:到transition_post_status 如果触发,则帖子已经更新(即写入db)。

你需要做的是wp_insert_post_data, instead of transition_post_status, 具体如下:

add_filter (\'wp_insert_post_data\', \'mycpt_keep_pending_date_on_publishing\', 10, 2) ;

function
mycpt_keep_pending_date_on_publishing ($data, $postarr)
{
    if ($data[\'post_type\'] != \'mycpt\') {
        return ($data) ;
        }

    // this check amounts to the same thing as transition_post_status(private, pending)
    if (\'private\' != $data[\'post_status\'] || \'pending\' != $postarr[\'original_post_status\']) {
        return ($data) ;
        }

    $pending_datetime = get_post_field (\'post_date\', $data[\'ID\'], \'raw\') ;

    $data[\'post_date\'] = $pending_datetime ;
    $data[\'post_date_gmt\'] = get_gmt_from_date ($pending_datetime) ;

    return ($data) ;
}
Note: 我使用了与您相同的函数名,但该函数的主体不同。

SO网友:kaiser

除了其他答案之外,这里还有一个小插件,可以确保代码只执行一次。如果数据被稍后运行的插件重置,请尝试使用PHP_INT_MAX -1 作为优先级(不适用于公共分发的插件)。在这种情况下,必须为remove_filter(), 否则将不会删除回调。

<?php
/**
 * Plugin Name: (WPSE) Static post date
 * Description: Keep the post date as the original date for posts published as private
 */
namespace WPSE;

add_filter( \'wp_insert_post_data\', \'\\WPSE\\save\', 10, 2 );
function save( $post, $raw ) {
    if ( ! in_array( $post[\'post_status\'], [ \'private\', \'pending\', ] ) ) {
        return $post;
    }
    if ( \'your_post_type\' !== $post[\'post_type\'] ) {
        return $post;
    }

    $date = get_post_field( \'post_date\', $post[\'ID\'], \'raw\' );
    $post[\'post_date\'] = $date;
    $post[\'post_date_gmt\'] = get_gmt_from_date( $date );

    return $post;
}

add_action( \'transition_post_status\', function() {
    # Make sure above callback is only triggered once
    remove_filter( \'wp_insert_post_data\', \'\\WPSE\\save\' );
} );
IIRC以上代码的主要问题是private_to_published 筛选器已弃用,因此没有足够具体的内容aside from a post type status filter. 试试下面的插件,看看它是否有效(如果你的帖子类型真的被命名了mycpt):

<?php
/* Plugin Name: (WPSE) Test post type status actions */
add_action( \'private_mycpt\', function( $ID, \\WP_Post $post ) {
    var_dump( current_filter() );
    exit;
}, 10, 2 );

相关推荐

如何通过jQuery Datepicker搜索帖子?

我正在WordPress网站上工作,我有自己的搜索筛选页面,在那里我添加了jquery日期选择器,现在我想按日期选择器搜索帖子?Html Codescript> $(function() { jQuery( \"#datepicker-13\" ).datepicker({ dateFormat : \"yy-mm-dd\" }); $(\"#datepicker-13\").datepicker().datepick