Ручное создание WP_Query

Вопрос или проблема

Я пытаюсь вручную создать запрос в ‘loop.php’, который выводит список из 3 постов пользовательского типа постов над результатами, автоматически выдаваемыми при поиске в WordPress.

У меня есть следующий код, который отображает эти результаты, как я и задумал:

<?php   
// Запрос
$query1 = new WP_Query( array( 'post_type' => 'sdm_downloads', 'posts_per_page' => 3) );

if ( $query1->have_posts() ) :
    echo '<div style="background-color:#fffced; padding:10px;margin-bottom:20px;">';
    echo '<h3>Выбранные релевантные элементы из нашей библиотеки Briefings:</h3>';
    // Цикл
    while ( $query1->have_posts() ) {
        $query1->the_post();
    <article class="article-archive" id="post-<?php the_ID(); ?>">

        <header>
            <hgroup>
                <p><a href="https://wordpress.stackexchange.com/questions/205949/<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark"><?php the_title(); ?></a>
                <p>
                <!--<p class="entry-meta">Размещено <strong><?php echo human_time_diff(get_the_time('U'), current_time('timestamp')) . ' назад'; ?></strong></p>-->
            </hgroup>
        </header>
    </article>
<?php
}
echo '</div>';
endif
?>

Это отлично, за исключением того, что он просто вытягивает три самых последних поста из этого типа постов. Поэтому я решил, что нужно вручную добавить в запрос условия поиска следующим образом:

$query1 = new WP_Query( array( 'post_type' => 'sdm_downloads', 'posts_per_page' => 3, 's' => $s) );

Однако это не показывает ничего. Точно так же, если я заменяю переменную s на строку, я все равно не получаю ни одного поста. Я даже удалял все аргументы кроме строки и все равно не получаю результатов, например:

$query1 = new WP_Query( array( 's' => 'awards') );

Есть идеи, почему это происходит и/или как это можно исправить?

Спасибо.


Если я выполняю дамп запроса без указания аргумента ‘s’, я получаю следующее

string(226) "SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_type="sdm_downloads" AND (wp_posts.post_status="publish" OR wp_posts.post_status="private") ORDER BY wp_posts.post_date DESC LIMIT 0, 3"

В то время как если я добавляю аргумент ‘s’ в WP_Query, я получаю следующий дамп:

string(32) "SELECT * FROM wp_posts WHERE 1=2" 

Оказывается, это поведение происходит только тогда, когда у меня активен поисковый плагин Relevanssi. Думаю, я пойду спрошу на сайте разработчиков, смогут ли они пролить свет на причину происходящего.

В то же время, если у кого-то есть предложения, как с этим справиться, я буду рад их услышать.

Если вы используете Relevanssi, он вмешивается в стандартный поиск (не знаю точно в какой момент), поэтому стандартный запрос не работает.

Я протестировал решение, согласно тому, что прочитал на странице плагина, и это, похоже, сработало. Просто выполните функцию relevanssi для добавления результатов в запрос, следующим образом:

relevanssi_do_query($query1);

Обратите внимание, что параметр – это объект запроса, который вы создали ранее:

$query1 = new WP_Query( array( 'post_type' => 'sdm_downloads', 'posts_per_page' => 3) );

Ответ или решение

При решении задачи по созданию пользовательского запроса в WordPress для отображения определённых постов из кастомного типа записей, может возникнуть необходимость выполнять поиск по определённым условиям. В данном контексте, проблема связана с плагином Relevanssi, который изменяет поведение стандартного поиска в WordPress. Разберём, как можно обойти эту проблему и вручную сформировать WP_Query.

Теория:

WordPress предоставляет класс WP_Query, который позволяет создавать и изменять запросы для получения записей из базы данных на основе различных параметров. Однако некоторые плагины, такие как Relevanssi, могут вмешиваться в стандартный процесс поиска и изменять SQL-запрос. В этом случае, даже при явном указании параметров поиска, может не выдаваться ожидаемый результат.

Пример:

Вы создаёте WP_Query объект, чтобы получить три самых недавних поста из кастомного типа записей ‘sdm_downloads’. Но когда вы добавляете параметр ‘s’ для поиска, вы получаете некорректные результаты. Это указывает на то, что Relevanssi изменяет или блокирует стандартные запросы WordPress.

// Создайте объект WP_Query с учётом параметра поиска.
$query1 = new WP_Query( array( 'post_type' => 'sdm_downloads', 'posts_per_page' => 3, 's' => $s) );

// Запустите функцию Relevanssi для обработки поискового запроса.
relevanssi_do_query($query1);

// Продолжайте обработку результата
if ( $query1->have_posts() ) :
    echo '<div style="background-color:#fffced; padding:10px;margin-bottom:20px;">';
    echo '<h3>Выбранные релевантные элементы из нашей библиотеки Брифингов:</h3>';
    while ( $query1->have_posts() ) {
        $query1->the_post();
        echo '<article class="article-archive" id="post-' . get_the_ID() . '">';
        echo '<header><hgroup><p><a href="' . get_permalink() . '" title="' . esc_attr__('Permalink to ', 'your-text-domain') . get_the_title() . '" rel="bookmark">' . get_the_title() . '</a></p></hgroup></header>';
        echo '</article>';
    }
    echo '</div>';
endif;

Применение:

Для правильного функционирования поиска с использованием плагина Relevanssi, необходимо вручную задействовать функции плагина для обработки запросов. В данном случае, для работы с использованием поиска, следует использовать функцию relevanssi_do_query($query1), которая напрямую обращается к функционалу Relevanssi и обрабатывает WP_Query объект. Это гарантирует, что ваш запрос будет обработан корректно, и плагин сможет предоставить необходимые результаты, даже если он изменяет стандартный процесс поиска WordPress.

Таким образом, используя данную методологию, вы сможете без труда формировать пользовательские запросы с учётом специфики работы сторонних плагинов в WordPress.

Оцените материал
Добавить комментарий

Капча загружается...