query_post по заголовку?

14 июл. 2011 г., 17:16:48
Просмотры: 88.5K
Голосов: 22

Возможно ли создать цикл постов используя WP_Query или query_posts на основе заголовка?

например

// Использование массива аргументов
$args = array('post_title'='LIKE '.$str.'% ');

$res = WP_Query($arg);

// цикл...


// пробуем так...
$mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title like 'Abb%' ");

echo count($mypostids).", ";    // работает, но не получается вывести массив ID для следующих аргументов?

$args = array(
    'post__in'=> $mypostids
);

$res = WP_Query($args);

while( $res->have_posts() ) : $res->the_post(); ...
0
Все ответы на вопрос 5
6
37

functions.php

<?php
// Добавляем фильтр для поиска записей по части заголовка
add_filter( 'posts_where', 'title_like_posts_where', 10, 2 );
function title_like_posts_where( $where, $wp_query ) {
    global $wpdb;
    // Проверяем наличие параметра post_title_like в запросе
    if ( $post_title_like = $wp_query->get( 'post_title_like' ) ) {
        // Добавляем условие LIKE к SQL запросу для поиска по заголовку
        $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $post_title_like ) ) . '%\'';
    }
    return $where;
}
?>

Использование:

// Подготовка аргументов для запроса
$args = array(
    'post_title_like' => $str // Искомая строка в заголовке
);
// Выполняем запрос
$res = new WP_Query($args);
14 июл. 2011 г. 18:21:09
Комментарии

Отлично работает, за исключением второго аргумента (ссылка на $wp_query), который, похоже, не является частью callback-функции фильтра (см. http://codex.wordpress.org/Plugin_API/Filter_Reference/posts_where) и вызовет ошибку.

maryisdead maryisdead
14 окт. 2013 г. 15:37:09

на самом деле код верный, по крайней мере в WP 4.1.1. Это кодекс упускает второй аргумент, поэтому если вы объявляете 2 аргумента в add_filter, как в примере, всё работает корректно. Ещё одно преимущество этого решения — оно работает для пользовательских типов записей.

yitwail yitwail
22 мар. 2015 г. 06:49:55

Этот ответ должен быть принят, так как он демонстрирует решение с использованием встроенных функций WordPress, а не кастомного SQL-запроса.

Sudar Sudar
2 апр. 2015 г. 09:11:17

Кажется, здесь пропущен первый символ %. Сразу после LIKE \'. Я добавил его, и всё заработало (4.2.4)

vladkras vladkras
16 авг. 2015 г. 13:45:14

Да, действительно пропущен первый %, тоже добавил, и теперь работает :) (может, стоит отредактировать ответ?)

Toni Michel Caubet Toni Michel Caubet
21 сент. 2016 г. 11:40:03

У меня сработало, только я удалил & в function title_like_posts_where( $where, &$wp_query ) {, перед $wp_query. Спасибо @Brady.

Jose Carlos Ramos Carmenates Jose Carlos Ramos Carmenates
25 янв. 2017 г. 18:54:12
Показать остальные 1 комментариев
0

В итоге получилось заставить это работать с помощью этого поста. Спасибо, ребята;

$finalArgs =  array (       
        'posts_per_page'=>5,
        'order' => 'ASC',
        'post_type' => 'school'                         
    );

    // Создаем новый экземпляр
    $searchSchools = new WP_Query( $finalArgs );

    $mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title LIKE '".$str."%' ");

    $args = array(
        'post__in'=> $mypostids,
        'post_type'=>'school',
        'orderby'=>'title',
        'order'=>'asc'
    );

    $res = new WP_Query($args);

    while( $res->have_posts() ) : $res->the_post();

        global $post;

        $EstablishmentNumber = get_post_meta($post->ID,'EstablishmentNumber', true);

        $schl = array('id'=>$EstablishmentNumber, 'label'=>$post->post_title , 'value'=>$EstablishmentNumber );     
        $matchedSchools[] = $schl;


    endwhile;
19 июл. 2011 г. 16:04:36
1

Получить заголовок из другого цикла

$title = get_the_title();

и использовать переменную $title при необходимости.

<?php

global $post, $current_post_id, $title;

function filter_where($where = ''){

    global $title;
    $where .= "AND post_title = '$title'";
    return $where;

}
add_filter('posts_where', 'filter_where');

$query = new WP_Query(array('post_type' => 'sessions') );
if ( have_posts() ) : while ( $query->have_posts() ) : $query->the_post();

    /* Цикл здесь */

endwhile; endif; 

wp_reset_query(); ?>
23 нояб. 2011 г. 01:32:33
Комментарии

это работает с пользовательским типом записей и WordPress 3.2.1

Zakir Sajib Zakir Sajib
23 нояб. 2011 г. 01:35:41
2

Да, это возможно...

global $wpdb;

$mypostids = $wpdb->get_col("select ID from $wpdb->posts where post_title like '%$str%' ");

$args = array('post__in' => $mypostids);

$res = WP_Query($arg);
14 июл. 2011 г. 17:29:47
Комментарии

Спасибо, Rajeev - попробовал это, но процесс зависает после get_col. Я обновил выше^^^

v3nt v3nt
14 июл. 2011 г. 18:17:31

Это сработало идеально, спасибо.

csaborio csaborio
11 янв. 2021 г. 03:55:30
1

Эти ответы выглядят для меня как попытка взлома WordPress.

Смотрите тот же вопрос на Stack Overflow:

https://stackoverflow.com/questions/25761593/wp-query-with-post-title-like-something-and-category

Этот код работает, если вам нужно выполнить поисковый запрос по заголовку с сортировкой по названию:

$the_query = new WP_Query( 
  array(
    'post_type' => 'watches',
    'posts_per_page' => 5,
    'orderby' => 'title',
    's' => 'my title'
  ) 
);

Данный пример запроса предназначен для типа записей "watches", а параметр 's' (поисковый запрос) позволяет искать записи по их заголовкам в этом запросе.

16 нояб. 2018 г. 13:44:07
Комментарии

Это также выполнит поиск по содержимому

Mark Kaplun Mark Kaplun
2 июл. 2019 г. 15:17:25