У меня возникла проблема с созданием расширенного поиска с пользовательским запросом и использованием $wpdb->get_results($query , OBJECT);
В обычном поиске в wordpress при поиске xxx yyyy
или поиске yyyy xxx
у нас одинаковые результаты, и это хорошо. Но когда я вынужден использовать запрос для создания расширенного поиска, то последовательность слов в полях поиска важна, а далее xxx yyyy
или search yyyy xxx
не являются одинаковым результатом. Я хочу сказать с примера: я создаю два поля ввода для Title и другое для Author моих сообщений (автор – пример только и в этом месте – это настраиваемые поля) Я пытаюсь прочитать эти поля и искать их в wordpress
<?php $t = $_REQUEST['title']; $a = $_REQUEST['author']; global $wpdb; $query = "SELECT DISTINCT wp_posts.* FROM wp_posts, wp_postmeta WHERE wp_posts.ID = wp_postmeta.post_id"; if ($t != '') { $t_sql = " AND wp_posts.post_title like '%$t%' "; } if ($a != '') { $a_sql = " AND wp_postmeta.meta_key = 'Author' AND wp_postmeta.meta_value like '%$a%' "; } $query .= $t_sql; $query .= $a_sql; $pageposts = $wpdb->get_results($query , OBJECT); global $post; if ($pageposts): foreach ($pageposts as $post): setup_postdata($post); //... endforeach; endif; ?>
В твоей идее, что я должен делать?
Вы можете разделить термины поиска с помощью символа Space
а затем построить свой запрос, чтобы просмотреть все возможные порядки слов. Вот пример для поля Title
:
// Assuming the title is "One Two Three" $t = $_REQUEST['title']; // Split the TITLE by space character $terms = explode(' ', $t); // $terms = ["One", "Two", "Three"] // Concats each search term with a LIKE operator $temp = array(); foreach ($terms as $term) { $temp[] = "title LIKE '%".$term."%'"; // $temp = ["title LIKE %One%", "title LIKE %Two%", ... } // Adds an AND operator for each $temp to the query statement $query = "SELECT * FROM titleTable WHERE (".implode(' AND ', $temp).")"; // $query = SELECT * FROM titleTable WHERE // (title LIKE '%One%' AND title LIKE '%Two%' AND title LIKE '%Three%')
Создание пользовательского запроса, поиск которого в БД WP не является хорошим способом. Используйте WP_Query для этого.
Вот ссылка, где кто-то испытывал ту же проблему:
https://wordpress.stackexchange.com/questions/18703/wp-query-with-post-title-like-something
Фактически, я просматриваю ваш код на порталах веб-разработчиков, особенно на SQL-запросы. И я также не знал, почему, если вы ищете xxx yyyy и yyyy xxx, это не тот же результат с вашим PHP-скриптом. Но единственные советы, которые я могу вам дать:
$query .= $t_sql; $query .= $a_sql; // is to add an sql order by keyword like this $query .= " ORDER BY wp_posts . post_title ";
Попробуй! И не забудьте addslashes()
когда вы использовали переменную $_GET
, $_POST
или $_COOKIE
если PHP вашего сервера не запускает addslashes()
для этих переменных. Вы можете проверить это, используя функцию get_magic_quotes_gpc()
.