スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WP_Query で カスタムフィールドとタイトルを条件に or 検索する方法

$query = 'テスト';
$args = array(
'post_type' => 'post',
's' => $query,
'meta_query' => array(
array(
'key' => 'speel',
'value' => $query,
'compare' => 'LIKE'
)
)
);

$search = new WP_Query( $args )

とかってやると、
SELECT
SQL_CALC_FOUND_ROWS wp_posts.ID
FROM
wp_posts
INNER JOIN
wp_postmeta
ON (
wp_posts.ID = wp_postmeta.post_id
)
WHERE
1 = 1
AND ((
(wp_posts.post_title LIKE '%テスト%')
OR (wp_posts.post_excerpt LIKE '%テスト%')
OR (wp_posts.post_content LIKE '%テスト%')
))
AND (
wp_posts.post_password = ''
)
AND ((
(
wp_postmeta.meta_key = 'custome_field'
AND wp_postmeta.meta_value LIKE '%テスト%'
)
))
AND (
wp_posts.post_status = 'publish'
)
GROUP BY
wp_posts.ID
ORDER BY
wp_posts.post_date DESC
LIMIT 0, 10
みたいな感じで、タイトルとカスタムフィールドがand検索になる。
これを or 検索にする方法。

functions.php とかに下記を追加。
add_action( 'pre_get_posts', function( $q )
{
if( $title = $q->get( '_meta_or_title' ) )
{
add_filter( 'get_meta_sql', function( $sql ) use ( $title )
{
global $wpdb;

// Only run once:
static $nr = 0;
if( 0 != $nr++ ) return $sql;

// Modified WHERE
$sql['where'] = sprintf(
" AND ( %s OR %s ) ",
$wpdb->prepare( "{$wpdb->posts}.post_title like '%%%s%%'", $title),
mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) )
);

return $sql;
});
}
});
で、使う時は4行目を変更すればOK
$query = 'テスト';
$args = array(
'post_type' => 'post',
'_meta_or_title' => $query,
'meta_query' => array(
array(
'key' => 'speel',
'value' => $query,
'compare' => 'LIKE'
)
)
);

$search = new WP_Query( $args )
これで
SELECT
SQL_CALC_FOUND_ROWS wp_posts.ID
FROM
wp_posts
INNER JOIN
wp_postmeta
ON (
wp_posts.ID = wp_postmeta.post_id
)
WHERE
1 = 1
AND (
wp_posts.post_title like '%テスト%'
OR ((
(
wp_postmeta.meta_key = 'custome_field'
AND wp_postmeta.meta_value LIKE '%テスト%'
)
))
)
AND (
wp_posts.post_status = 'publish'
)
GROUP BY
wp_posts.ID
ORDER BY
wp_posts.post_date DESC
LIMIT 0, 10
になる。


参考サイト
Using meta query ('meta_query') with a search query ('s')
スポンサーサイト

WordPress Popular Postsのフックの中でget_template_partを使う時のメモ

WordPress Popular Postsプラグインで、wpp_postをフックすると、liの中身を書き換える事が出来る。
その中で、get_template_partを使って、他の一覧部分とソースを共通かするやり方のメモ
function my_custom_single_popular_post( $post_html, $p, $instance ){
ob_start();
global $post;
$tmp_post = $post;
$post = get_post($p->id);
get_template_part('partial/list_li');
$output = ob_get_clean();
$post = $tmp_post;
return $output;
}
add_filter( 'wpp_post', 'my_custom_single_popular_post', 10, 3 );
これで、list_liの中でthe_titleとかでタイトル取ってきたりと、アーカイブページのループの中と同じ形で表示が出来るようになる。

参考サイト
[WordPress] WordPress Popular Posts プラグインでの表示を自由にカスタマイズしたい時に便利なフックとその使い方
WordPress Popular Posts で人気記事を表示する方法
WordPressのショートコードで任意のテンプレートを呼び出す

プロフィール

U2K

Author:U2K
いろいろプログラムに関しての覚え書きをちょくちょくと書いていきます。

オススメ










オススメ

忍者AdMax

u2k on Twitter

最近の記事


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。