加载第一个页面时自动更改帖子状态

时间:2014-05-01 作者:Dr.Hariri

我已经使用EdiFlow插件创建了许多自定义帖子状态。现在,我想做的是,如果贡献者访问帖子编辑页面,并且帖子状态为“已分配”以自动更改为“正在工作”。这将允许我知道并在他们开始工作时向他们发送电子邮件(在编辑后加载页面时)。

我正在尝试使用这个代码,它似乎没有任何作用

function educadme_assigned_to_inprogress( $post_id ) {
if ( current_user_can(\'edit_post\', $post_id) && !current_user_can( \'manage_options\' ) ) {

            $post = get_post($post_id);
            if (get_post_type()==\'post\' && $post->post_status ==\'assigned\' && strstr($_SERVER[\'REQUEST_URI\'], \'wp-admin/post-new.php\')) {                                   
                    $post->post_status = \'in-progress\'; // use any post status
                    wp_update_post($post); 
                }
    }
}
add_action(\'add_meta_boxes\', \'educadme_assigned_to_inprogress\');
另一个条件较少的简化版本可能是:

function educadme_assigned_to_inprogress( $post_id ) {
if ( current_user_can(\'edit_post\', $post_id) && !current_user_can( \'manage_options\' ) ) {

            $post = get_post($post_id);
            $screen = get_current_screen();

            if ($screen->base != \'post\')
                return;

            if ($post->post_status ==\'assigned\') {                                      
                $post->post_status = \'in-progress\'; // use any post status
                wp_update_post($post); 
            }
    }
}
add_action(\'add_meta_boxes\', \'educadme_assigned_to_inprogress\');
另一个类似的版本虽然起到了一定的作用,但导致了以下问题:

function educadme_assigned_to_inprogress( $post_id ) {
if ( current_user_can(\'edit_post\', $post_id) && !current_user_can( \'manage_options\' ) ) {

            $post = get_post($post_id);
            if (get_post_type()==\'post\' && $post->post_status ==\'assigned\' && strstr($_SERVER[\'REQUEST_URI\'], \'wp-admin/post-new.php\') || strstr($_SERVER[\'REQUEST_URI\'], \'wp-admin/post.php\')) {                                   
                    $post->post_status = \'in-progress\'; // use any post status
                    wp_update_post($post); 
                }
    }
}
add_action(\'add_meta_boxes\', \'educadme_assigned_to_inprogress\');
此代码的主要问题是,它不仅在指定自定义状态时运行。此外,它在列出所有帖子的页面上运行,而不仅仅在单个编辑帖子页面中运行。也就是说,如果我正在查看帖子列表,它会更改他们的帖子状态!

如有任何建议或更正,将不胜感激。我相信其他人也会觉得这很有用。

2 个回复
最合适的回答,由SO网友:Dr.Hariri 整理而成

经过多次测试,此代码似乎正常工作。如果您有任何改进,请提出建议!我已经对此进行了测试,但我需要更彻底地测试:

function educadme_assigned_to_inprogress() {
global $post;
$id = get_the_ID();
if ( current_user_can(\'edit_post\', $id) && !current_user_can( \'manage_options\' ) ) {

            $post = get_post($id);
            $screen = get_current_screen();             

            if ($screen->base != \'post\')
                return;

            if ( ! function_exists( \'EditFlow\' ) )
                return;

            $post_status = get_post_status();

            if ($post_status ==\'assigned\') {                                    
                $post->post_status = \'in-progress\'; // use any post status
                wp_update_post($post); 
            }
    }
}
add_action(\'admin_head\', \'educadme_assigned_to_inprogress\');
如果您使用另一个post状态插件或自己添加它们而不是EditFlow,请删除此位:

            if ( ! function_exists( \'EditFlow\' ) )
                return;

SO网友:birgire

如果希望默认post状态为in-progress 当投稿者点击“新建帖子”时,您可以尝试以下操作:

/**
 * Set default post status as \'in-progress\' for contributors
 *
 * @link https://wordpress.stackexchange.com/a/143128/26350
 *
 * @param  array $data 
 * @return array $data
 */

function wpse_143100_wp_insert_post_data( $data )
{
    $current_user = wp_get_current_user();      

    if( \'auto-draft\' === $data[\'post_status\']
        && \'post\' === $data[\'post_type\']
        && \'0000-00-00 00:00:00\' === $data[\'post_date_gmt\']
        && in_array( \'contributor\', $current_user->roles, TRUE ) 
    )
        $data[\'post_status\'] = \'in-progress\';

    return $data;
}           

add_filter( \'wp_insert_post_data\', \'wpse_143100_wp_insert_post_data\' );
调查默认的post状态转换非常有用:

点击“新建帖子”:

new -> auto-draft
自动保存:

auto-draft -> draft
手动将post状态更改为“进行中”,然后按“更新”按钮:

draft -> in-progress
new   -> inherit (revision created)
再次按“更新”帖子:

in-progress -> in-progress
您可以使用transition_post_status

更新:

以下是对您的example:

function educadme_assigned_to_inprogress()
{    
    global $post;
    if ( get_current_user_id() == $post->post_author  // current user is the post author
         && \'post\' === get_post_type()                // current post type is \'post\'
         && \'assigned\' === get_post_status()          // current post status is \'assigned\'
         && ! current_user_can( \'publish_post\' )      // current user is \'contributor\'
         && function_exists( \'EditFlow\' )             // Edit flow plugin is installed
    ):
        if ( $post->ID > 0 ):
            $post->post_status = \'in-progress\';  // use any post status
            $pid = wp_update_post( $post );      // update post             
            if ( is_wp_error( $pid ) ):          // debug
                // error_log( $pid->get_error_message(), 1 );
            endif;
        endif;
    endif;
}

add_action( \'admin_head-post.php\', \'educadme_assigned_to_inprogress\');
我使用admin_head-post.php 钩子将其缩小到仅限post屏幕。

post状态将仅更改为in-progress 如果

当前用户是帖子作者当前用户是投稿者已安装编辑流插件当前帖子类型为post.assigned.请注意,您需要刷新以查看更新的状态。

结束

相关推荐