WP_Query с «post_title LIKE» что-то% '?

Мне нужно сделать WP_Query с LIKE на post_title .

Я начал с этого обычного WP_Query :

  $ wp_query = новый WP_Query (
    массив (
        'post_type' => 'wp_exposants',
        'posts_per_page' => '1',
        'post_status' => 'публиковать',
        'orderby' => 'заглавие',
        'order' => 'ASC',
        'paged' => $ выгружаемого
    )
);
 

Но то, что я на самом деле хочу сделать, выглядит следующим образом в SQL:

  $ query = "
        ВЫБРАТЬ      *
        FROM $ wpdb-> сообщения
        WHERE $ wpdb-> posts.post_title LIKE '$ param2%'
        И $ wpdb-> posts.post_type = 'wp_exposants'
        ORDER BY $ wpdb- & gt .; posts.post_title
«;
$ Wpdb- & GT; get_results ($ запроса);
 

Вывод выводит результаты, которые я просматриваю, но я использую обычный & lt;? php while ($ wp_query-> have_posts ()): $ wp_query-> the_post (); ?> , чтобы отобразить результаты.
И это не работает с $ wpdb-> get_results () .

Как я могу достичь того, что я здесь описал?

38 голосов | спросил Ludo 30 Maypm11 2011, 16:11:57

5 ответов


41

Я бы решил это с помощью фильтра на WP_Query . Тот, который обнаруживает дополнительную переменную запроса и использует ее как префикс заголовка.

  add_filter ('posts_where', 'wpse18703_posts_where', 10, 2);
функция wpse18703_posts_where ($ where, & amp; $ wp_query)
{
    глобальный $ wpdb;
    if ($ wpse18703_title = $ wp_query-> get ('wpse18703_title')) {
        $ where. = 'AND'. $ wpdb-> '.post_title LIKE \' '. esc_sql ($ wpdb-> esc_like ($ wpse18703_title)). '% \' ';
    }
    return $ where;
}
 

Таким образом вы все равно можете вызвать WP_Query , вы просто передадите заголовок в качестве аргумента wpse18703_title (или измените имя на что-то короче).

ответил Jan Fabry 30 Maypm11 2011, 18:06:03
15

