2013-03-19 2 views
4

У меня есть несколько профилей, которые позволяют пользователям публиковать новости, которые я хочу отображать в одном длинном фиде, отсортированные по дате.Сортировка новостей по дате из нескольких профилей

На данный момент это проходит через каждый профиль, перечисляет новости из этого профиля, затем переходит к следующему профилю, перечисляет их новости и так далее. Он не смешивает все это.

Как объединить все новости из каждого профиля и заказать его по дате?

<?php global $post; 
$args = array('numberposts' => -1); 
$myposts = get_posts($args); 
foreach($myposts as $post) : setup_postdata($post); ?> 
    <?php while(the_repeater_field('news')): ?> 
     <div class="social-news-item"> 
     <p class="social-news"><?php the_sub_field('news_description'); ?></p> 
    <p class="social-company"><?php echo the_title(); ?></p> 
     </div> 
    <?php endwhile; ?> 
<? endforeach; wp_reset_postdata(); ?> 

поле дата:

<?php the_sub_field('date'); ?>

+0

Я не знаю, WordPress и, возможно, это глупый вопрос, но это возможно, чтобы получить все сообщения первого в один массив, а затем отсортировать их? – Voitcus

+0

@Voitcus Цикл в вопросе получает все сообщения, просто не уверен, как вставлять в массив и сортировать по дате? – Rob

+0

Я наберу его в ответ, потому что у меня здесь нет места, но не считайте его ответом. – Voitcus

ответ

2

Как я уже писал в комментариях, я не знаю, WordPress и, возможно, что-то не так, но идея может быть в порядке.

Если возможно, вы можете сначала собрать все сообщения, а затем отсортировать их.

Чтобы сгруппировать их, используйте временный массив, в котором вы извлекаете объекты. Поэтому не выводите div s, а «буферируйте» их в массив.

Например, если имя массива будет $posts вы можете сделать в вашем foreach цикле: (я надеюсь, что в соответствии с the_sub_field('news_description'); вы пропустили echo, в этом случае он не будет работать)

$var = &$posts[]; // this creates a new item in array, and $var is this element 
$var->description = the_sub_field('news_description'); // ***** 
$var->title = the_title(); 
$var->date = ... // it is important, I don't know if you have it 

Итак, в конце ваш массив будет иметь все сообщения от всех пользователей (или профилей). Теперь соберите его, например, с помощью usort function. Вам нужно будет написать собственную функцию сортировки, в руководстве он является «ЧМК», поэтому я использую такое же имя:

function cmp($a, $b){ 
    if($a->date > $b->date) 
    return 1; 
    elseif($a->date < $b->date) 
    return -1; 
    else 
    return 0; 
} 

и называют его

usort($posts, 'cmp'); 

Затем вам нужно вывести массив в другой foreach петля.

Но, как я уже сказал, я не знаю, разрешает ли Wordpress это.

3

Если вы хотите изменить порядок программно, взгляните на различных array sorting functions in PHP, особенно

  • uasort() - сортирует массив с определенным пользователем функцией сравнения и поддерживать индекс ассоциация
  • uksort() - Сортировка массив по ключам с использованием пользовательской функции сравнения
  • usort() - Сортировка массива по значениям с использованием пользовательской функции сравнения

но для WordPress проверки этого http://codex.wordpress.org/Template_Tags/get_posts

Пример в данной ссылке:

По умолчанию:

<?php 
    $args = array(
    'posts_per_page' => 5, 
    'numberposts'  => 5, 
    'offset'   => 0, 
    'category'  => '', 
    'orderby'   => 'post_date', 
    'order'   => 'DESC', 
    'include'   => '', 
    'exclude'   => '', 
    'meta_key'  => '', 
    'meta_value'  => '', 
    'post_type'  => 'post', 
    'post_mime_type' => '', 
    'post_parent'  => '', 
    'post_status'  => 'publish', 
    'suppress_filters' => true); 
?> 

Использование:

<?php $posts_array = get_posts($args); ?> 

может вам это помочь.

+0

Новость - это не сообщение (так что не может идти по дате публикации), сообщение - это профиль, в котором есть настраиваемое поле, называемое новостями. – Rob

