functions.php WordPress

【WordPress】記事一覧画面の検索機能拡張

2023年4月26日

はじめに

WordPressにて自サイトの投稿記事を検索する際に、除外キーワードを指定したいことはありませんか?
・指定されたカテゴリの中の検索キーワードで検索されるうち、
・今回追加した除外キーワードを含む記事を除外した検索結果の一覧を表示します

自分で使用しているものはさらに正規表現まで拡張しておりますが、機能が増えるにつれて検索結果表示までの速度が低下していくようですので、ここでは除外キーワード機能の追加のみとしております。

functions.phpへの追加

まずはバックアップを取っておきましょう。functions.phpを編集する場合は誤記などがありますと画面が真っ白になったりします。
おすすめは後述するコードスニペットプラグインを使用することです。
functions.phpに下記コードを追加します。(子テーマがある場合は子テーマのfunctions.phpへ、そうでなければテーマの方へ)

注意

functions.phpは間違えると画面が真っ白になったりします。ご注意ください。

// 管理画面の投稿一覧画面にフィルタを追加
function add_exclude_term_filter_to_admin_posts() {
  global $typenow;
  if ($typenow == 'post') {
    ?>
    <input type="text" name="exclude_term" id="exclude_term" placeholder="除外用語を入力" value="<?php echo isset($_GET['exclude_term']) ? $_GET['exclude_term'] : ''; ?>">
    <?php
  }
}
add_action('restrict_manage_posts', 'add_exclude_term_filter_to_admin_posts');

// 投稿一覧画面での検索クエリをカスタマイズ
function modify_admin_posts_query($query) {
  if (is_admin() && $query->is_main_query()) {
    // 選択されたカテゴリIDを取得
    $category_id = isset($_GET['cat']) ? $_GET['cat'] : '';

    // 除外したい用語
    $exclude_term = isset($_GET['exclude_term']) ? $_GET['exclude_term'] : '';

    // クエリにカテゴリを追加
    if (!empty($category_id)) {
      $query->set('cat', $category_id);
    }
    if (!empty($exclude_term)) {
      // 除外用語を含まない投稿を検索するためのフィルタを追加
      $query->set('post__not_in', exclude_term_from_posts($exclude_term));
    }
  }
  return $query;
}
add_filter('pre_get_posts', 'modify_admin_posts_query');

function exclude_term_from_posts($exclude_term) {
  global $wpdb;
  $posts_with_term = $wpdb->get_col($wpdb->prepare("
    SELECT DISTINCT ID FROM {$wpdb->posts}
    WHERE post_type = 'post'
    AND post_status = 'publish'
    AND post_content LIKE %s
  ", '%' . $wpdb->esc_like($exclude_term) . '%'));

  return $posts_with_term;
}

コードスニペットプラグインを使う

【WordPress】記事一覧画面の検索機能拡張

functions.phpを直接編集するのは怖いです。
そこでお勧めしたいのが、Code Snippetsプラグインです。
インストールして有効化しましたら、新規追加で下記のようにコードをコピペします。
ここでサイトのセキュリティにてWAFがOnになっていると下記のようなエラーメッセージが表示されて保存ができません。
この場合は、レンタルサーバーにログインして更新する時にWAFの設定を一時的にOffにします。

-functions.php, WordPress
-, ,