web-dev-qa-db-ja.com

カスタム投稿タイプの投稿をデフォルトで非公開に設定しますか。

たとえば、 'Private Posts'というカスタム投稿タイプを作成し($post_type = itsme_private_posts)、公開時にカスタム投稿タイプの下にあるすべての投稿を自動的に 'Private'に設定するとします。どうすればいいのですか?

StackOverflowの関連質問に対する @ brasofiloの回答 に基づいて、私はこれを試しました:

add_filter( 'wp_insert_post_data', 'itsme_cpt_private', '99', 2 );
function itsme_cpt_private( $data , $postarr ) {
    if( $postarr['post_type'] == 'itsme_private_posts' ) {
        $data['post_status'] = 'private';
    }
    return $data;
}

うまくいきません。つまり何もしません。関数を追加する前の方法はすべてです。まるで関数が存在しないか、あるいは単に何もしないようです。

それから、「 カスタム投稿タイプを非公開にする 」というこの記事に基づいて、私はこれを試しました:

add_filter( 'wp_insert_post_data', 'itsme_cpt_private' );
function itsme_cpt_private( $post ) {
    if( $post['post_type'] == 'itsme_private_posts' ) {
        $post['post_status'] = 'private';
    }
    return $post;
}

それは、私が投稿を公開したり更新したりするときに機能します。良い!しかし、私が新しい投稿( 'Add New')を作成して何もせずに終了すると、 'private'(自動)ドラフトが作成されて保存されます。さらに私はそのことを捨てることすらできません!

基本的に私はそれをする方法を理解することはできません。では、カスタム投稿タイプの投稿をデフォルトで非公開にするにはどうすればよいですか。

5
its_me

あなたの質問のコードの問題は、それがalways interceptsということです。あなたは完全に公表できない、可能なドラフトがないという能力を失います。これがなぜ手に負えない投稿につながるのか私がこれ以上詳しく調べなかったことです。とにかくこれは人が望むものではありません。

Javascriptソリューションがうまくいっていることを嬉しく思いますが、個人的には2つの問題first、投稿を一般公開として保存することができます、second下書きを処理するために、スクリプトはラジオボタンを常にプライベートに設定します。ある意味で、答えに対する2つの解決策があります。


1.投稿タイプを非公開にし、視覚的表示にする。

これが私がポストステータス遷移でそれをすることをもう一度見た理由であり、そして私が言ったように、それは ポストステータス遷移 で行うことができます。

コード:

add_action( 'transition_post_status', 'wpse118970_post_status_new', 10, 3 );
function wpse118970_post_status_new( $new_status, $old_status, $post ) { 
    if ( $post->post_type == 'itsme_private_posts' && $new_status == 'publish' && $old_status  != $new_status ) {
        $post->post_status = 'private';
        wp_update_post( $post );
    }
} 

これはあなたの投稿タイプの公開投稿を非公開にすることを強制します。ドラフトを保存する機能を妨げることなく。これはそれだけでプライベート投稿タイプを持つという問題を解決するのに十分でしょう。
もちろん、公開メタボックスに表示されている投稿タイプの非公開の性質を持たせるのはいいでしょう。このために私はJavaScriptを少し調整しました。主にデフォルトでチェックボックスを設定しないで、表示されているテキストを変更することによって、さらにメモを追加しました。

コード:

add_action( 'post_submitbox_misc_actions' , 'wpse118970_change_visibility_metabox' );
function wpse118970_change_visibility_metabox(){
    global $post;
    if ($post->post_type != 'post')
        return;
        $message = __('<strong>Note:</strong> Published posts are always <strong>private</strong>.');
        $post->post_password = '';
        $visibility = 'private';
        $visibility_trans = __('Private');
    ?>
    <style type="text/css">
        .priv_pt_note {
            background-color: lightgreen;
            border: 1px solid green;
            border-radius: 2px;
            margin: 4px;
            padding: 4px;
        }
    </style>
    <script type="text/javascript">
        (function($){
            try {
                $('#post-visibility-display').text('<?php echo $visibility_trans; ?>');
                $('#hidden-post-visibility').val('<?php echo $visibility; ?>');
            } catch(err){}
        }) (jQuery);
    </script>
    <div class="priv_pt_note">
        <?php echo $message; ?>
    </div>
    <?php
}

