Скидання даних публікації до попереднього циклу в вкладених циклах


21

Я намагаюся використовувати вкладені петлі з плагінами дописів для публікацій. Петлі працюють обидва, але проблема виникає після другого вкладеного циклу ($ issue). Я хочу знову отримати доступ до циклу публікацій $, але дані все ще є даними $ issue.

wp_reset_query() повернеться назад до основного циклу в Single.php, який я не хочу.

Я міг би використовувати get_posts()замість нових WP_Query, але хочу використовувати get_template_part().

Як я можу скинути свої дані назад до циклу публікації, щоб другий "Назва публікації" повертав публікацію, а не випуск, назву?

Ось мій код у single.php:

$publication = new WP_Query( array(
'connected_type'  => 'publication_to_post',
'connected_items' => $post->ID,
'fields'          => 'ids',
'posts_per_page'  => 1,
) );

if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
    echo '<h2>Publication title = '.get_the_title().'</h2>';
    $pub_id = get_the_ID();

    $issue = new WP_Query( array(
        'connected_type'  => 'publication_to_issue',
        'connected_items' => $pub_id,
        'fields'          => 'ids',
        'posts_per_page'  => 1,
    ) );

    if ( $issue->have_posts() ) {
        while ( $issue->have_posts() ) : $issue->the_post();

            // need to be able to use template parts in here
            echo '<h2>Issue title = '.get_the_title().'</h2>';

        endwhile;
    }

    // This currently returns the issue title, not the publication title
    echo '<h2>Publication title = '.get_the_title().'</h2>';

endwhile;
}

Відповіді:


20

Я збираюся відповісти на це сам, але саме розумний @simonwheatley з Кодексу для людей вирішив це для мене.

Замість використання wp_reset_postdata()або wp_reset_query()ви можете використовувати наступне:

$publication->reset_postdata();

Де $ публікація - ваш об’єкт запиту.

Тепер робочий код виглядає так:

$publication = new WP_Query( array(
'connected_type'  => 'publication_to_post',
'connected_items' => $post->ID,
'fields'          => 'ids',
'posts_per_page'  => 1,
) );

if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
    echo '<h2>Publication title = '.get_the_title().'</h2>';
    $pub_id = get_the_ID();

    $issue = new WP_Query( array(
        'connected_type'  => 'publication_to_issue',
        'connected_items' => $pub_id,
        'fields'          => 'ids',
        'posts_per_page'  => 1,
    ) );

    if ( $issue->have_posts() ) {
        while ( $issue->have_posts() ) : $issue->the_post();

            // need to be able to use template parts in here
            echo '<h2>Issue title = '.get_the_title().'</h2>';

        endwhile; $publication->reset_postdata();
    }

    echo '<h2>Publication title = '.get_the_title().'</h2>';

endwhile;
}

1
Дійсно, це набагато розумніший спосіб зробити це.
Девід

Це справді працює для вас?
GDY

5

Перш за все, я думаю, що це можливо використовувати get_posts()в поєднанні з setup_postdata(). За допомогою них ви можете використовувати теги шаблонів, як у звичайному циклі WordPress.

Але ви можете використовувати цю функцію також у вкладених петлях:

# make sure $post is the global in your scope (which should be the case in single.php)
global $post;
if ( $publication->have_posts() ) {
while ( $publication->have_posts() ) : $publication->the_post();
    echo '<h2>Publication title = '.get_the_title().'</h2>';
    $pub_id = get_the_ID();

    # preserve the current post in the higher loop
    $preserve_post = get_post();

    $issue = new WP_Query( array(
        'connected_type'  => 'publication_to_issue',
        'connected_items' => $pub_id,
        'fields'          => 'ids',
        'posts_per_page'  => 1,
    ) );

    if ( $issue->have_posts() ) {
        while ( $issue->have_posts() ) : $issue->the_post();

            // need to be able to use template parts in here
           echo '<h2>Issue title = '.get_the_title().'</h2>';

        endwhile;
    }

    # set the global back to your first loop post
    $post = $preserve_post;
    setup_postdata( $post );
    // This currently returns the issue title, not the publication title
    echo '<h2>Publication title = '.get_the_title().'</h2>';

endwhile;
}
wp_reset_query();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.