Лучший способ назначить должность на главной странице новостного сайта? (никаких категорий, никаких липких постов)
В настоящее время я занимаюсь редизайном местного новостного сайта. В старом дизайне использовалось множество категорий для обработки положения контента на статической домашней странице, например, в "главных новостях", "среднем окне", "левом окне" и так далее.
Это в некотором роде работает, но это очень некрасиво, на мой взгляд, очень неправильно на семантическом уровне: категории должны использоваться для классификации.
Другим вариантом может быть использование липких сообщений, но у вас может быть только "липкая" или "не липкая" ситуация что в некотором роде ограничено.
Я бы не использовал пользовательские типы сообщений: в основном все сообщения являются новостями, и было бы излишним иметь отдельный CPT для размещения моего контента на главной странице.
Идеальным решением было бы:
- возможность выбирать между n позициями (мне нужно 4)
- со статусом по умолчанию, который помещает публикацию в поле "другие новости"
- контролируйте количество сообщений, отправляемых в определенное поле: главное окно новостей содержит только одну новость, если есть новая "главная новость" старая не должна исчезать с главной страницы, а переключаться на более низкую позицию.
Резюмируя, у меня есть 5 ящиков, 4 из них представляют собой отдельный контейнер новостей "более высокого уровня", последний содержит 10 новостей в обратном хронологическом порядке. Эти 10 новостей должны быть "обычными" новостями и новостями "более высокого уровня", вытесненными из верхних ящиков.
Я думал о расширенном пользовательском поле как о решении, позволяющем редактору выбирать позицию, но я не уверен, что это выполнимо спереди конец.
Спасибо!
2 answers
Я бы предложил добавить Пользовательские поля в сообщения (либо по соглашению, либо путем создания специального мета-поля), а затем создать логику в front-page.php как их отобразить.
- Добавьте пользовательские поля в сообщения, например "main_news"
- Имеют несколько циклов на front-page.php просто отфильтруйте те сообщения, которые соответствуют вашим критериям, чтобы поместить их в коробку.
ИЗМЕНИТЬ: Чтобы пропустить некоторые сообщения в запросе, используйте смещение параметр:
$query = new WP_Query( 'offset=1' ) );
Более подробная информация в разделе Разбивка на страницы Кодекса на WP_Query
После долгих поисков и проб и ошибок я думаю, что нашел решение.
Он включает пользовательские поля, для которых я использовал Расширенное пользовательское поле , но это необязательно.
Чтобы упростить работу с автором сайта, я поставил метабокс перед актуальными новостями
Теперь на моей домашней странице у меня есть 5 областей: 4 из них содержат только одну новость, а 5-я - окно "другие новости" с десятью новыми.
Итак, первые 4 коробки довольно просты:
$recentPosts = new WP_Query();
$recentPosts->query(array(
'meta_key' => 'position',
'meta_value' => 'Top1',
'showposts' => 1
)
);
С помощью мета-значение с правильной позицией, которая мне нужна.
Основная проблема заключалась в следующем: как я могу поместить старые новости "Top1" в поле "другие новости" без необходимости вручную переключать настраиваемое поле?
$top1 = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Top1',
'offset' => 1
));
$top2 = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Top2',
'offset' => 1
));
$top3 = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Top3',
'offset' => 1
));
$top4 = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Top4',
'offset' => 1
));
$other = get_posts(array(
'meta_key' => 'position',
'meta_value' => 'Other news'
));
$mergedposts = array_merge( $top1, $top2, $top3, $top4, $other );
$postids = array();
foreach( $mergedposts as $item ) { $postids[]=$item->ID; }
$uniqueposts = array_unique($postids);
$posts = get_posts(array(
'post__in' => $uniqueposts,
'showposts' => 3
));
foreach( $posts as $post ) :
setup_postdata($post);
Возможно, код можно было бы немного почистить, но он работает так, как мне было нужно. Я надеюсь, что это полезно.