WordPressの公開ステータス

今回、「限定的に公開状態にしたい」要望が出てきたので、その時に行った処理のメモです。

「クライアントがいる場合」や「関係者が複数いて全員の確認が必要」になったりしないと、あまり利用しない処理かも知れません。今回実は、僕が「確認者が社内外ともに複数いて、全員の確認が取れないと公開できない」状態だったのです。

さておき、前提条件としては下記3点。

  1. デフォルトの記事一覧(カテゴリー:category.php、アーカイブ:archive.php)はそのまま利用している。
  2. 記事一覧の表示をカスタマイズして独自に作成し、固定ページにもショートコードで表示している。
  3. 他のオリジナルのファイル(sidebar-XXXX.php等)にも一覧を表示している

終わってみると「何だ、こんな簡単なことか」と思いますが、何も知らない状態から調べて対応したので、少々時間がかかってしまいました。

オリジナルのクエリWP_Queryで生成している一覧から「パスワード保護」記事を非表示に

今回、WP_Queryでクエリから記事を取得・表示していたので、単純にCodexからパラメータを検索してみました。結論、下記を利用します。

has_password (真偽値) – パスワードで保護された投稿を表示するには true、保護されてない投稿を表示するには false を指定します。またパスワードの有無に関わらず表示したい場合は null を指定します(デフォルト)。(バージョン 3.9 から使用可能)

引用元:Codex

引用した上記の通り、引数の指定はfalseにしておくようです。
こうすることでWP_Query生成時にパスワード保護の記事が非表示になります。

$args = array(
'has_password' => false
);

これで前提条件にあげたWP_Queryを使って生成している記事一覧である
(2)記事一覧の表示をカスタマイズして独自に作成し、固定ページにもショートコードで表示している
(3)他のオリジナルのファイル(sidebar-XXXX.php等)にも一覧を表示している
に関しては非表示となります。

ただ、この条件だとデフォルトの一覧からは削除されず、「パスワード保護」という文字列が表示されるだけで、普通に表示されてしまいます。

カテゴリーやアーカイブから非表示にする

カテゴリーページ(caegory.php)やアーカイブページ(archive.php)の一覧からパスワード保護の記事を非表示にするには、WordPressが記事を取得する段階から取得しないようにするしかありません。

そこでpre_get_postsというアクションフックを利用します。

このフックはクエリ変数オブジェクトの生成後、実際にクエリが実行される前に呼び出されます。

引用元:Codex

このフックをfunction.phpに記載し利用することで非表示にすることが可能です。

function 関数名 ( $query ) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ( 条件式 ) {
      $query->set( 'has_password', false );
    }
  }
}
add_action( 'pre_get_posts', '関数名' );

上記の場合は、is_admin()は、管理画面を利用している(ダッシュボードにログインしている状態)かどうかを判別しており、is_main_query()でメインのクエリかどうかを判断しています。
!is_admin()を指定しないと投稿中の自分も見れなくなってしまいますので注意。

3行目の条件式では、is_category()やis_archive()を使って下記のように指定します。

if ( $query->is_archive() ) {}

そして、add_actionを利用してpre_get_postsのフックを上書きすることで、非表示になった状態で一覧が表示されます。

Similar Posts