Intereting Posts
Как запрашивать сообщения для персонализированного типа сообщений с изображением для первого 2 сообщения? Лучший способ передать переменную PHP между частичными? Отключить визуальный редактор для всех пользователей Создание мета-поля «admin only» с WPAlchemy. Получение фатальной ошибки на интерфейсе при использовании current_user_can получить все сообщения ID из категории Архив с разбивкой по таксономии с разбивкой по страницам, включая одну должность за период Плагин WordPress для автоматического запуска php-скрипта в определенное время? Пользовательское правило перезаписи служит для содержимого, но возвращает код ошибки 404 Как синхронизировать меню, виджеты и другие мастера с основного сайта на его подсайт Как мне обновить заголовок заказа конечных точек моей учетной записи в Мои заказы? Как настроить название персонализированного заголовка без поддержки WP JSON REST API (Ryan McCue), как запрашивать сообщения с конкретными метаданными с отношением «И»? Как добавить дополнительные каталоги выгрузки? Создание списка тегов из результатов поиска моя домашняя страница не имеет SSL, но другая страница в порядке

Искать ТОЛЬКО с помощью мета-ключа / мета-значений

Я почти на этом.

На functions.php у меня есть следующее:

function base_home_product_post_type( $query ) { if($query->is_search() && $_POST['box'] == 'sku') { $query->query_vars['post_type'] = 'product'; $query->query_vars['meta_key'] = 'sku'; $query->query_vars['meta_value'] = $query->query_vars['s']; return; } } add_action('pre_get_posts', 'base_home_product_post_type', 1); 

И он делает то, что сказано. Ищет строку поиска на meta_key 'sku'. Проблема здесь в том, что по умолчанию объект запроса, возвращенный из WordPress, также содержит это и запрашивает post_title и post_content по умолчанию:

 SELECT SQL_CALC_FOUND_ROWS whirl_2_posts.ID FROM whirl_2_posts INNER JOIN whirl_2_postmeta ON (whirl_2_posts.ID = whirl_2_postmeta.post_id) WHERE 1=1 AND (((whirl_2_posts.post_title LIKE '%__SEARCH_STRING__%') OR (whirl_2_posts.post_content LIKE '%__SEARCH_STRING__%'))) 

Я действительно не хочу этого, когда я ищу только значение «sku», поэтому я попытался удалить его с помощью posts_where и некоторых довольно уродливых REGEX, подобных этому (предупреждение, хакерство и багги):

 function get_rid_of_titles($search) { if(is_search() && $_POST['box'] == 'sku') { $search = preg_filter('|AND\s\({3}\w*\.post_title\sLIKE\s\'\%[^%]*\%\'\) OR \(\w*\.post_content\sLIKE\s\'\%[^%]*\%\'\){3}\s|', '', $search); } return $search; } add_filter('posts_where','get_rid_of_titles'); 

Но не повезло. Может ли кто-нибудь указать мне, как следует искать onlu для пользовательской ценности в этом случае?

РЕШЕНИЕ

Благодаря @kaiser ниже, я получил эту работу:

 function get_rid_of_titles($search) { if(is_search() && $_POST['box'] == 'sku') { $sku = $_POST['s']; // get search string $needle = "LIKE '%$sku%'"; // search only for LIKE '%_SEARCH_STRING_%'. This is a multisite environment, so involving table names directly is a bad idea $replace = "LIKE '%'"; // replace it with SQL Wildcard so any title and any content are welcome $count = 2; // only the first 2 occurrencies which happen to be post_title and post_content return str_replace($needle,$replace,$search, $count); } } add_filter('posts_where','get_rid_of_titles'); 

Solutions Collecting From Web of "Искать ТОЛЬКО с помощью мета-ключа / мета-значений"

Вы могли бы сделать две вещи:

A) замените поиск SQL-запросом, который ищет только таблицу postmeta (быстрее, чем нет JOIN вы можете получить сообщение через его идентификатор позже, когда будете показывать результаты).

B) Разделите строку сразу после WHERE 1=1 и опустите последнюю часть. Вы можете использовать простой return str_replace( $query_part_below, '', $search ); ,

  AND ( (whirl_2_posts.post_title LIKE '%__SEARCH_STRING__%') OR (whirl_2_posts.post_content LIKE '%__SEARCH_STRING__%') ) 

Перед тем, как $wpdb->prepare() убедитесь, что вы правильно $wpdb->prepare() .