Вопрос или проблема
Я создал мультisite на локальной виртуальной машине и установил свою тему.
Теперь я пытаюсь получить последние посты со всех сайтов, чтобы отображать их по последнему обновлению на главной странице.
Из того, что я читал, лучшим вариантом должно быть создание пользовательского шаблона для моей домашней страницы.
Это правильно?
Так что я беру код в своем шаблоне page.php, но не могу понять, как его изменить.
<?php
/**
* Шаблон для отображения всех страниц.
*
* Это шаблон, который отображает все страницы по умолчанию.
* Обратите внимание, что это конструкция WordPress страниц и что другие
* 'страницы' на вашем сайте WordPress будут использовать другой шаблон.
*
*/
get_header();
global $heap_private_post;
if ( post_password_required() && ! $heap_private_post['allowed'] ) {
// защита паролем
get_template_part( 'theme-partials/password-request-form' );
} else { ?>
<div class="page-content single-page-content">
<?php if ( have_posts() ): the_post(); ?>
<article class="article page page-single page-regular">
<header>
<?php if ( has_post_thumbnail() ):
$image = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full-size' );
if ( ! empty( $image[0] ) ): ?>
<div class="page__featured-image">
<img src="https://wordpress.stackexchange.com/questions/361346/<?php echo $image[0] ?>" alt="<?php the_title(); ?>"/>
</div>
<?php endif;
endif; ?>
</header>
<div class="page__wrapper">
<section class="page__content js-post-gallery cf">
<h1 class="page__title"><?php the_title(); ?></h1>
<hr class="separator separator--dark"/>
<?php the_content(); ?>
</section>
<?php
global $numpages;
if ( $numpages > 1 ):
?>
<div class="entry__meta-box meta-box--pagination">
<span class="meta-box__title"><?php _e( 'Страницы', 'heap' ) ?></span>
<?php
$args = array(
'before' => '<ol class="nav pagination--single">',
'after' => '</ol>',
'next_or_number' => 'next_and_number',
'previouspagelink' => __( '«', 'heap' ),
'nextpagelink' => __( '»', 'heap' )
);
wp_link_pages( $args );
?>
</div>
<?php
endif;
//комментарии
if ( comments_open() || '0' != get_comments_number() ):
comments_template();
endif; ?>
</div>
</article>
<?php
else :
get_template_part( 'no-results' );
endif; ?>
</div><!-- .page-content -->
<?php } // закрыть if защита паролем
get_footer();
РЕДАКТИРОВАНО
Мне удалось достичь этого, используя этот код:
foreach( $subsites as $subsite ) {
$subsite_id = get_object_vars($subsite)["blog_id"];
$subsite_name = get_blog_details($subsite_id)->blogname;
switch_to_blog($subsite_id);
$blog_posts = get_posts();
restore_current_blog();
foreach( $blog_posts as $post ) {
setup_postdata( $post );
}
На самом деле существует способ получения постов со всех под-сайтов мультисайта. Я делаю это с помощью моего плагина “Multisite Media Display” здесь https://wordpress.org/plugins/multisite-media-display/ .
Я использую его, чтобы отображать все медиафайлы с моего мультисайта, чтобы убедиться, что любые отправления соответствуют требованиям сайта. Работает отлично.
У меня есть похожий плагин для постов, но он не работает с текущей версией WP. Было низким приоритетом для обновления.
Но вы можете получить массив всех под-сайтов (хотя функция, которая это делает, не работает с версиями WP до 4.6). Затем вы перебираете этот массив, проводя запрос постов по мере необходимости.
ДОБАВЛЕНО
Вот немного кода с комментариями. Код получит все под-сайты, затем переключится на каждый под-сайт, где вы можете вставить свой запрос и вывести посты в ‘цикле’.
$subsites_object = get_sites(); // получить сайты в объект
// преобразовать в массив
$subsites = objectToArray($subsites_object);
// обработать каждый под-сайт
foreach ($subsites as $subsite) {
// получить некоторые значения для дальнейшего использования, если необходимо
// $subsite_id важно; это переключает на под-сайт
$subsite_id = $subsite["blog_id"];
$subsite_name = get_blog_details($subsite_id)->blogname;
$subsite_path = $subsite["path"];
$subsite_domain = $subsite["domain"];
switch_to_blog($subsite_id);
// выполните ваш запрос публикации, затем выполните 'цикл', чтобы получить публикации
}
Вы можете вставить это в шаблон. Или вы можете добавить код для шорткода, который будет выводить вещи.
Много помощи в гуглах/бингах/уточках. Посмотрите документацию коду WP, чтобы узнать, что делает каждая вещь.
Ответ или решение
Создание решения для получения последних постов со всех сайтов в WordPress мультисайт-сети может показаться сложной задачей. Однако, с правильным подходом, вы сможете реализовать это функционально и эффективно. Рассмотрим, как это сделать, используя WordPress API, учитывая при этом возможные нюансы и тонкости разработки для мультисайтов.
F – Факты и Функциональность
WordPress мультисайт — это функция, позволяющая запускать несколько сайтов на одной установке WordPress. Получение последних постов со всех сайтов в такой сети требует использования некоторых внутренних функций WordPress, таких как get_sites()
и switch_to_blog()
. Эти функции позволяют переключаться между сайтами и выполнять запросы к базе данных каждого из них.
O – Опции и Решения
На основе вашего описания, чтобы получить последние посты со всех сайтов в сети и вывести их на главную страницу, вам необходимо:
-
Получить список всех сайтов в сети: Используйте функцию
get_sites()
, которая возвращает список всех доступных сайтов в виде объекта. -
Переключиться на каждый сайт: Используйте
switch_to_blog($subsite_id)
, чтобы переключиться на конкретный сайт. Это даст вам возможность выполнять запросы (например, для получения постов) так, как если бы вы физически находились на этом сайте. -
Получить и сохранить посты: Используйте
get_posts()
на каждом сайте, чтобы извлечь необходимые посты. Не забудьте использоватьsetup_postdata($post)
, чтобы корректно подготовить данные поста. -
Вернуться на исходный сайт: Каждый раз после получения постов с одного из сайтов, используйте
restore_current_blog()
.
Пример кода может выглядеть так:
$subsites = get_sites();
foreach ($subsites as $subsite) {
$subsite_id = get_object_vars($subsite)["blog_id"];
switch_to_blog($subsite_id);
$args = array(
'numberposts' => 5, // Количество постов, которые вы хотите получить
'orderby' => 'post_date',
'order' => 'DESC',
);
$recent_posts = get_posts($args);
foreach ($recent_posts as $post) {
setup_postdata($post);
// Здесь вы можете отобразить пост, например, используя the_title() или the_content()
}
wp_reset_postdata();
restore_current_blog();
}
R – Результаты и Рекомендации
Этот подход позволяет получить актуальные посты со всех сайтов в вашей мультисайт-сети WordPress и отобразить их на главной странице. Это может быть полезно для агрегирования контента или создания единой точки доступа к важной информации.
E – Эмоции и Оценка
Реализация такого функционала способствует созданию более интегрированного пользовательского опыта и улучшает взаимодействие с содержанием на вашем сайте. Вы сможете легко управлять обновлениями и улучшать видимость новых материалов.
S – Стратегия и Инновации
Подумайте о создании плагина или шаблона, который автоматизирует этот процесс в будущем и делает связанный код более управляемым. Это не только упростит разработку, но и повысит масштабируемость вашего решения.
T – Заключение и Призыв к Действию
Я рекомендую тщательно протестировать каждый аспект этого решения на вашем локальном сервере, прежде чем перенести его в производственную среду. Это поможет выявить любые возможные проблемы и обеспечить стабильность работы сайта. Если у вас возникнут сложности или потребуются дополнительные функции, обратитесь к документации WordPress или к профессионалам, которые помогут вам оптимизировать код под ваши специфические требования.