Вопрос или проблема
Я пытаюсь вручную создать запрос в ‘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.