使用两个meta_key循环遍历自定义POST类型

时间:2013-01-03 作者:mathiregister

我有一个名为my_project. 此帖子类型有两个元框:

  • is_featured
  • is_featured_position
因此,基本上在我的帖子类型后端,我可以设置checkbox 对于is_featured 并输入anumber 对于is_featured_position

enter image description here

这允许我在我的网站主页上设置一个“项目”。

我有一个函数get_project_list() 这应该会返回我所有的“特色”项目。

function get_project_list( $order = \'DSC\' ) {
    $args = array(
        \'post_type\' => \'my_project\',
        \'posts_per_page\' => -1,
        \'orderby\' => \'meta_value_num\',
        \'order\' => $order,
        \'meta_key\' => \'is_featured\',
        // \'is_featured_position\' ???
    );

    $loop = new WP_Query( $args );
    while ( $loop->have_posts() ) : $loop->the_post();
        global $post;
        get_template_part( \'inc/project\', \'item\' );
    endwhile;
}
这已经是了works fine 马上我唯一的问题是我如何实现我的“立场”或“命令”我的特色帖子!我只想按第二个meta\\u键进行额外排序is_featured_position 这是一个正常的数字。

所以如果我打电话get_project_list( \'DSC\' ) 我希望所有的特色帖子都能按照里面设置的顺序重新发布is_featured_position. 就像你从普通的wordpress知道的一样Pages 您可以在其中设置列表页面功能的顺序。

如何通过第二个meta\\u键进行筛选?

提前谢谢你。

1 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

您需要使用meta_query 随着meta_(key|value|compare) 使用两个不同的键进行交互并获得所需的顺序。

<?php
$q = new WP_Query(array(
    \'post_type\'      => \'my_project\',
    \'nopaging\'       => true, // same as posts_per_page => 1,
    \'order\'          => $order,
    \'orderby\'        => \'is_featured_position\', // your position key here
    \'meta_key\'       => \'is_featured_position\', // also here, see below
    \'meta_value_num\' => 0, // you may want something different here
    \'meta_compare\'   => \'>\', // you may want something different here
    \'meta_query\'     => array(
        array(
            \'key\'     => \'is_featured\',
            \'copmare\' => \'EXISTS\', // only works in WP 3.5+
        ),
    ),
));
好的,那么当你使用meta_(key|value|compare) 钥匙以及meta_query 有些奇怪的事情发生了。WordPress使用该类WP_Meta_Query 分析和创建元数据查询。我们可以进去看看WP_Meta_Query::parse_query_vars 了解更多信息。

/**
 * Constructs a meta query based on \'meta_*\' query vars
 *
 * @since 3.2.0
 * @access public
 *
 * @param array $qv The query variables
 */
function parse_query_vars( $qv ) {
    $meta_query = array();

    // Simple query needs to be first for orderby=meta_value to work correctly
    foreach ( array( \'key\', \'compare\', \'type\' ) as $key ) {
        if ( !empty( $qv[ "meta_$key" ] ) )
            $meta_query[0][ $key ] = $qv[ "meta_$key" ];
    }

    // WP_Query sets \'meta_value\' = \'\' by default
    if ( isset( $qv[ \'meta_value\' ] ) && \'\' !== $qv[ \'meta_value\' ] )
        $meta_query[0][\'value\'] = $qv[ \'meta_value\' ];

    if ( !empty( $qv[\'meta_query\'] ) && is_array( $qv[\'meta_query\'] ) ) {
        $meta_query = array_merge( $meta_query, $qv[\'meta_query\'] );
    }

    $this->__construct( $meta_query );
}
总体情况:meta_(key|value|compare) 钥匙只是meta_query 大堆

不幸的是,WordPress只检查meta_key 对于有效的orderby,您必须将其以及meta_query 与要使用的其余自定义字段一起使用。在您的情况下,您必须使用“特色订单”字段,以便在orderby 论点

以上内容未经测试,但至少应该让您开始!

结束

相关推荐

Using has_tag() outside loop

我想检查下一篇文章是否有特定的标签。我尝试了以下代码,但不起作用,因为has_tag() 仅在循环中有效。我想在循环之外使用它。<?php if ( has_tag( \'mario\', $post->ID ) ) : ?> my content <?php endif; ?> 下面的代码列出了post中的标记,但我不知道如何使用if() / else() 条件:global $post; foreach ( get_the_tags( $