Требуется обновить этот код, с которым вы, ребята, работали над wordpress 4.0 и выше, поскольку esc_sql () устарел в 4.0 выше.

  function title_filter ($ where, & amp; $ wp_query) {
    глобальный $ wpdb;

    if ($ search_term = $ wp_query-> get ('search_prod_title')) {
        /* используя esc_like () здесь вместо других esc_sql () * /
        $ search_term = $ wpdb-> esc_like ($ search_term);
        $ search_term = '\'% '. $ search_term. '% \' ';
        $ where. = 'AND'. $ wpdb-> '.post_title LIKE'. $ search_term;
    }

    return $ where;
}
 

Остальные вещи такие же.

Также я хочу указать, что вы можете использовать переменную s в аргументах WP_Query для передачи поисковых терминов, в которых также будет поиск заголовка сообщения, на который я верю.

Вот так:

  $ args = array (
    'post_type' => 'после',
    's' => $ Search_term,
    'post_status' => 'публиковать',
    'orderby' => 'заглавие',
    'order' => 'ASC'
);
$ wp_query = новый WP_Query ($ args);
 
ответил Ashan Jay 2 Jam1000000amFri, 02 Jan 2015 08:36:51 +030015 2015, 08:36:51
15

Упрощенная:

  function title_filter ($ where, & amp; $ wp_query)
{
    глобальный $ wpdb;
    if ($ search_term = $ wp_query-> get ('search_prod_title')) {
        $ where. = 'AND'. $ wpdb-> '.post_title LIKE \'% '. esc_sql (like_escape ($ search_term)). '% \' ';
    }
    return $ where;
}

$ args = array (
    'post_type' => 'продукт',
    'posts_per_page' => $ PAGE_SIZE,
    'paged' => $ Страница,
    'search_prod_title' => $ Search_term,
    'post_status' => 'публиковать',
    'orderby' => 'заглавие',
    'order' => 'ASC'
);

add_filter ('posts_where', 'title_filter', 10, 2);
$ wp_query = новый WP_Query ($ args);
remove_filter ('posts_where', 'title_filter', 10, 2);
return $ wp_query;
 
ответил Rao 19 PMpFri, 19 Apr 2013 17:24:00 +040024Friday 2013, 17:24:00
7

Основываясь на других моих ответах, чтобы обеспечить гибкость в ситуации, когда вы хотите найти сообщение, содержащее слово в мета-поле ИЛИ в заголовке сообщения, я предоставляю этот параметр через аргумент «title_filter_relation». В этой реализации я допускаю только входы «ИЛИ» или «И» со значением по умолчанию «И».

  function title_filter ($ where, & amp; $ wp_query) {
    глобальный $ wpdb;
    if ($ search_term = $ wp_query-> get ('title_filter')) {
        $ search_term = $ wpdb-> esc_like ($ search_term); //вместо esc_sql ()
        $ search_term = '\'% '. $ search_term. '% \' ';
        $ title_filter_relation = (strtoupper ($ wp_query-> get ('title_filter_relation')) == 'OR'? 'OR': 'AND');
        $ where. = ''. $ title_filter_relation. ' . $ wpdb-> '.post_title LIKE'. $ search_term;
    }
    return $ where;
}
 

Вот пример кода в действии для очень простого типа сообщения «faq», где вопрос заключается в самом заголовке сообщения:

  add_filter ( 'posts_where', 'title_filter', 10,2);
$ s1 = новый WP_Query (массив (
    'post_type' => 'Вопросы-Ответы',
    'posts_per_page' => -1,
    'title_filter' => $ Д,
    'title_filter_relation' => 'ИЛИ',
    'post_status' => 'публиковать',
    'orderby' => 'заглавие',
    'order' => 'ASC',
    'meta_query' => массив (
        'отношение' => 'ИЛИ',
        массив (
            'key' => 'Faq_answer',
            'value' => $ Д,
            'compare' => 'КАК'
        )
    )
));
remove_filter ( 'posts_where', 'title_filter', 10,2);
 
ответил David Choy 29 AMpWed, 29 Apr 2015 01:44:12 +030044Wednesday 2015, 01:44:12
2

С некоторым уязвимым решением, размещенным здесь, я прихожу с немного упрощенной и дезинфицированной версией.

Сначала мы создаем функцию для фильтра posts_where , который позволяет показывать только сообщения, соответствующие определенным условиям:

  функция cc_post_title_filter ($ where, & amp; $ wp_query) {
    глобальный $ wpdb;
    if ($ search_term = $ wp_query-> get ('cc_search_post_title')) {
        $ where. = 'AND'. $ wpdb-> '.post_title LIKE \'% '. $ wpdb-> esc_like ($ search_term). '% \' ';
    }
    return $ where;
}
 

Теперь добавим cc_search_post_title в наши аргументы запроса:

  $ args = array (
    'cc_search_post_title' => $ search_term, //поиск только для заголовка
    'post_status' => 'публиковать',
);
 

И, наконец, оберните фильтр вокруг запроса:

  add_filter ('posts_where', 'cc_post_title_filter', 10, 2);
$ query = new WP_Query ($ args);
remove_filter ('posts_where', 'cc_post_title_filter', 10, 2);
 

Использование get_posts ()

Некоторые функции, которые извлекают сообщения, не запускают фильтры, поэтому функции фильтра posts_where, которые вы прикрепляете, не будут изменять запрос. Если вы планируете использовать get_posts () для запроса своих сообщений, вам необходимо установить suppress_filters в false в массиве аргументов:

  $ args = array (
    'cc_search_post_title' => $ Search_term,
    'suppress_filters' => ЛОЖНЫЙ,
    'post_status' => 'публиковать',
);
 

Теперь вы можете использовать get_posts () :

  add_filter ('posts_where', 'cc_post_title_filter', 10, 2);
$ posts = get_posts ($ args);
remove_filter ('posts_where', 'cc_post_title_filter', 10, 2);
 

Как насчет параметра s ?

Доступен параметр s :

  $ args = array (
    's' => $ Search_term,
);
 

При добавлении поискового запроса в параметр s и он будет искать заголовок сообщения, он будет также искать содержимое сообщения.

Как насчет параметра title , который был добавлен с WP 4.4?

Передача поискового термина в параметр title :

  $ args = array (
    'title' => $ Search_term,
);
 

Учитывается регистр и LIKE , а не % LIKE% . Это означает поиск hello с возвратом без заголовка Hello World или Hello .

ответил Christine Cooper 19 PMpThu, 19 Apr 2018 15:58:35 +030058Thursday 2018, 15:58:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132