Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

filtro wordpress posts_orderby com tabela personalizada no plugin


Pronto, resolvi.

O problema é que a consulta post não inclui a tabela postmeta, então eu a adicionei no custom_join função, assim:
add_filter('posts_join','custom_join');
add_filter('posts_orderby','custom_orderby');

function custom_join($join){
    global $wpdb;
    $customTable = $wpdb->prefix."custom_table";

    if(!is_admin){
        $join .= "LEFT JOIN $wpdb->postmeta p1 ON $wpdb->posts.ID = p1.post_id";
        $join .= "LEFT JOIN $customTable p2 ON p1.meta_value = p2.slug";
    }

    return $join;
}

function custom_orderby($orderby_statement){
    global $wpdb;

    if(!is_admin){
        $orderby_statement = "p2.price DESC, $wpdb->posts.post_date DESC";
    }

    return $orderby_statement;
}

Eu adicionei também o posts_groupby filtro porque a nova consulta me deu posts duplicados (muitos posts duplicados).

Aqui está o código:
add_filter('posts_groupby','custom_groupby');

function custom_groupby($groupby){
    global $wpdb;

    if(!is_admin){
       $groupby = "$wpdb->posts.ID";
    }

    return $groupby;
}

Tudo está escrito no arquivo do plugin, mas você pode escrever também no function.php arquivo do seu tema.

Lembre-se de incluir o if(!is_admin) declaração se quiser ver a consulta personalizada somente na extremidade dianteira.