lunes, 28 de octubre de 2019

WordPress - Ordenar por campos custom teniendo en cuenta nulos

Esta es una primera solución

    add_action( 'pre_get_posts', 'orden_portfolio' );
    function orden_portfolio( $query ) {
     
        if( ! is_admin() ) {
     
            $query->set( 'orderby', 'meta_value_num' );
            $query->set( 'order', 'ASC' );
            $query->set( 'meta_query', [
                'relation' => 'OR',
                [
                    'key' => 'ce_orden',
                    'compare' => 'NOT EXISTS' ],
                [
                    'key' => 'ce_orden',
                    'compare' => 'EXISTS',
                ],
            ] );
   
            return $query;
   
        }
     
    }

Sin embargo, esta solución muestra primero los registros con meta_value nulo. Esta otra solución, muestra orden ASC y nulos al final:

    function custom_join($join) {
        global $wpdb;
   
        if( ! is_admin() ) {
            $join .= $wpdb->prepare(
            ' LEFT JOIN ' . $wpdb->postmeta . ' cpm ON cpm.post_id = ' . $wpdb->posts . '.ID AND cpm.meta_key = %s'
            , 'ce_orden' );
        }
   
        return $join;
    }
   
    add_filter('posts_join','custom_join');
   
    function custom_orderby($orderby_statement){
        global $wpdb;
   
        if ( ! is_admin() ) {
            $orderby_statement = "CAST( COALESCE(cpm.meta_value,99999) as SIGNED INTEGER) ASC";
        }
   
        return $orderby_statement;
    }
   
    add_filter('posts_orderby','custom_orderby', 10, 2 );

0 comentarios:

Publicar un comentario