按日期从多个配置文件中排序新闻

时间:2013-03-19 11:34:18

标签: php wordpress

我有几个配置文件,允许用户发布我想要在一个长Feed中显示的新闻,按日期顺序排序。

此时循环显示每个配置文件,列出该配置文件中的新闻然后移至下一个配置文件,列出其新闻等。它并没有混合起来。

如何将每个个人资料中的所有新闻混合在一起并按日期订购?

<?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'); ?>

4 个答案:

答案 0 :(得分:3)

如果您想以编程方式更改订单,请查看各种array sorting functions in PHP,尤其是

  • uasort() - 使用用户定义的比较函数对数组进行排序并维护索引关联
  • uksort() - 使用用户定义的比较函数按键对数组进行排序
  • usort() - 使用用户定义的比较函数按值对数组进行排序

但是对于wordpress checkout这个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 ); ?> 

这可能对你有所帮助。

答案 1 :(得分:2)

正如我在评论中所写,我不知道wordpress,也许有些事情是错的,但这个想法可能没问题。

如果可能,您可以先将所有帖子放在一起,然后对它们进行排序。

要对它们进行分组,请使用一个临时数组来获取对象。所以不要输出你的div,而是在数组中“缓冲”它们。

例如,如果数组名称为$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 ,在这种情况下它将无法正常工作)

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

所以最后你的数组将包含所有用户(或个人资料)的所有帖子。现在使用usort function对其进行排序。您需要编写自己的排序功能,在手册中它是“cmp”,所以我使用相同的名称:

usort($posts, 'cmp');

并将其命名为

foreach

然后你需要在另一个{{1}}循环中输出数组。

但是,正如我所说,我不知道wordpress是否允许这样做。

答案 2 :(得分:1)

当你提到'个人档案'时,我假设你的意思是'作者'。

在$ myposts中有所有帖子

$myposts = get_posts( $args );

你用

迭代它们
foreach( $myposts as $key => $post )

(注意我添加了$ key)

现在,您可以使用日期作为键创建自己的数组

$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()添加一点随机性... 为了显示帖子,您将采用相反的方式:迭代创建的数组并打印您包含的数据(例如作者,标题,内容等)。 作为参考,这是post对象的样子:

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

答案 3 :(得分:0)

您只需要一个get_posts()函数调用。

创建一个由字符串分隔的所有用户ID的字符串。

现在您可以将它与您的订单一起添加到您的args中:

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

然后,您的get_posts()来电将包含这些作者的所有帖子。

HTH