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

4

4 回答 4

3

如果您想以编程方式更改顺序,请查看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 ); ?> 

这可以帮助你。

于 2013-03-26T07:32:36.550 回答
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 函数对其进行排序。您将需要编写自己的排序函数,在手册中它是“cmp”,所以我使用相同的名称:

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 是否允许这样做。

于 2013-03-21T13:02:46.727 回答
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
        )

希望这可以帮助您解决问题!

干杯

京东

于 2013-03-27T22:46:52.673 回答
0

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

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

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

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

然后您的get_posts()电话将包括这些作者的所有帖子。

高温高压

于 2013-03-28T10:37:56.793 回答