情報源:デフォルトで新規投稿の表示設定を非公開にする方法
注: 以下のコードと比較して、ラジオボタンのチェックを外し、メッセージのコードを追加しました。

もちろん、投稿タイプを非公開にするためにJavaScriptを使用する必要はありませんが、視覚的に示されるものを用意するのは常にいいことです。そのため、それは素晴らしい追加です。


2.公開メタボックスでプライベートを標準オプションにする。

@its_meがこれに対する答えを解決策として受け入れたので、これを続けています。私が有用なコードを見つけたというコメントで述べたように、それは post_submitbox_misc_actions にフックすることによってメタボックスの可視性を非公開に設定することの面倒を見る冒頭で述べたように、2つの問題があります。1つは、投稿をpublicとして保存できること、もう1つは、ドラフトの処理を処理するためにラジオボタンを常にprivateに設定することです。ドラフトを持って作業することはまだ可能です。以前ほど直感的ではありませんが、非公開の公開ステータスは強制されていません。

コード:

add_action( 'post_submitbox_misc_actions' , 'wpse118970_change_visibility_metabox_value' );
function wpse118970_change_visibility_metabox_value(){
    global $post;
    if ($post->post_type != 'itsme_private_posts')
        return;
    $post->post_password = '';
    $visibility = 'private';
    $visibility_trans = __('Private');
    ?>
    <script type="text/javascript">
        (function($){
            try {
                $('#post-visibility-display').text('<?php echo $visibility_trans; ?>');
                $('#hidden-post-visibility').val('<?php echo $visibility; ?>');
                $('#visibility-radio-<?php echo $visibility; ?>').attr('checked', true);
            } catch(err){}
        }) (jQuery);
    </script>
    <?php
}

情報源:デフォルトで新規投稿の表示設定を非公開にする方法
注: ここではニーズに合わせてコードを短くしました。

13
Nicolai

上記の答えに基づいて、クライアント(Javascript)の部分で、私がここに来たものです:

add_action( 'post_submitbox_misc_actions' , 'ourcpt_change_visibility_metabox' );
function ourcpt_change_visibility_metabox() {
  global $post;
  if ( 'ourcpt' != $post->post_type ) { return; }
  //else          
  $post->post_password = '';
  ?>
  <script type="text/javascript">
      (function($){
          try {
              $( "<div class='misc-pub-section'><em>(when it's published, the status becomes private)</em></div>" ).insertAfter( $('#post-visibility-select') );
              $('a.edit-visibility').css({'display': 'none'});
          } catch(err){}
      }) (jQuery);
  </script>
  <?php
}

なぜなら私はステータスが正確に何が起こっているのかを見るのが好きだからです。 add_filter( 'wp_insert_post_data'のコードは変更しません。

あなたの解決策を本当にありがとうございました!

0
Olga Farber

これは、デフォルトで投稿の表示を非公開に設定するためにこれまでに見つけた最も「標準的な」方法です。

function wp_118970_force_type_private($post) {
  if ($post['post_status'] != 'trash' && $post['post_status'] != "draft" && $post['post_status'] != "auto-draft") {
    $post['post_status'] = 'private';
  }
  return $post;
}
add_filter('wp_insert_post_data', 'wp_118970_force_type_private');

Post_statusが「ゴミ箱」でないことを確認しなければならないことに注意してください。そうでなければあなたの投稿を削除することはできません。また、投稿の編集中に投稿を「非公開」として設定しないように、「下書き」と「自動下書き」のステータスも確認します。

これにより、JSを追加する必要はなく、可視性は最初から非公開に設定されます。

特定の投稿タイプをターゲットにしたい場合は、次のようにします。

function wp_118970_force_type_private($post) {
  if ($post['post_status'] != 'trash' && $post['post_status'] != "draft" && $post['post_status'] != "auto-draft" && $post['post_type'] == 'my_post_type') {
    $post['post_status'] = 'private';
  }
  return $post;
}
add_filter('wp_insert_post_data', 'wp_118970_force_type_private');

私は最初にここで解決策を見つけました: http://wpsnipp.com/index.php/functions-php/force-custom-post-type-to-be-private/

0