💭

Wordpressで検索する時にpost_metaの情報も合わせて検索する

2023/11/17に公開

Wordpressで検索する時に、post_metaの情報も考慮する必要があったので、
実装した。
備忘録的に乗せとく

要は、検索する時はWP_Queryで検索を行うので、
posts_joinposts_searchフィルターフックでJOIN句とWHERE句を足してあげたらいい。
また、検索実行時は$query->is_search== tureになるので、
$query->is_search == falseの時は
黙ってreturn $join;return $search;して上げる事で
Wordpressの検索機能実行時のみ追加されるようになる。

// 記事検索時に閲覧ユーザーが管理者以外の場合は、post_metaをJoinする
function custom_search_join($join,$query)
{
  if($query->is_search == false){
    //検索時だけ処理を行う
    return $join;
  }
  $user = wp_get_current_user();
  $hasUserCaps = get_user_meta($user->ID,'wp_capabilities',true);
  if (in_array('administrator', array_keys($hasUserCaps)) == true) {
    //管理者の場合は、全件表示
    return $join;
  }
  global $wpdb;
    //管理者権限以外の場合は、ログインユーザーにアクセス権の有る記事から検索する為に、
  $join .= 'INNER JOIN (SELECT * FROM wp_postmeta WHERE meta_key = "can_read_users") as can_read_users  ON can_read_users.post_id = wp_posts.ID';
  return $join;
}
add_filter('posts_join', 'custom_search_join', 10, 2);
// カスタムフィールドを検索条件に含む
function custom_field_search($search, $query) 
{
  if($query->is_search == false){
    //検索時だけ処理を行うでそのまま返す
    return $search;
  }
  $user = wp_get_current_user();
  $hasUserCaps = get_user_meta($user->ID,'wp_capabilities',true);
  if (in_array('administrator', array_keys($hasUserCaps)) == true) {
    //管理者の場合は、全件表示
    return $search;
  }
  global $wpdb;
  $search .= " AND can_read_users.meta_value LIKE '%\"{$user->ID}\"%' ";
  return $search;
}
add_filter('posts_search','custom_field_search', 10, 2);

Discussion