Лучший способ назначить должность на главной странице новостного сайта? (никаких категорий, никаких липких постов)


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

Это в некотором роде работает, но это очень некрасиво, на мой взгляд, очень неправильно на семантическом уровне: категории должны использоваться для классификации.

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

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

Идеальным решением было бы:

  • возможность выбирать между n позициями (мне нужно 4)
  • со статусом по умолчанию, который помещает публикацию в поле "другие новости"
  • контролируйте количество сообщений, отправляемых в определенное поле: главное окно новостей содержит только одну новость, если есть новая "главная новость" старая не должна исчезать с главной страницы, а переключаться на более низкую позицию.

Резюмируя, у меня есть 5 ящиков, 4 из них представляют собой отдельный контейнер новостей "более высокого уровня", последний содержит 10 новостей в обратном хронологическом порядке. Эти 10 новостей должны быть "обычными" новостями и новостями "более высокого уровня", вытесненными из верхних ящиков.

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

Спасибо!

Author: kraftner, 2014-02-19

2 answers

Я бы предложил добавить Пользовательские поля в сообщения (либо по соглашению, либо путем создания специального мета-поля), а затем создать логику в front-page.php как их отобразить.

  1. Добавьте пользовательские поля в сообщения, например "main_news"
  2. Имеют несколько циклов на front-page.php просто отфильтруйте те сообщения, которые соответствуют вашим критериям, чтобы поместить их в коробку.

ИЗМЕНИТЬ: Чтобы пропустить некоторые сообщения в запросе, используйте смещение параметр:

$query = new WP_Query( 'offset=1' ) );

Более подробная информация в разделе Разбивка на страницы Кодекса на WP_Query

 0
Author: kraftner, 2014-02-19 10:53:14

После долгих поисков и проб и ошибок я думаю, что нашел решение.

Он включает пользовательские поля, для которых я использовал Расширенное пользовательское поле , но это необязательно.

Чтобы упростить работу с автором сайта, я поставил метабокс перед актуальными новостями

enter image description here

Теперь на моей домашней странице у меня есть 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);

Возможно, код можно было бы немного почистить, но он работает так, как мне было нужно. Я надеюсь, что это полезно.

 0
Author: molokom, 2014-02-20 10:07:50