@tbalero

Как получить цифру количества записей из поля Relationship field (ACF) для записей, имеющих «обратную» ("reverse") связь?

На вордпресс-сайте:
- Создан произвольный тип записей “producers”.
- Создан произвольный тип записей “movies”.
- Для возможности связи записей типа “movies” с записями типа “producers” создано кастомное поле “movies_of_this_producer” (кастомное поле типа Relationship field, созданное с помощью плагина Advanced Custom Fields www.advancedcustomfields.com/resources/relationship ).

Соответственно на странице создания/редактирования записей произвольного типа “movies” отображается кастомное поле “movies_of_this_producer” (кастомное поле типа Relationship field), в этом кастомном поле для конкретной записи типа “movies” есть возможность указать одну или несколько записей типа “producers” (то-есть указать "связь" конкретной записи типа “movies” с одной или несколькими записями типа “producers”).

В результате, на сайте есть корректная связь между записями типа “movies” и записями типа “producers”.
- *У записей типа “movies” - прямая связь с записями типа “producers” (так как кастомное поле “movies_of_this_producer” отображается на страницах создания/редактирования именно записей типа “movies”);
- *У записей типа “producers” - обратная ("reverse") связь с записями типа “movies”;

Например, есть запись “Steven Spielberg” (запись произвольного типа “producers”) и она с помощью кастомного поля “movies_of_this_producer” (кастомное поле типа Relationship field) связана с 5 записями: “Jaws”, “Jurassic Park”, “Schindler’s List”, “The Terminal”, “Bridge of Spies” (с 5 записями произвольного типа “movies”).

Для того, чтобы на странице конкретной записи произвольного типа “producers” (шаблон single-produsers.php) отобразить список связанных записей произвольного типа “movies” - использую обратный запрос ("Reverse Query"), как в этом мануале: www.advancedcustomfields.com/resources/tutorials/q... . И это работает корректно.

1) Теперь нужно отобразить на главной странице (шаблон index.php) список записей произвольного типа “movies”, и для каждой конкретной записи произвольного типа “movies”, отображаемой в этом списке, нужно отобразить цифру количества записей произвольного типа “producers”, связанных с данной конкретной записью (связанных с помощью кастомного поля "отношения movies_of_this_producer" типа Relationship field).

2) И еще нужно отобразить на главной странице (шаблон index.php) список записей произвольного типа “producers”, и для каждой конкретной записи произвольного типа “producers”, отображаемой в этом списке, нужно отобразить цифру количества записей произвольного типа “movies”, связанных с данной конкретной записью (связанных с помощью кастомного поля "отношения movies_of_this_producer" типа Relationship field).

- Для решения задачи №1 (отобразить на главной странице список записей произвольного типа “movies” с цифрой количества связанных записей произвольного типа “producers”) использую данный код (и он работает корректно):

<?php
$TESTrel_movies = new WP_Query( array(
    'post_type' => 'movies',
    'post__not_in' => array($post->ID),
    'posts_per_page' => 5,
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_key' => 'movies_of_this_producer',
    'offset' => 0,
    ) );
?>

<?php if( $TESTrel_movies ): ?>
<div class="content_block_wrap two_columns_right col-md-6">
    <div class="content_block transparent_block_with_border">
        <div class="block_title">
            Title here
        </div>
        <ul>
            <?php
                while ( $TESTrel_movies->have_posts() ) :
            $TESTrel_movies->the_post();
            ?>
                <li class="content_item col-xs-12">
                    <a class="post_thumbnail" href="<?php echo get_permalink( $TESTrel_movies->ID ); ?>">
                        <?php echo get_the_post_thumbnail( $TESTrel_movies->ID, '90x60-thumb' ); ?>
                    </a>

                    <a href="<?php echo get_permalink( ); ?>"><?php echo get_the_title( ); ?></a>
                    
                    Number of related posts: <?php
                    echo $movie_count = count(get_field('movies_of_this_producer'));
                    ?>

                </li>
            <?php
            endwhile;
            ?>
        </ul>
    </div>
</div>
<?php endif; ?>

<?php
wp_reset_postdata();
?>


- Однако, если я использую аналогичный код, чтобы решить задачу №2 (отобразить на главной странице список записей произвольного типа “producers” с цифрой количества связанных записей произвольного типа “movies”) - этот код работает некорректно (в результате получаю список записей произвольного типа “producers”, но при этом цифра количества связанных записей произвольного типа “movies” - ошибочно равна нулю). Вот этот код (который пытаюсь использовать, но который работает некорректно):

