Ordenar vista de arquivo com o gancho pre_get_posts

4

Eu tenho uma função assim:

//sorting archive query by pinned posts
function archive_sort_pinned($query){
    $option = get_option('hsa_story_cats');
    $current_category = get_queried_object();

    if(!is_admin() && $query->is_main_query() && is_category($option)){
        $query->set('meta_query', array(
            'relation' => 'OR',
            array(
                'key'       => 'story_cat_order_'. $current_category->term_id,
                'compare'   => 'EXISTS',
            ),
            array(
                'key'       => 'story_cat_order_'. $current_category->term_id,
                'compare'   => 'NOT EXISTS',
                'value' => ''
            )
        ));
        $query->set('orderby', array( 'meta_value_num' => 'ASC', 'date' => 'DESC' ));
        $query->set('meta_key','story_cat_order_'. $current_category->term_id);
    }
}
add_action('pre_get_posts', 'archive_sort_pinned');

O problema é: Isso retornará apenas as postagens com a chave story_cat_order_<cat_id> , quando eu remover a última linha meta key , então eu obtenho todas as postagens, mas elas não estão ordenadas.

Eu quero encomendá-los por este meta_key , se eles tiverem, ou por data, se eles não tiverem meta_key .

    
por mokiSRB 15.08.2016 / 14:28

1 resposta

0

Eu resolvi isso com uma abordagem diferente. Eu usei os filtros posts_join e posts_orderby .

Não se esqueça de converter o valor meta como não classificado para evitar a ordem das sequências em vez de int.

//edit query join
function hsa_story_join($join){

    global $wpdb;
    $option = get_option('hsa_story_cats');
    if(!is_admin() && is_category($option)) {
        $current_category = get_queried_object();
        $join .= " LEFT JOIN (SELECT post_id, meta_key, meta_value FROM $wpdb->postmeta WHERE meta_key = 'story_cat_order_". $current_category->term_id ."') AS hsam ON $wpdb->posts.ID = hsam.post_id ";
    }
    return $join;
}
add_filter('posts_join', 'hsa_story_join');

//edit query order by
function hsa_story_order($order){

    $option = get_option('hsa_story_cats');
    if(!is_admin() && is_category($option)) {
        $current_category = get_queried_object();
        $order = " IF(hsam.meta_key='story_cat_order_". $current_category->term_id ."', cast(hsam.meta_value as unsigned), 99999) ASC, " . $order;
    }

    return $order;
}
add_filter('posts_orderby', 'hsa_story_order',99,1);
    
por mokiSRB 13.02.2017 / 14:51