【问题标题】:How to set a WordPress custom post type visibility to private after editing?编辑后如何将 WordPress 自定义帖子类型可见性设置为私有?
【发布时间】:2019-08-15 18:13:33
【问题描述】:

我使用插件创建了自定义帖子类型。注册用户可以从前端插入新帖子并将其保存为草稿。当我在后端编辑它时,我需要它以私人可见性保存。 我发现这个 sn-p 默认设置可见性:

public function force_dpa_request_private( $data , $postarr ) {

    if( empty( $data['post_name'] ) && 'my-cpt' == $postarr['post_type'] )
        $data[ 'post_status' ] = 'private';

    return $data;

}

但它只适用于第一次插入,当我编辑它时,可见性更改为公共......

【问题讨论】:

    标签: wordpress visibility custom-post-type private


    【解决方案1】:

    您可以连接到帖子创建或更新后调用的save_post

     <?php
    
        add_action( 'save_post', 'callback_save_post', 10, 3);
        function callback_save_post( $post_ID, $post, $update ){
            if ( 'my-cpt' === get_post_type( $post_ID) && ! wp_is_post_revision( $post_ID ) ) {
                // unhook this function so it doesn't loop infinitely
                remove_action('save_post', 'callback_save_post', 10 );
    
                // Make the post private if it is edited else make it draft.
                if ( $update ) {
                    $postarr = array(
                        'ID' => $post_ID,
                        'post_status' => 'private'
                    );
                } else {
                    $postarr = array(
                        'ID' => $post_ID,
                        'post_status' => 'draft'
                    );
                }
    
                // Update the post.
                wp_update_post( $postarr );
    
                // re-hook this function.
                add_action( 'save_post', 'callback_save_post', 10, 3);
            }
        }
    

    参考:

    https://developer.wordpress.org/reference/hooks/save_post/

    https://codex.wordpress.org/Function_Reference/wp_update_post

    【讨论】:

    • 不幸的是,这不起作用。我认为第 5 行存在语法错误(remove_action 只接受三个参数),但是系统似乎卡住了(保存帖子非常慢)并且在前端提交了一个不完整的页面后。在后端,我找到了帖子,但它仍然具有私人可见性而不是草稿......
    • @icolumbro 我修复了代码。你能告诉我们错误吗?
    • 它进入无限循环,因为如果我在保存帖子后 var_dump($update) 得到一个完整的永无止境的 bool(true) 页面... :(
    • @icolumbro 好的,让我检查一下。
    • 有什么消息吗?谢谢!
    【解决方案2】:

    与您的问题略有不同,但如果您将所有帖子类型设为私有,您仍然可以在创建时编辑帖子。这样就可以了。

     function force_type_private($post)
      {
      if ($post['post_type'] == 'Your Post Type')
      $post['post_status'] = 'private';
      return $post;
      }
    add_filter('wp_insert_post_data', 'force_type_private');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      • 2011-10-06
      • 2014-02-23
      相关资源
      最近更新 更多