WP ACF - объединение разных полей / затем цикл с WP Query

Я часами искал решение своей проблемы. Я не смог найти ничего похожего на то, чего я пытаюсь достичь, так что я действительно застрял и ценю любую помощь!

У меня есть CPT под названием «журнал» с несколькими полями ACF. Одно поле ACF - это "год" выхода журнала. Другое поле - это «номер журнала», который похож на уникальный идентификатор. Ежегодно издается несколько журналов.

Я пытаюсь достичь результата, который дает мне элемент «ul» для каждого «года» и элементы «li» для каждого «номера журнала», который был опубликован в соответствующем «году».

Например, вот так:

<ul class="2019">
   <li>200</li>
   <li>199</li>
   <li>198</li>
   <li>197</li>
   <li>196</li>
</ul>

<ul class="2018">
   <li>195</li>
   <li>194</li>
   <li>193</li>
   <li>192</li>
   <li>191</li>
</ul>

Я понятия не имею, по логике, как подойти к этой проблеме. Как я могу сделать перекрестные ссылки на поля, сократить все поля «год» (а их несколько) до одного вывода, а затем вывести все «номера журнала», опубликованные в конкретный год, а затем вывести несколько списков для каждого года, как показано выше?


person JMan    schedule 14.10.2019    source источник
comment
Куда вы пытаетесь вывести эту информацию? Это в архиве?   -  person disinfor    schedule 14.10.2019
comment
Я пытался вывести страницу с одним журналом, чуть позже я могу добавить код из того, как у меня работал список лет, тогда мне нужен второй столбец для всех номеров журнала, когда я нажимаю на год (который я собираюсь делать с jQuery).   -  person JMan    schedule 14.10.2019


Ответы (2)


Мне удалось получить желаемые результаты с некоторой помощью вашего ввода @DubVader

Вот код, который я использовал:

<?php foreach($magazine_year as $option ){

    $args = array(

        'post_type' => 'magazine',
        'meta_key' => 'year',
        'meta_value' => $option

     );

$the_query = new WP_Query( $args ); ?>

<?php if( $the_query->have_posts() ):

     ?>
    <ul class="<?php echo $option; ?>">
    <?php while( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <li>
                <?php the_field('magazine_number'); ?>
        </li>
    <?php endwhile; ?>
    </ul>
<?php endif; }?>

<?php wp_reset_query();  // Restore global post data stomped by the_post(). ?>    
person JMan    schedule 15.10.2019

Вы можете попробовать что-то вроде этого. Мне кажется, что сначала нужно получить все годы, а затем выполнять запросы для каждого года, чтобы получить номера журналов. Я не уверен, насколько интенсивно это будет на вашем сервере, вам нужно просто попробовать. Возможно, придется скорректировать имена ваших полей.

<?php

global $post;

$args = array(

   'post_type' => 'magazine'

);

$posts = new WP_Query($args); // Query posts of 'magazine' post type

$magazine_years = array(); // set up array to put years in

if ($posts) {

   foreach ($posts as $post) {

      setup_postdata( $post );

      $the_year = get_field('year'); // get the value of year field
      $magazine_years[] = $the_year; // add year to the array

   }


}

wp_reset_postdata(); // reset the query so we dont introduce a problem with more queries

foreach ($magazine_years as $year) {

// do a query for each year

   $args = array(

      'post_type' => 'magazine',
      'meta_key' => 'year',
      'meta_value_num' => $year

   );

   $posts = new WP_Query($args);

   if ($posts) { ?>

  <!-- create your list -->

    <h1><?php echo $year; ?></h1>
    <ul class="<?php echo $year; ?>">

<?php foreach($posts as $post) {

         setup_postdata( $post );
         <li><php the_field('magazine_number'); ?></li>

      } ?>

    </ul>

<?php   

  }

 // reset the query data so you can run another without issue

  wp_reset_postdata();

}
person DubVader    schedule 14.10.2019
comment
Большое спасибо за ваш вклад. Я пробовал следующий код, но он не работает. Я получаю очень длинный список с одним и тем же номером журнала снова и снова для каждого элемента li. - person JMan; 15.10.2019
comment
Интересно. В этом случае кажется, что требуется небольшая корректировка, но это общая идея, которая вам нужна для достижения того, что вы ищете. Возможно, нам просто не хватает настройки данных публикации. Я внес изменения в исходное решение. Судя по количеству элементов li, которые вы видите, общее количество элементов li соответствует общему количеству сообщений? - person DubVader; 15.10.2019
comment
Когда я пробовал ваш код, у меня также было довольно много пустых лилий и слишком много одинаковых элементов, поэтому их было намного больше, чем общее количество сообщений. - person JMan; 15.10.2019
comment
Кроме того, есть ли у вас идеи, как я могу сохранить эти значения во вложенном массиве, таком как 2018 => array(156, 155, 154, 153)? - person JMan; 15.10.2019
comment
да. Создайте пустой массив, чтобы поместить в него годы и идентификаторы. Если вы поместите все идентификаторы года в их собственный массив во время цикла, после завершения цикла вы можете передать год и его идентификаторы в предварительно созданный массив. Вот пример: repl.it/@dubvader/PHP-Testing-Envo - person DubVader; 15.10.2019
comment
Спасибо за ответ. Итак, я бы использовал цикл WP-запроса также через все годы, сохранял их в массиве, затем перебирал значения mag и сохранял их в массиве, а затем сохранял массив mag в массиве года? - person JMan; 15.10.2019
comment
Вроде, как бы, что-то вроде. Сначала создайте массив года. Создайте еще один массив для окончательного массива. Мы назовем его $mag_by_year = array();. Затем переберите массив лет и выполните запрос (для этого вы можете просто использовать get_posts ();) для журналов за каждый год. Прокрутите журналы, возьмите необходимую информацию, введите последний массив с годом в первом цикле, например, $mag_by_year[$year] = $whatever_data_you_need. - person DubVader; 16.10.2019
comment
Интересно, глядя на мой первоначальный пост и последний, я бы сказал, что вам может быть лучше просто использовать get_posts () вместо запросов. Хотя решать вам. Удачи - person DubVader; 16.10.2019
comment
Большое спасибо за Вашу помощь. Это действительно очень помогло мне, так как я все еще новичок в php. - person JMan; 16.10.2019