Как сгруппировать сообщения и получить смешанное представление сообщений и групп?
Допустим, мне нужно реализовать следующее в 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, пользователи предпочли бы добавлять теги к песням вместо того, чтобы вручную создавать альбом и добавлять в него песни.
Это похоже на очень распространенный шаблон, но я не могу найти правильный способ сделать это:(
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
, независимо от того, как они были запрошены. Когда песня принадлежит альбому, все последующие песни в этом альбоме добавляются в стек и отображаются во вложенном списке, где индексируется первая песня.