Comment commander par courrier le nom du méta dans wp admin?

9

J'essaie de commander par nom de poste que j'ai ajouté pour le poste. La méta du message est "_merchant_id" et je sais comment trier par merchan_id mais je ne sais pas comment trier par nom de marchand.

Je trie par numéro de marchand comme ceci:

public function column_orderby( $vars ) {
        if ( isset( $vars['orderby'] ) && is_admin() ) {
            switch ( $vars['orderby'] ) {
case 'merchant':
 $vars = array_merge( $vars, array(
     'meta_key' => '_merchant_id',
     'orderby' => 'meta_value_num'
 ) );

break;
...

Le marchand est un autre type de publication ("marchand"). Comment trier par nom de marchand?

MISE À JOUR (explication améliorée par capture d'écran):

entrez la description de l'image ici

iWizard
la source
Tu as lu ça ? C'était similaire, peut-être encore plus difficile. :)
fuxia
@toscho - Testé. Mais je reçois des messages par défaut, pas mon type de message personnalisé "Deals"
iWizard
@toscho - Cela fonctionne. Je ne connais pas les règles ici à stackoverflow, donc je ne sais pas si je peux copier cette réponse pour que je puisse vous attribuer une "prime"? J'ai résolu ce problème afin que les autres utilisateurs à l'avenir puissent trouver cela utile.
iWizard
2
Ajoutez votre solution spécifique comme réponse. Ce n'est probablement pas exactement la même chose que la réponse liée. La prime sera perdue.
fuxia

Réponses:

3

Je suppose que le nom du marchand est un autre champ méta et non le titre de ce type de message? Si c'est le cas, voici un moyen d'organiser votre zone admin edit.php

// Add a column in admin edit.php to display the Merchant post type data you want shown
add_filter('manage_merchant_posts_columns', 'admin_merchant_columns');
function admin_merchant_columns( $posts_columns ) {
    $posts_columns = array(
        'cb' => '<input type="checkbox" />', // the checkbox to select the line item
        'title' => __( 'Name' ), // post title
        'merchant_name' => __( 'Merchant Name' ), // where merchant_name is your meta key for that field
        '_merchant_id' => __( 'Merchant ID' ) // merchant id meta key
    );

    return $posts_columns;
}

// Fill the column with the appropriate items
add_action( 'manage_merchant_posts_custom_column', 'manage_merchant_columns', 10, 2 );
function manage_merchant_columns( $column, $post_id ) {
    global $post;
    switch( $column ) {
        case 'merchant_name' :
            $merchant_name = get_post_meta( $post_id, 'merchant_name'); 
            if ( empty( $merchant_name ) )
                echo ( '' );
            else
                print join( $merchant_name, ', ' );

            break;
        case '_merchant_id' :
            $_merchant_id = get_post_meta( $post_id, '_merchant_id'); 
            if ( empty( $_merchant_id ) )
                echo ( '' );
            else
                print join( $_merchant_id, ', ' );

            break;

        default :
            break;
    }
}

// add ability to sort by merchant name
add_filter( 'manage_edit-merchant_sortable_columns', 'sort_by_merchant_name' );
function sort_by_merchant_name( $columns ) {
    $columns['merchant_name'] = 'merchant_name';
    return $columns;
}

add_action( 'load-edit.php', 'sort_by_merchant_name_load' );
function sort_by_merchant_name_load() {
    add_filter( 'request', 'sort_merchant' ); // where "merchant" is your custom post type slug
}

function sort_merchants( $vars ) {
    if ( isset( $vars['post_type'] ) && 'merchant' == $vars['post_type'] ) { // where "merchant" is your custom post type slug
        if ( isset( $vars['orderby'] ) && 'merchant_name' == $vars['orderby'] ) {
            $vars = array_merge(
                $vars,
                array(
                    'meta_key' => 'merchant_name',
                    'orderby' => 'meta_value'
                )
            );
        }
    }
    return $vars;
}
kristina childs
la source
Kristina, j'ai mis à jour l'explication en ajoutant un screenshoot. Veuillez y jeter un œil.
iWizard
Les titres de publication sont censés être triables par défaut ... vous ne devriez rien faire de spécial pour que cela fonctionne. Envie de publier votre code d'enregistrement cpt / taxonomie?
kristina childs
Je n'ai pas de code car c'est dans un plugin implémenté. J'ai des offres (type de publication) qui ont enregistré dans postmeta leur identifiant de commerçant, puis sur cet identifiant merhcant, je me connecte au commerçant (type de publication). Comment puis-je, dans wp admin deal, imprimer le tri des pages (DESC / ASC) par nom de commerçant?
iWizard
1
Les rappels et les noms de fonctions ne correspondent pas dans les deux premiers crochets ...
brasofilo
1
Ou il y a ça. Désolé, j'ai modifié l'un de mes sites wordpress existants et je dois l'avoir manqué. Merci @brasofilo. @CroiOS, essayez à nouveau le code maintenant que j'ai corrigé cette faute de frappe. (en utilisant post_title) au lieu de merchant_type)
Kristina Childs
3

Les valeurs méta et les noms ne sont pas utilisables dans la zone d'administration par défaut.

Mais vous pouvez activer la requête pour l'utiliser dans la boucle, la requête comme l'exemple de votre question. Pour ajouter les méta-valeurs, utilisez le petit extrait de code suivant dans le plugin.

add_filter( 'query_vars', 'fb_query_vars_admin' );
/**
 * If needed: Allow meta queries in the admin
 */
function fb_query_vars_admin( $query_vars ) {

    // break off, if not in admin area
    if ( ! is_admin() )
        return $query_vars;

    $query_vars[] = 'meta_key'; // my key of custom field
    $query_vars[] = 'meta_value'; // my value of custom field

    return $query_vars;
}

Une autre alternative consiste à accrocher la requête et à la modifier directement.

add_filter( 'parse_query', 'fb_custom_post_sort' );
function fb_custom_post_sort($query) {

    if ( ! is_admin() )
        return $query;

    global $current_screen;
    if ( isset( $current_screen ) && 'post' === $current_screen->post_type ) {
        $query->query_vars['orderby']  = 'meta_value';
        $query->query_vars['meta_key'] = '_merchant_id';
        $query->query_vars['order']    = 'ASC';
    }
}
bueltge
la source
1
Le nom du marchand (le bit qu'il veut trier) n'est pas une méta-clé, c'est le titre du post. Il est étrange que le plugin qu'il utilise désactiverait cette fonction.
kristina childs
0

J'espère que ma solution sera utile à quelqu'un.

 public function column_orderby( $vars ) {


        if ( isset( $vars['orderby'] ) && is_admin() ) {
            switch ( $vars['orderby'] ) {

            ...

            case 'merchant':


                GLOBAL $wpdb, $query;


                $vars = array_merge( 
                    $vars, array(
                    'meta_key' => '_merchant_id',
                    'orderby' => 'meta_value_num'
                    ) 
                );

                add_filter('posts_clauses', 'e_order_by_mechant_name',10,2);


                break;

            ...
        }

        return $vars;
}


function e_order_by_mechant_name( $clauses, $query ) {
    global $wpdb;
    if ( ! $query->is_main_query()
        || ! is_admin()

    ){
        return $clauses;
    }

    //Get sort order
    $order_dir = $query->get('order');
    $order_dir = ('asc' == $order_dir ? 'ASC' : 'DESC');

    //Join user table onto the postmeta table
    $clauses['join'] .= " LEFT JOIN {$wpdb->prefix}posts merchants ON {$wpdb->prefix}postmeta.meta_value = merchants.ID";

    //Replace orderby
    $clauses['orderby']  = " merchants.post_title $order_dir";

    return $clauses;
}
iWizard
la source