1

Я предполагаю, что вы имеете в виду «авторы», когда ссылаетесь на «Профили».

После того как вы все сообщения в $ myposts

$myposts = get_posts($args); 

вы перебрать их все с

foreach($myposts as $key => $post) 

(обратите внимание, я добавил $ ключ)

Теперь вы можете создать вы владеете массивом с датой в качестве ключа

$my_array[$myposts[$key]->post_date][] = ...whatevever you want in the end 

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

$the_item[$myposts[$key]->post_author] = $myposts[$key]->post_title; 
$my_array[$myposts[$key]->post_date][] = $the_item; 

Это приведет массив, который выглядит следующим образом:

[2007-11-19 22:46:37] => Array 
    (
     [0] => Array 
      (
       [3] => Title 
       [2] => Another title 
      ) 

    ) 

[2007-11-11 11:11:11] => Array 
    (
     [0] => Array 
      (
       [3] => Yet another title 
       [2] => Foo 
      ) 

     [1] => Array 
      (
       [3] => Bar 
       [2] => Yuck 
      ) 

Все сообщения упорядочиваются по дате с сообщениями разных авторов ". Не стесняйтесь использовать любую из функций сортировки (как указано выше). Возможно, вы захотите добавить небольшую случайность с помощью shuffle() ... Чтобы отобразить сообщения, вы должны пойти обратным образом: перейдите через созданный массив и распечатайте данные, которые вы включили (например, автор, название, контент и т. Д.). .). Для справки, это то, что пост выглядит объект:

myposts:Array 
(
    [0] => stdClass Object 
     (
      [ID] => 1455 
      [post_author] => 3 
      [post_date] => 2013-03-27 22:16:33 
      [post_date_gmt] => 2013-03-27 22:16:33 
      [post_content] => Content 
      [post_title] => Title 
      [post_excerpt] => 
      [post_status] => publish 
      [comment_status] => closed 
      [ping_status] => closed 
      [post_password] => 
      [post_name] => title 
      [to_ping] => 
      [pinged] => 
      [post_modified] => 2013-03-27 22:16:42 
      [post_modified_gmt] => 2013-03-27 22:16:42 
      [post_content_filtered] => 
      [post_parent] => 0 
      [guid] => http://www.abc.com/wordpress/?p=1455 
      [menu_order] => 0 
      [post_type] => post 
      [post_mime_type] => 
      [comment_count] => 0 
      [member_access_visibility] => default 
      [filter] => raw 
     ) 

Надеется, что это поможет вам решить вашу проблему!

Приветствия

JD

+0

Еще лучший способ - использовать метку времени в виде массива с помощью функции Strtotime(). За ним следует простой массив ksort ($ array), чтобы упорядочить их на основе ключа (= даты). –

+0

@JohnDoeherty. Новости - это настраиваемая область сообщения. Сообщение является полным профилем компании, поэтому переход к дате бессмыслен. – Rob

+0

Я не понимаю: в вашем вопросе вы просите о порядке по дате, чтобы как можно похудеть? Ваше настраиваемое поле будет связано с сообщением, поэтому дата публикации будет по-прежнему актуальна для вашего настраиваемого поля. Если вы сохраняете какую-либо другую дату в настраиваемом поле, этот метод все равно будет применяться. –

0

Вам нужно только позвонить функцию один get_posts().

Создайте строку всех идентификаторов пользователя, которые вы хотите разделить по строкам.

Теперь вы можете добавить, что в ваши аргументы вместе с заказом:

$args = array(
    'numberposts' => -1, 
    'author' => '1,2,3,4,5', 
    'orderby' => 'date' // date is the default anyway, so shouldn't matter 
); 

Тогда ваш get_posts() вызова будет включать все сообщения от этих авторов.

НТН

+0

Я не могу сортировать по дате, потому что почта - это полный профиль компании, новость - это настраиваемая область внутри этого сообщения. Поэтому ему нужно вытащить все новости, а затем отсортировать их по дате, связанной с этой новостной строкой. Я использую www.advancedcustomfields.com с полем ретранслятора для новостей. – Rob

Смежные вопросы