2011-09-24 41 views
5

パスワードで保護されたエントリをサポートするカスタム投稿タイプがあります。新しいWP_Queryオブジェクトを使用するカスタムループでは、パスワード保護された投稿を結果から除外したいと考えています。これを行うために必要な議論は何ですか?私は最新のトランクバージョンのWordPress 3.2.1を使用しています。WordPressループでパスワードで保護された投稿を除外する方法

+0

WordPress 3.9以来、あなたが使うことができる 'has_password'クエリargもあります。 –

答えて

1

WP_Queryのpost_status argumentを見ましたか?

"保護された"は除外するのが良い候補のようです。

編集:あなたが望むものを達成するためにwhere句を変更する必要がありますようさて、それはそう:

// Create a new filtering function that will add our where clause to the query 
function filter_where($where = '') { 
    // exclude password protected 
    $where .= " AND post_password = ''"; 
    return $where; 
} 

if (!is_single()) { add_filter('posts_where', 'filter_where'); } 
$query = new WP_Query($query_string); 
remove_filter('posts_where', 'filter_where'); 
+0

はい、私はそれを見ましたが、その引数が投稿ステータスを許容しているかのように見えます。つまり、post_status = protectedは、間違って使用していない限り、すべての保護ステータスを含みますか? – Kevin

+0

推測しますが、post_status = -protectedを試しましたか? – vzwick

+0

うんうんだけど、どちらでもうまくいきません – Kevin

1

についての演奏のビットの後、私はposts_whereフィルタAを見つけました私がやりたがっているようなものではないので、私は別の方法を思いついた。カスタムポストタイプのために添付した 'save_post'アクションの一環として、次のロジックを追加しました。

$visibility = isset($_POST['visibility']) ? $_POST['visibility'] : ''; 
$protected = get_option('__protected_posts', array()); 

if ($visibility === 'password' && !in_array($post->ID, $protected)) { 
    array_push($protected, $post->ID); 
} 
if ($visibility === 'public' && in_array($post->ID, $protected)) { 
    $i = array_search($post->ID, $protected); 
    unset($protected[$i]); 
} 
update_option('__protected_posts', $protected); 

これは、投稿がパスワードで保護されているオプションテーブルに投稿IDの配列を保持しています。次にカスタムクエリでは、単に配列をpost__not_inオプションの一部として渡しました。

$query = new WP_Query(array(
    'post_type' => 'my_custom_post_type', 
    'post__not_in' => get_option('__protected_posts'), 
)); 

こうすることで、アーカイブページから保護された投稿を除外できますが、パスワードで保護されたページにアクセスしてパスワードを入力することができます。

+0

これは私のために働きました。私はget_postsを使っていたので、これは本当に仕事を終わらせる最も簡単な方法でした。 –

9

私は本当にケビンのアプローチのように、私は少しそれを調整する:

// Create a new filtering function that will add our where clause to the query 
function my_password_post_filter($where = '') { 
    // Make sure this only applies to loops/feeds on the frontend 
    if (!is_single() && !is_admin()) { 
     // exclude password protected 
     $where .= " AND post_password = ''"; 
    } 
    return $where; 
} 
add_filter('posts_where', 'my_password_post_filter'); 
+1

これは私にとって素晴らしい仕事でした、Peterに感謝します。 –

+0

ありがとう、@ピーターチェスター、私はまた、次の投稿と前の投稿のリンク(私の答えを参照)のためにこの除外を追加しました。 – Nelu

+0

これを適用して、単一のループで保護された投稿を渡す方法はありますか? –

0

チェスターの答え@Peterに加えて:あなたはまた、Previous PostNext Postからパスワードで保護された記事を除外したい場合があり

をあなたの投稿ページの一番下にそれらがある場合は、リンクをクリックします。

これを行うには、除外をget_previous_post_whereフックとget_next_post_whereフックに追加できます。

2

私は同じことを探していました。しかし、私はあなたがここで

$args = [ 
    'post_type'  => [ 'post', 'page' ], 
    'posts_per_page' => 3, 
    'post__not_in' => get_option('sticky_posts'), 
    'has_password' => FALSE 
]; 

...そして、非常に簡単な解決策を見つけ、それはちょうどので、コードは以下のようになりますクエリ $args

'has_password' => false引数を追加することである線でWP_Queryドキュメントラインをすることができます読みます私はStickyPassword Protectedの投稿を除外しました。

+1

SQLの使用を示唆するすべての回答は危険であり、WordPress 3.9以降では使用しないでください。これは、パスワードで保護された投稿を除外するために組み込まれています。 – sauv0168

関連する問題