<?php
$TESTrel_producers = new WP_Query( array(
    'post_type' => 'producers',
    'post__not_in' => array($post->ID),
    'posts_per_page' => 5,
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_key' => 'movies_of_this_producer',
    'offset' => 0,
    ) );
?>

<?php if( $TESTrel_producers ): ?>
<div class="content_block_wrap two_columns_right col-md-6">
    <div class="content_block transparent_block_with_border">
        <div class="block_title">
            Title here
        </div>
        <ul>
            <?php
                while ( $TESTrel_producers->have_posts() ) :
            $TESTrel_producers->the_post();
            ?>
                <li class="content_item col-xs-12">
                    <a class="post_thumbnail" href="<?php echo get_permalink( $TESTrel_producers->ID ); ?>">
                        <?php echo get_the_post_thumbnail( $TESTrel_producers->ID, '90x60-thumb' ); ?>
                    </a>

                    <a href="<?php echo get_permalink( ); ?>"><?php echo get_the_title( ); ?></a>
                    
                    Number of related posts: <?php
                    echo $producer_count = count(get_field('movies_of_this_producer'));
                    ?>

                </li>
            <?php
            endwhile;
            ?>
        </ul>
    </div>
</div>
<?php endif; ?>

<?php
wp_reset_postdata();
?>


Думаю, что в данном случае - возможно, требуется использовать какой-то "обратный" ("reverse") способ, потому что записи произвольного типа “producers” - имеют "обратную" ("reverse") связь с записями произвольного типа “movies” (связь через кастомное поле "movies_of_this_producer" типа Relationship field), но я не знаю, как сделать это.

Вопрос: Как отобразить на главной странице (шаблон index.php) список записей пользовательского типа “producers”, с цифрой количества связанных записей произвольного типа “movies” (связанных с помощью поля "movies_of_this_producer" типа Relationship field)? (* это задача №2, описанная в данном вопросе)
  • Вопрос задан
  • 548 просмотров
Пригласить эксперта
Ответы на вопрос 1
cesnokov
@cesnokov
<head>&nbsp;</head>
<?php
$TESTrel_producers = new WP_Query( array(
    'post_type' => 'producers',
    'post__not_in' => array($post->ID),
    'posts_per_page' => 5,
    'orderby' => 'meta_value_num',
    'order' => 'ASC',
    'meta_key' => 'movies_of_this_producer',
    'offset' => 0,
    ) );
?>

<?php if( $TESTrel_producers ): ?>
<div class="content_block_wrap two_columns_right col-md-6">
    <div class="content_block transparent_block_with_border">
        <div class="block_title">
            Title here
        </div>
        <ul>
            <?php
                while ( $TESTrel_producers->have_posts() ) :
            $TESTrel_producers->the_post();
            ?>
                <li class="content_item col-xs-12">
                    <a class="post_thumbnail" href="<?php echo get_permalink( $TESTrel_producers->ID ); ?>">
                        <?php echo get_the_post_thumbnail( $TESTrel_producers->ID, '90x60-thumb' ); ?>
                    </a>

                    <a href="<?php echo get_permalink( ); ?>"><?php echo get_the_title( ); ?></a>

                    Number of related posts: <?php
                    $producers_movies = get_posts(array(
                      'post_type' => 'movies',
                      'meta_query' => array(
                        array(
                          'key' => 'movies_of_this_producer',
                          'value' => '"' . get_the_ID() . '"',
                          'compare' => 'LIKE'
                        )
                      )
                    ));
                    if ($producers_movies) {
                      echo count($producers_movies);
                    } esle {
                      echo '0';
                    }
                    ?>

                </li>
            <?php
            endwhile;
            ?>
        </ul>
    </div>
</div>
<?php endif; ?>

<?php
wp_reset_postdata();
?>


Вместо этого:
<?php
echo $producer_count = count(get_field('movies_of_this_producer'));
?>

Вот это:
<?php
$producers_movies = get_posts(array(
   'post_type' => 'movies',
   'meta_query' => array(
      array(
         'key' => 'movies_of_this_producer',
         'value' => '"' . get_the_ID() . '"',
         'compare' => 'LIKE'
      )
   )
));
if ($producers_movies) {
   echo count($producers_movies);
} esle {
   echo '0';
}
?>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы