Mysql
 sql >> Base de données >  >> RDS >> Mysql

filtre wordpress posts_orderby avec tableau personnalisé dans le plugin

Ok, j'ai résolu le problème.

Le problème est que la requête post n'inclut pas la table postmeta, donc je l'ai ajoutée sur le custom_join fonction, comme ceci :

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;
}

J'ai ajouté aussi le posts_groupby filtrer car la nouvelle requête m'a donné des publications en double (beaucoup de publications en double).

Voici le code :

add_filter('posts_groupby','custom_groupby');

function custom_groupby($groupby){
    global $wpdb;

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

    return $groupby;
}

Tout est écrit dans le fichier du plugin, mais vous pouvez aussi écrire dans le function.php fichier de votre thème.

N'oubliez pas d'inclure le if(!is_admin) déclaration si vous voulez voir la requête personnalisée uniquement sur le devant.