Wie bestelle ich per Post Meta Name in wp admin?

9

Ich versuche, per Post-Metanamen zu bestellen, den ich für den Beitrag hinzugefügt habe. Post-Meta ist "_merchant_id" und ich weiß, wie man nach merchan_id sortiert, aber ich weiß nicht, wie man nach Händlernamen sortiert.

Ich sortiere nach Händler-ID wie folgt:

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

Händler ist ein anderer Beitragstyp ("Händler"). Wie kann ich nach Händlernamen sortieren?

UPDATE (verbesserte Erklärung durch Screenshot):

Geben Sie hier die Bildbeschreibung ein

iWizard
quelle
Haben Sie lesen diese ? Es war ähnlich, vielleicht sogar noch schwieriger. :)
Fuxia
@toscho - Versucht. Aber ich bekomme Standardposts, nicht meinen benutzerdefinierten
Posttyp
@toscho - Das funktioniert. Ich kenne die Regeln hier bei stackoverflow nicht, bin mir also nicht sicher, ob ich diese Antwort kopieren kann, damit ich Ihnen "Kopfgeld" verleihen kann? Ich habe dieses Problem gelöst, damit die anderen Benutzer dies in Zukunft möglicherweise hilfreich finden.
iWizard
2
Fügen Sie Ihre spezifische Lösung als Antwort hinzu. Es ist wahrscheinlich nicht genau das gleiche wie die verknüpfte Antwort. Das Kopfgeld geht verloren.
Fuxia

Antworten:

3

Ich gehe davon aus, dass der Händlername ein anderes Metafeld ist und nicht der Titel für diesen Beitragstyp. Wenn ja, finden Sie hier eine Möglichkeit, Ihren admin edit.php-Bereich zu organisieren

// 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 Kinder
quelle
Kristina, ich habe die Erklärung durch Hinzufügen eines Screenshots aktualisiert. Bitte schauen Sie es sich an.
iWizard
Post-Titel sollten standardmäßig sortierbar sein ... Sie sollten nichts Besonderes tun müssen, damit dies funktioniert. Möchten Sie Ihren cpt / taxonomy-Registrierungscode veröffentlichen?
Kristina Childs
Ich habe keinen Code, da dies in einem Plugin implementiert ist. Ich habe Angebote (Post-Typ), die in postmeta ihre Händler-ID gespeichert haben und dann über diese merhcant-ID eine Verbindung zum Händler (Post-Typ) herstellen. Wie kann ich in wp admin Druckseiten sortieren (DESC / ASC) nach Händlernamen sortieren?
iWizard
1
Die Rückruf- und Funktionsnamen stimmen in den ersten beiden Hooks nicht überein ...
brasofilo
1
Oder gibt es das. Entschuldigung, ich habe von einer meiner vorhandenen WordPress-Sites modifiziert und muss das verpasst haben. Danke @brasofilo. @ CroiOS, versuchen Sie den Code jetzt noch einmal, nachdem ich diesen Tippfehler behoben habe. (mit post_title) statt merchant_type)
Kristina Childs
3

Die Metawerte und -namen können standardmäßig nicht im Administratorbereich verwendet werden.

Sie können die Abfrage jedoch so einstellen, dass sie in der Schleife verwendet wird. Die Abfrage entspricht dem Beispiel in Ihrer Frage. Verwenden Sie zum Hinzufügen der Metawerte das folgende kleine Snippet im 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;
}

Eine andere Alternative besteht darin, die Abfrage einzuhängen und die Abfrage direkt zu ändern.

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
quelle
1
Der Händlername (das Bit, das er sortieren möchte) ist kein Metaschlüssel, sondern der Post-Titel. Es ist seltsam, dass das von ihm verwendete Plugin diese Funktion deaktiviert.
Kristina Childs
0

Ich hoffe, dass meine Lösung für jemanden nützlich sein wird.

 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
quelle