如果存在值,则按两个连续自定义域对帖子进行排序

时间:2016-03-30 作者:EliChan

基本上在我的网站上,我有一堆歌词,在一个静态页面中,我想按专辑列出它们Link to my website 歌曲的专辑位置,我有两个自定义字段,sd_album_title 和\'sd\\u album\\u track\\n。
加上一些歌曲还没有专辑,因此这两个值都是无效的,我希望将这些值按字母顺序排列在其他值的末尾
我至少尝试过按两个字段对所有内容进行排序的最新内容是:

$key = \'sd_album_title\';
$themeta = get_post_meta($post->ID, $key, TRUE);

add_filter( \'pre_get_posts\', \'my_get_posts\' );
function my_get_posts( $query ) {
    if ($themeta != \'\') {
        $query->set( \'post_type\', \'lyric\' );
        $query->set( \'meta_key\', \'sd_album_title\' );
        $query->set( \'orderby\', \'meta_value\' );
        $query->set( \'order\', \'ASC\' );
        $query->set( \'meta_query\', array(
              array(
                    \'key\' => \'sd_album_title\'
              ),
              array(
                    \'key\' => \'sd_album_track_n\',
                    \'value\' => \'target_value\',
                    \'compare\' => \'>=\',
                    \'type\' => \'numeric\'
              )
        ));
    }
    return $query;
}

$getlist= \'my_get_posts\';
$posts = get_posts( $getlist );
我的意图是在它的末尾放一个else,它按照其他歌曲的标题排列数组,但它不会按原样返回任何内容
像这样的事情是否可以进行一些更正,或者我是否走上了一条完全错误的道路?

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

为什么使用pre_get_posts 使用自己的get_posts() ? 您只需将参数列表直接传递给get_posts().

orderby 可以接受参数数组,并可以按多个值排序。命名元查询数组的索引。这可以是orderby参数中使用的任何内容。e、 g。

\'meta_query\' => array(
        \'album_title_meta\' => array(
            \'key\' => \'sd_album_title\',
            \'compare\' => \'EXISTS\',
        ),
        \'album_track_n_meta\' => array(
            \'key\' => \'sd_album_track_n\',
            \'value\' => \'target_value\',
            \'compare\' => \'>=\',
            \'type\' => \'numeric\'
        )
    ),
然后传入一个数组orderby, 使用这些键构造!

\'orderby\' => array(
        \'album_title_meta\' => \'ASC\',
        \'album_track_n_meta\' => \'DESC\',
    ),
首先,帖子将按专辑标题、ASC、曲目编号、DESC排序。

The complete example:

$my_args = array(
    \'post_type\' => \'lyric\',
    \'meta_query\' => array(
        \'album_title_meta\' => array(
            \'key\' => \'sd_album_title\',
            \'compare\' => \'EXISTS\',
        ),
        \'album_track_n_meta\' => array(
            \'key\' => \'sd_album_track_n\',
            \'value\' => \'target_value\',
            \'compare\' => \'>=\',
            \'type\' => \'numeric\'
        )
    ),
    \'orderby\' => array(
        \'album_title_meta\' => \'ASC\',
        \'album_track_n_meta\' => \'DESC\',
    ),
);
$getlist = get_posts($my_args);
注意:这些语法仅在WordPress之后受支持version 4.2

SO网友:EliChan

感谢Sumit,现在一切都很好
对于其他遇到同样问题的人:我还希望将单曲(没有任何专辑或专辑曲目数据)放在底部(即使现在我想我也会把它们放在顶部),并按标题排序。由于输出也应该不同,因此我没有制作if/else,而是决定放置两个get\\u帖子,如下所示:

<?php 
//LIST ORDERED BY ALBUM 
//SINGLES SECTION - SHOWS SINGLES SORTED BY TITLE (Singles category is the n. 47)
$single_posts = get_posts( array(
    \'post_type\'     => \'lyric\',
    \'category\' => 47,
    \'posts_per_page\'    => -1,
    \'orderby\'=> \'title\',
    \'order\' => \'ASC\' )
    );

if( $single_posts ): ?>

    <ul>

    <?php foreach( $single_posts as $post ): 

        setup_postdata( $post )

        ?>
        <li>
            <a href="<?php the_permalink(); ?>" target="_blank">[Single]&nbsp;
<?php the_title(); ?> (<?php the_field(\'sd_song_time\'); ?>)</a>
        </li>

    <?php endforeach; ?>

    </ul>

    <?php wp_reset_postdata(); ?>

<?php endif; ?>
<?php 
//LIST ORDERED BY ALBUM 
//ALBUM SECTION - SHOWS ALBUMS SORTED BY TRACK N.
$album_posts = array(
    \'post_type\'     => \'lyric\',
    \'category__not_in\' => 47,
    \'posts_per_page\'    => -1,
    \'meta_query\'    => array(
            \'album_title_meta\' => array(
        \'key\' => \'sd_album_title\',
                \'compare\' => \'EXISTS\',
                 ),
            \'album_track_n_meta\' => array(
                \'key\' => \'sd_album_track_n\',
                \'value\' => \'target_value\',
                \'compare\' => \'>=\',
                \'type\' => \'numeric\'
                 )
         ),
    \'orderby\' => array(
        \'album_title_meta\' => \'ASC\',
        \'album_track_n_meta\' => \'ASC\',
    ),
);

$posts = get_posts( $album_posts );

if( $posts ): ?>

    <ul>

    <?php foreach( $posts as $post ): 

        setup_postdata( $post )

        ?>
        <li>
            <a href="<?php the_permalink(); ?>" target="_blank">
<?php the_field(\'sd_album_track_n\'); ?>.&nbsp;<?php the_field(\'sd_album_title\'); ?>:&nbsp;<?php the_title(); ?> (<?php the_field(\'sd_song_time\'); ?>)</a>
        </li>

    <?php endforeach; ?>

    </ul>

    <?php wp_reset_postdata(); ?>

<?php endif; ?>
我知道可能有更好的方法可以做到这一点,但它很有魅力;)

相关推荐

如何在WooCommerce_Account_Orders函数中传递$CURRENT_PAGE?

woocommerce功能woocommerce_account_orders($current_page) 已调用1个参数$current_page. 该函数通过调用woocommerce_account_orders_endpoint 通过以下挂钩-add_action( \'woocommerce_account_orders_endpoint\', \'woocommerce_account_orders\' );然而,在上述挂钩中,$current_page 未在函数中作为参数传递。情况如何$c