В этой статье я покажу вам, как реализовать поиск по всей сети WordPress Multisite:
Посмотрите на этот пример ниже, он позволяет вывести все посты, которые найдены по запросу «вордпресс».
$args = array( 's' => 'вордпресс', // поисковой запрос 'posts_per_page' => -1 ); $nposts = network_query_posts( $args ); // или network_query_posts('s=вордпресс&posts_per_page=-1'); foreach ( $nposts as $npost ): echo '<p>' . $npost->post_title . '</p>'; endforeach;
Вообще тут есть два варианта — простой и сложный. Простой вариант — когда все результаты поиска отображаются на одной странице (ну или вы потом сможете сделать, чтобы подгружались новые при скролле), сложный вариант — это сделать рабочей стандартную вордпрессовскую постраничную навигацию.
Постараюсь предоставить вам подробнейший алгоритм на оба случая.
Простой вариант.
search.php
, отвечающий за вывод результатов поиска, открываем его.
В самое начало файла вам понадобится вставить:
$args = array( 's' => get_search_query(), // или $_GET['s'] это и есть наш поисковой запрос 'posts_per_page' => -1 ); $network_posts = network_query_posts( $args );
В оригинале | Заменить на |
---|---|
if ( have_posts() ) : |
if( $network_posts ) : |
while ( have_posts() ) : |
foreach( $network_posts as $nw_post ) : |
the_post(); |
switch_to_blog( $nw_post->BLOG_ID ); |
endwhile; |
restore_current_blog(); endforeach; |
Обратите внимание, файл search.php
в каждой теме имеет абсолютно разное содержимое, чаще всего в него подгружаются другие файлы шаблонов, которые отвечают скажем, за отображение одной записи в результатах поиска, поэтому тут вам придётся поразбираться.
Сложный вариант.
В самое начало файла вставьте что-то типа:
<?php /* * Template name: Шаблон поиска по сети */ $current_page = ( get_query_var('paged') ) ? get_query_var('paged') : 1; // или $wp_query->query['paged'] $args = array( 's' => $_GET['s'], 'posts_per_page' => get_option('paged'), 'paged' => $current_page ); $network_posts = network_query_posts( $args ); // далее содержимое файла search.php ?>
После этих строчек кода смело вставляете всё содержимое файла search.php
.
wp_pagenavi();
) вставляем $wp_query = $GLOBALS['network_query'];
.action
на ссылку на созданную вами страницу, приблизительный пример:
<form action="http://ваш-сайт/poisk-multisite" method="GET"> <input type="text=" name="s" /> <button>Поиск</button> </form>
Рекомендую сначала разобраться с простым вариантом, тогда у вас уже точно не будет никаких проблем со сложным.
Если этот заголовок вам ни о чем не говорит, рекомендую почитать про произвольные поля, про WP_Query и про meta_query.
$args = array( 'posts_per_page' => -1, // для удобства пусть выводятся все посты 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'key1', // значение произвольного поля key1 должно содержать "wordcamp" 'value' => 'wordcamp', 'compare' => 'LIKE' ), array( 'key' => 'key2', // ИЛИ значение key2 должно содержать wp 'value' => 'wp' 'compare' => 'LIKE' ) ) ); $network_q_posts = network_query_posts( $args ); // то же самое можно реализовать и для одного сайта, заменив network_query_posts() на query_posts() foreach( $network_q_posts as $network_q_post ) : echo '<p>' . $network_q_post->post_title . '</p>'; endforeach; network_reset_query();
Вообще тут всё сводится к функции network_get_terms() и двум её аргументам: name_like
(поиск по части названия) и description_like
(поиск по части описания). Теперь примеры:
// ищем рубрики, описание которых содержит wordcamp $network_cats = network_get_terms('category', 'description_like=wordcamp'); if( $network_cats ){ foreach ( $network_cats as $network_cat ){ echo $network_cat->name; } }
// ищем метки, название которых содержит wp $network_post_tags = network_get_terms('post_tag', 'name_like=wp'); if( $network_post_tags ){ foreach ( $network_post_tags as $network_post_tag ){ echo $network_post_tag->name; } }
Тема не самая простая, поэтому пожалуйста, если у вас возникли вопросы, оставляйте их в комментариях.
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.