2

カスタム投稿タイプのすべての投稿タイトル、コンテンツ、およびカスタム フィールドを検索する Wordpress の検索フォームがあります。ただし、著者による検索は行いません。検索キーワードが表示名と一致する場合は、先に進み、その作成者による投稿も出力したいと思います。

これが私の現在のコードです(display_nameの部分は明らかに間違っていますが、私が達成したいことを示しています)。display_name 部分で投稿を取得する以外はすべて機能します。ヘルプやガイダンスをいただければ幸いです:)

// Code originally modified 
// from http://www.deluxeblogtips.com/2012/04/search-all-custom-fields.html

global $wpdb;
// Gets the ?crs= search from the submitted form
$keyword = sanitize_text_field( $_GET['crs'] );
$keyword = '%' . like_escape( $keyword ) . '%'; 

// Search in all custom fields
$post_ids_meta = $wpdb->get_col( $wpdb->prepare( "
    SELECT DISTINCT post_id FROM {$wpdb->postmeta}
    WHERE meta_value LIKE '%s'
", $keyword ) );

// Search in post_title and post_content
$post_ids_post = $wpdb->get_col( $wpdb->prepare( "
    SELECT DISTINCT ID FROM {$wpdb->posts}
    WHERE post_title LIKE '%s'
    OR post_content LIKE '%s'
", $keyword, $keyword ) );

// Search in User Table for Display Name
// This is where I'm not sure what how to get the posts by display_name
$post_ids_user = $wpdb->get_col( $wpdb->prepare( "
    SELECT DISTINCT post_id FROM {$wpdb->users}
    WHERE display_name LIKE '%s'
", $keyword ) );

$post_ids = array_merge( $post_ids_meta, $post_ids_post, $post_ids_user );

// Query arguments for WP_Query
$args = array(
    'post_type'   => 'courses',
    'post_status' => 'publish',
    'limit' => '',
    'post__in'    => $post_ids,
);
4

1 に答える 1

3

複数のクエリを実行する代わりに、テーブルに参加してまとめて回避することをお勧めします

SELECT DISTINCT post_id FROM {$wpdb->users} WHERE display_name LIKE '%s' これは間違ったクエリです ユーザー テーブルから投稿 ID を取得できません。投稿とユーザーの関係は投稿テーブルに保持され、各投稿にはユーザー ID が含まれていますpost_author

これを試してみてください

$post_ids = $wpdb->get_col( $wpdb->prepare( "
    SELECT p.ID FROM $wpdb->posts p
INNER JOIN $wpdb->users u ON (p.`post_author` = u.`ID`)
LEFT JOIN $wpdb->postmeta m ON (p.`ID`= m.`post_id`)
WHERE ( u.display_name LIKE '%s' OR p.post_title LIKE '%s' 
OR p.post_content LIKE '%s' OR m.meta_value LIKE '%s')
GROUP BY p.`ID`
", $keyword ) );

//print_r($post_ids); //you will get the post ids
$post_ids=array_values(array_unique($post_ids));
于 2013-09-23T19:06:39.493 に答える