質問: Wordpressの特定のページを直リンクで訪問したときには表示したいのですが、トップページやサイト内の検索結果からは、辿れないようにしようと思っています。 そのためには「サイドバー(ページ一覧)」「検索結果」から除外する必要があります。 検索結果については下記のサイトが参考になりそうです。 https://www.nxworld.net/wordpress/wp-customize-search-results.html しかし、ウィジェットで追加したサイドバーに関しては、方法を検索では見つけることができませんでした。 多くが「特定のページで“サイドバーを”表示させない」というものでした。 ~~get_sidebar()~~ ウィジェットに対して hook で、なんとかすれば... と考えているのですが、その先からどのように処理すればよいのかが分からずにいます。 ~~(あるいはget_sidebar()以外で処理すべきなのか...)~~ ※投稿直後サイドバー限定にしていましたがウィジェット「固定ページ」になります。 ウィジェットの設定で「除外ページ」を指定する場所がありますが、 この除外ページをプログラム的に自動的に追加したいと考えています。 除外対象は、ページのカスタムフィールドの値で決定する予定です。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/bfec6e3c3999ebd5aa0f6d6c544a2f07.png) どこから手を付ければよいか、ヒントを教えていただけると助かります。 よろしくお願いします。
回答: `widget_pages_args`にフックすれば、固定ページウィジェット内で呼び出される`wp_list_pages()`の引数を与えることができます。 が、`wp_list_pages()`には「特定のカスタムフィールドの値を持つページ」を指定することができますが**「特定のカスタムフィールドの値を持つページを除外」**はできません。 ですので、除外したいカスタムフィールドの値を持つページを一度全て取得してしまい、`exclude`パラメータにそのページのIDをカンマ区切りで渡してやる必要があります。 1. get_posts()で除外したいカスタムフィールドの値を持つページを取得 2. 取得したページのIDの配列をforeachでカンマ区切りで代入してやるか、implodeで連結 3. wp_list_pages()のexcludeパラメータに除外IDを渡した配列(引数)を作る 4. widget_pages_argsでフィルターフックし、wp_list_pages()に引数を与える こんな感じでどうでしょうか。 **【追記】** `get_posts()`の戻り値は、その記事の全ての情報が入っています。 ですので、その中からページIDだけを抜き取ります。 この場合、`array_column()`でIDキーだけを取得すれば良いでしょう。 ``` $args = [ 'meta_key' => 'enable_page', 'meta_value' => '1' ]; $posts_array = get_posts( $args ); $posts_id = array_column($posts_array, 'ID'); $exclude_id = implode(',', $posts_id); ``` また、変数`$posts`はWordPressで予約されている変数なので、出来れば使用するのを避けた方が懸命です。