💭
Wordpressで検索する時にpost_metaの情報も合わせて検索する
Wordpressで検索する時に、post_metaの情報も考慮する必要があったので、
実装した。
備忘録的に乗せとく
要は、検索する時はWP_Query
で検索を行うので、
posts_join
とposts_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