web-dev-qa-db-ja.com

あなたがログインしていないときに働くプライベートページ WP 管理者

私的な投稿/ページの私の理解はあなたが管理者または編集者としてWP管理システムにログインしているときにだけそれらが働くということです。

私は時折リンクを介してカスタム投稿をユーザーに共有する必要があるサイトを持っていますが、それらをサイトの他の場所に表示したくないのです。投稿を「非公開」に設定すると、サイトのホームページや通常表示されるその他の領域から投稿が即座に削除されるため、必要なことはほぼ同じです。

唯一の問題は、プライベート投稿機能がadminにログインしたときに投稿を見たいと思うことです。ログインしていないときは404エラーが出るので、そうではありません。パスワードなしで、標準のパーマリンクで普通に見えるようにする必要があるとき。

これはおそらくプラグインの領域かもしれませんが、私が驚いたことにそれを行うものを見つけていません。

明確にするために、これを実装する必要がある投稿タイプは、サイトが実行するために必要とするプラグインによって定義されたカスタム投稿タイプです。

2
AdamJones

don'tプラグインを使いたい(または必要なことをするものが見つからない)場合は、次のようにしてください。

  1. 投稿をhiddenとしてマークできるようにする カスタムメタボックス を追加します。
  2. 自分のサイトから非表示に設定した投稿を削除するには、 pre_get_posts を使用してクエリを変更します(ただし、直接リンクで利用できます)。

UPDATE

上記の提案に続いて、これは可能な解決策です。

カスタムメタボックスを作成する

まず、登録してカスタムメタボックスを作成します。

function yourtextdomain_add_custom_meta_box() {
  add_meta_box("demo-meta-box", "Custom Meta Box", "yourtextdomain_custom_meta_box_markup", "post", "side", "high", null);
}
add_action("add_meta_boxes", "yourtextdomain_add_custom_meta_box");

メタボックスにマークアップを追加します(この場合はチェックボックス)。

function yourtextdomain_custom_meta_box_markup($object) {
  wp_nonce_field(basename(__FILE__), "meta-box-nonce"); ?>
    <div>
      <br />
      <label for="meta-box-checkbox">Hidden</label>

      <?php $checkbox_value = get_post_meta($object->ID, "meta-box-checkbox", true);
          if($checkbox_value == "") { ?>

          <input name="meta-box-checkbox" type="checkbox" value="true">

      <?php } else if($checkbox_value == "true") { ?>

          <input name="meta-box-checkbox" type="checkbox" value="true" checked>

      <?php } ?>

      <p style="color: #cccccc"><i>When selected, the post will be removed from the WP loop but still accessible from a direct link.</i></p>
    </div>
  <?php
}

これにより、投稿ごとに次のようなメタボックスが表示されます。

そして最後にメタボックスの値を保存します。

function yourtextdomain_save_custom_meta_box($post_id, $post, $update) {
    if (!isset($_POST["meta-box-nonce"]) || !wp_verify_nonce($_POST["meta-box-nonce"], basename(__FILE__)))
        return $post_id;

    if(!current_user_can("edit_post", $post_id))
        return $post_id;

    if(defined("DOING_AUTOSAVE") && DOING_AUTOSAVE)
        return $post_id;

    $slug = "post";

    if($slug != $post->post_type)
        return $post_id;

    $meta_box_checkbox_value = "";

    if(isset($_POST["meta-box-checkbox"])) {
      $meta_box_checkbox_value = $_POST["meta-box-checkbox"];
    }
    update_post_meta($post_id, "meta-box-checkbox", $meta_box_checkbox_value);
}
add_action("save_post", "yourtextdomain_save_custom_meta_box", 10, 3);

wp_postmetaテーブルに、隠しファイルとして保存した投稿に割り当てられたメタ値 'true'が表示されます。

Post Meta Table

pre_get_postsでクエリを修正する

現在は、メインのクエリから非表示としてマークされている投稿を除外するだけの問題です。これをpre_get_postsで行うことができます。

add_action( 'pre_get_posts', 'yourtextdomain_pre_get_posts_hidden', 9999 );
function yourtextdomain_pre_get_posts_hidden( $query ){

  // Check if on frontend and main query.
    if( ! is_admin() && $query->is_main_query() ) {

    // For the posts we want to exclude.
    $exclude = array();

    // Locate our posts marked as hidden.
    $hidden = get_posts(array(
      'post_type' => 'post',
      'meta_query' => array(
        array(
          'key' => 'meta-box-checkbox',
          'value' => 'true',
          'compare' => '==',
        ),
      )
    ));

    // Create an array of hidden posts.
    foreach($hidden as $hide) {
      $exclude[] = $hide->ID;
    }

    // Exclude the hidden posts.
    $query->set('post__not_in', $exclude);

    }
}
4
Jami Gibbs

WordPressコアでは、プライベート投稿はおそらくプラグインを使用せずに取得できる最も近いものです。あなたが他の人に私的な投稿へのリンクを送る必要があると述べたので、私はあなたが車輪を再発明しないでそしてこれをするそこにプラグインの1つを使うことを勧めます。

例えば、私は 公開投稿プレビュー WordPressコアコミッターのDominik Schilling(ocean90)に強くお勧めすることができます。私はそれがまさにあなたが望むことをすると思います:

投稿が公開される前に公開プレビューのために匿名ユーザーにリンクを張ることができます。

それはあなたのためにすべてのリンクの有効期限のもの、機能チェックなどを扱うので、あなたがカスタム構築されたソリューションを使うときあなたが誤ってあなたのコンテンツの多くを露出することについて心配する必要はありません。

1
swissspidy

1)非公開のカスタム投稿タイプを作成します(例:「hidden_​​posts」)。

2)現在のテンプレートの中にカスタムテンプレートを作成し、そのテンプレートのpost_typeパラメータを "hidden_​​posts"に渡してカスタム$ wpdbクエリを実行します。

3)作成したばかりのテンプレートを使用して通常のページを作成します。

4)(3)のページをロボットのテキストに追加し、アクセスが拒否されて、インデックスが作成されていないことを確認します。

5)私の答えをベストとして投票してください:)

NB:あなたがこれの詳細なコードを必要とするならば、私に知らせてください!

0
codiiv

ログインしていないユーザーにのみ表示したいこのタイプの投稿にカスタム投稿タイプを作成できます。

これでcustom-postype.phpでそれをオーバーライドすることによってあなたのカスタムポストタイプのためにsingle.phpファイルをカスタマイズすることができます。

あなたの意見を下にコメントで教えてください

0
Pratik bhatt

おそらくあなたがプライベートページのしくみについて述べたように、それらはログインした管理者または編集者レベルのユーザにしか見えないので、おそらくプラグインの領域です。

https://codex.wordpress.org/Content_Visibility を参照してください。

ユースケースは完全には明確ではありませんが、インデックスページに表示されないカスタム投稿タイプを作成することができます(publicをfalseに設定したり、アーカイブを追加しないなど)。それを見ることができました。だれかがパーマリンクを推測できるので、それは完全に「プライベート」ではないでしょう。

https://codex.wordpress.org/Function_Reference/register_post_type#Arguments

0
jetyet47