Получить последние публикации с мультисайта

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

Я создал мульт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' => __( '&laquo;', 'heap' ),
                                    'nextpagelink'     => __( '&raquo;', '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 – Опции и Решения

На основе вашего описания, чтобы получить последние посты со всех сайтов в сети и вывести их на главную страницу, вам необходимо:

  1. Получить список всех сайтов в сети: Используйте функцию get_sites(), которая возвращает список всех доступных сайтов в виде объекта.

  2. Переключиться на каждый сайт: Используйте switch_to_blog($subsite_id), чтобы переключиться на конкретный сайт. Это даст вам возможность выполнять запросы (например, для получения постов) так, как если бы вы физически находились на этом сайте.

  3. Получить и сохранить посты: Используйте get_posts() на каждом сайте, чтобы извлечь необходимые посты. Не забудьте использовать setup_postdata($post), чтобы корректно подготовить данные поста.

  4. Вернуться на исходный сайт: Каждый раз после получения постов с одного из сайтов, используйте 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 или к профессионалам, которые помогут вам оптимизировать код под ваши специфические требования.

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

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