Как сгруппировать сообщения и получить смешанное представление сообщений и групп?


Допустим, мне нужно реализовать следующее в WordPress:

У меня есть CPT под названием "песня", которая представляет собой отдельные песни разных исполнителей. Иногда песни могут быть сгруппированы по альбомам, но не всегда.

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

ПОСЛЕДНИЕ ВЫПУСКИ

  • Песня 1
  • песня 2
  • Песня 3
  • Альбом 1
    • Песня 4
    • Песня 7
    • Песня 9
  • Песня 6
  • Песня 8
  • Песня 10

И т.д.

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

Видите ли вы, как создать это в WordPress? С пользовательской таксономией CTP +? Или 2 CPT (1 альбом, 1 песня)?

Я делал это в прошлом, используя 2 CPT (1 альбом, 1 песня):

  • Вы можете добавить любое количество песен в альбом (с помощью ACF
  • В действии save_post я добавлял настраиваемое поле "parent_id" для каждого дочернего элемента, содержащего...идентификатор родительской записи.
  • Тогда я мог бы добиться этого с помощью WP_Query, который запрашивал оба CPT, но исключал сообщения с установленным полем cusom "parent_id".

Но в то время это звучало банально.. Видите ли вы лучший способ справиться с таким поведением? Что делать, если я хочу использовать таксономию вместо CPT? С точки зрения UX, пользователи предпочли бы добавлять теги к песням вместо того, чтобы вручную создавать альбом и добавлять в него песни.

Это похоже на очень распространенный шаблон, но я не могу найти правильный способ сделать это:(

Author: thomascharbit, 2015-02-11

1 answers

Пользовательская таксономия имеет смысл - надеюсь, я ничего не пропустил:

$songs = get_posts(
    array(
        'post_type' => 'song',
    )
);

$index = array(); // Build an album_id => songs index
foreach ( $songs as $song ) {
    if ( $albums = get_the_terms( $song->ID, 'album' ) )
        $index[ $albums[0]->term_id ][] = $song;
    else
        $index[ count( $index ) - 1 ][] = $song; // All on it's own. Negative index will not clash with album ID
}

echo '<ul class="songs">';
foreach ( $index as $album_id => $songs ) {
    if ( count( $songs ) > 1 ) // More than one song in this album?
        echo '<li class="album">' . get_term_field( 'name', $album_id, 'album' ) . '<ul>';

    foreach ( $songs as $song )
        echo '<li>' . get_the_title( $song ) . '</li>';

    if ( count( $songs ) > 1 )
        echo '</ul></li>';
}
echo '</ul>';

$index унаследует порядок $songs, независимо от того, как они были запрошены. Когда песня принадлежит альбому, все последующие песни в этом альбоме добавляются в стек и отображаются во вложенном списке, где индексируется первая песня.

 0
Author: TheDeadMedic, 2015-02-16 13:34:30