WP_QUERY:按PHP变量排序

时间:2013-03-13 作者:Petr Cibulka

我的问题是:

对于我的文章,我使用自定义的帖子类型“展览”,并发布所有其他新闻。我在一个查询中显示它们[\'post\\u type\'=数组(\'experiments\',\'posts\')]。

这个orderby parameter 对于帖子应该是发布日期,对于展览应该是自定义元值(项目结束日期)。这样,帖子将按以下顺序显示:

展览1(发布日期:2013年1月2日,结束日期:2013年4月4日)

  • 第1篇(发布日期:2013年3月13日)
  • 展览2(发布日期:2012年4月1日,结束日期:2013年3月1日)
  • 第2篇(发布日期:2013年2月28日)
  • 从日期(posts)和结束日期元值(展览)定义PHP变量,然后按其排序

    我想到了一个定义PHP变量(展览的结束日期元值,帖子的发布日期)的想法,并据此对wp\\U查询进行排序。

    我走的方向对不对?如果是,如何将变量合并到wp\\U查询中?我找到了一些相关的文章/问题,但迄今为止没有一篇对我有帮助。

    Orderby筛选器

    Orderby filter听起来也是一种方法:Orderby filter @Wordpress.org forums

    谢谢

    ///

    约翰尼斯的解决方案正是我想要的。下面是我稍微修改过的函数:

    function save_sort_meta( $post_id ) {
    $prev_val = get_post_meta( $post_id, \'sort_date\', true );
    /* set value only if not set yet (i.e. if this is a new post and not an update ) */
    if ( \'exhibitions\' === $_POST[\'post_type\'] ) {
            $my_meta = get_post_meta( $post_id, \'_my_meta\', true );
        $datum_end_hidden = $my_meta[\'datum-end-hidden\'];
        update_post_meta( $post_id, \'sort_date\', $datum_end_hidden);
    } else {
        /* using time() assuming "end_date" is a unix timestamp, adjust if not */
        update_post_meta( $post_id, \'sort_date\', time());
    }
    }
    add_action( \'save_post\', \'save_sort_meta\' );
    
    我的问题是:

    $args = array(
    \'showposts\' => \'22\',
    \'post_type\' => array(\'post\',\'exhibitions\'),
    \'post_status\' => \'publish\',
    \'meta_key\' => \'sort_date\',
    \'order\' => \'DESC\',
    \'orderby\' => \'meta_value_num\'
    );
    
    出于某种原因,“post”帖子会停留在wp\\u查询的末尾(虽然当我回显自定义值“sort\\u date”时,它会正确显示,并且比experiments大,应该保持“bellow”)。

    这是否与我删除查看帖子更新的操作有关?我这样做是因为我也想在更新时更改值。

    编辑:以上代码有效

    好的,我发现问题出在哪里了-这很尴尬。:)“展览”帖子类型的“结束日期”元值由jQuery UI Datepicker提供,它以毫秒为单位保存日期。

    我所需要做的就是将$datum\\u end\\u hidden除以1000。:)

    非常感谢!

    2 个回复
    最合适的回答,由SO网友:Johannes Pille 整理而成

    据我所知,如果不对检索到的帖子进行额外的迭代,就无法按两个不同的参数对查询进行排序。

    既然理想情况下应该避免这种情况,那么让我建议一种不同的方法:

    合并一个附加的元值“sort\\u date”或类似的值怎么样?然后,在保存例程中,将展览的结束日期或发布日期保存为“sort\\u date”。

    正在保存:

    function save_sort_meta( $post_id ) {
        $prev_val = get_post_meta( $post_id, \'sort_date\', true );
        /* set value only if not set yet (i.e. if this is a new post and not an update ) */
        if ( empty($prev_val) ) {
            if ( \'exhibitions\' === $_POST[\'post_type\'] ) {
                update_post_meta( $post_id, \'sort_date\', $_POST[\'end_date\'] );
            } else {
                /* using time() assuming "end_date" is a unix timestamp, adjust if not */
                update_post_meta( $post_id, \'sort_date\', time() );
            }
        }
    }
    add_action( \'save_post\', \'save_sort_meta\' );
    
    查询:

    $args = array(
        \'post_status\' => \'publish\',
        \'post_type\' = array( \'exhibitions\', \'posts\' ),
        \'meta_key\' => \'sort_date\',
        \'order\' => \'DESC\',
        \'orderby\' => \'meta_value_num\'
    );
    $exhibitions_and_posts = new WP_Query( $args );
    
    顺便说一句,我建议给帖子类型起一个单数的名字。

    SO网友:Marc Dingena

    我不确定你是不是想在同一页上显示两种帖子类型,都使用不同的排序顺序。

    如果您在自己的档案中显示展览,例如档案展览。php中,可以将该页面的查询设置为按定义的元值排序。

    $args = array(
        \'post_status\' => \'publish\',
        \'post_type\' => \'exhibition\',
        \'meta_key\' => \'project_end_date\',
        \'orderby\' => \'meta_value\',
        \'order\' => \'DESC\'
    );
    
    $my_own_query = new WP_Query($args);
    
    自然,改变project_end_date 以反映项目结束日期元值的关键字名称。改变orderbymeta_value_num 取决于保存变量的方式。meta_value 可能没问题。

    对于循环,您需要使用:

    <?php if ($my_own_query->have_posts()) : while ($my_own_query->have_posts()) : $my_own_query->the_post(); ?>
    
    现在,加载归档文件(http://example.com/exhibitions/) 将忽略常规WP\\U查询并使用my_own_query 对于循环。

    结束

    相关推荐

    ORDER BY META_KEY其中序列化值

    我会按meta\\u键订购post,但我对meta\\u值有问题,因为它是序列化对象。我会按计数值订购我的帖子。a:2:{s:5:\"count\";d:9750;s:7:\"timeout\";i:1358466733;} 我使用以下代码,但在更新到3.5“订单截止日期”后,在wp版本3.4.2之前,订单是正确的: if (have_posts()) : $args=array( \'meta_key\' => \'tweets_count\',