WordPressの 'posts_where'フィルタ( https://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where )を使用して、以下:
function filter_my_search($where=''){
global $wpdb;
if(isset($_GET['q'])) {
$where .= 'AND (((' . $wpdb->posts . '.post_title LIKE "%'.$_GET["q"].'%") OR (' . $wpdb->posts . '.post_content LIKE "%'.$_GET["q"].'%")))';
}
return $where;
}
add_filter('posts_where', 'filter_my_search');
クエリが実行されているので、where句を傍受し、追加の条件を追加します。そのコードはSQLインジェクションの影響を受けやすいでしょうか。
いいえ!この場合、WordPressはSQLインジェクションから保護しません。 $wpdb->esc_like
と$wpdb->prepare
を使って自分でそうする必要があります。
if ( isset( $_GET['q'] ) ) {
// WordPress forces magic quotes (god knows why), unslash it
$value = wp_unslash( ( string ) $_GET['q'] );
// Escape like wildcards so that MySQL interprets them as literals
$value = $wpdb->esc_like( $value );
// Create our "true" like query
$value = "%$value%";
// Now inject it safely
$where .= $wpdb->prepare(
" AND ( ( $wpdb->posts.post_title LIKE %s ) OR ( $wpdb->posts.post_content LIKE %s ) )",
$value,
$value
);
}