WordPress

Taksonomia niestandardowa z niestandardową wartością meta nie sortuje poprawnie (zapytanie zwraca tę samą wartość dla orderby niezależnie od kliknięcia kolumny sortowania)

  • 10 lutego, 2023
  • 4 min read
Taksonomia niestandardowa z niestandardową wartością meta nie sortuje poprawnie (zapytanie zwraca tę samą wartość dla orderby niezależnie od kliknięcia kolumny sortowania)


Mam kategorię wagową, w której chcę posortować według wagi, tak aby na górze wyświetlała się waga ciężka, a na dole waga musza. Stworzyłem niestandardowe pole meta o nazwie „waga”, w którym przechowuję liczbę int odpowiadającą wadze dla odpowiedniej klasy wagowej.

Oto kod, w którym konfiguruję podatek celny:

register_taxonomy( 'weight-class', 'ratings',
    array(
        'labels' => array(
            'name'          =>  'Weight Class',
            'singular_name' =>  'Weight Class',
            'menu_name'     =>  'Weight Classes',
            'all_items'     =>  'All Weight Classes',
            'add_new'       =>  'Add A Weight Class',
            'add_new_item'  =>  'Add New Weight Class',
            'edit_item'     =>  'Edit Weight Class',
            'view_item'     =>  'View Weight Class',
            'view_items'    =>  'View Weight Classes'
        ),
        'hierarchical' => true,
        'show_admin_column' => true
    )
);

Oto kod, w którym konfiguruję niestandardowe metadane do tworzenia i aktualizowania:

function cb_add_term_fields( $taxonomy ) {
    echo '<div class="form-field">
        <label for="weight">Maximum Weight (LBS)</label>
        <input type="text" name="weight" id="weight" />
        <p>Must be a number. Used for sorting purposes only.</p>
    </div>';
} 
add_action( 'weight-class_add_form_fields', 'cb_add_term_fields' );

function cb_edit_term_fields( $term, $taxonomy ) {
    $value = get_term_meta( $term->term_id, 'weight', true );
    echo '<tr class="form-field">
        <th>
            <label for="weight">Maximum Weight (LBS)</label>
        </th>
        <td>
            <input name="weight" id="weight" type="text" value="'.esc_attr($value).'" />
            <p class="description">Must be a number. Used for sorting purposes only.</p>
        </td>
    </tr>';
}
add_action( 'weight-class_edit_form_fields', 'cb_edit_term_fields', 10, 2 );

function cb_save_term_fields( $term_id ) {
    update_term_meta(
      $term_id,
      'weight',
      sanitize_text_field( $_POST[ 'weight' ] )
    );
  }
  add_action( 'created_weight-class', 'cb_save_term_fields' );
  add_action( 'edited_weight-class', 'cb_save_term_fields' );

Oto kod, w którym ustawiam Weight jako niestandardową kolumnę do sortowania:

add_filter('manage_edit-weight-class_columns', 'add_weight_column' );
function add_weight_column( $columns ){
    $columns['weight'] = __( 'Weight' );
    return $columns;
}

add_filter( 'manage_edit-weight-class_sortable_columns', 'add_weight_column_sortable' );
function add_weight_column_sortable( $sortable ){
    $sortable[ 'weight' ] = 'weight';
    return $sortable;
}

add_filter('manage_weight-class_custom_column', 'add_weight_column_content', 10, 3 );
function add_weight_column_content( $content, $column_name, $term_id ){

    if( $column_name !== 'weight' ){
        return $content;
    }

    $term_id = absint( $term_id );
    $weight = get_term_meta( $term_id, 'weight', true );

    if( !empty( $weight ) ){
        $content .= esc_attr( $weight );
    }

    return $content;
}


add_action( 'pre_get_posts', 'weight_column_orderby' );  
function weight_column_orderby( $query ) {  
    echo "<script>console.log('" . $query->get( 'orderby' ) . "');</script>";
    if( ! is_admin() )  
        return;  

    $orderby = $query->get( 'orderby' );  

    if( 'weight' == $orderby ) {  
        $query->set('meta_key','weight');  
        $query->set('orderby','meta_value_num');
    }  
} 

Wszystko działa świetnie, dopóki nie poszedłem przetestować funkcji sortowania w mojej taksonomii. Mój problem dotyczy obecnie tego fragmentu kodu:

add_action( 'pre_get_posts', 'weight_column_orderby' );  
function weight_column_orderby( $query ) {  
    echo "<script>console.log('" . $query->get( 'orderby' ) . "');</script>";
    if( ! is_admin() )  
        return;  

    $orderby = $query->get( 'orderby' );  

    if( 'weight' == $orderby ) {  
        $query->set('meta_key','weight');  
        $query->set('orderby','meta_value_num');
    }  
} 

Jak widać, używam tagu szybkiego skryptu, aby wydrukować wartość orderby w zapytaniu. Bez względu na to, którą kolumnę kliknę, aby posortować na stronie listy taksonomii, powyższy znacznik skryptu zawsze zwraca „tytuł menu_order”. Klikam na ślimak lub opis i nadal to otrzymuję. Czy jest gdzieś ustawienie, które przegapiłem? Każda pomoc byłaby mile widziana! Dzięki!

Warto przeczytać!  wordpress.org - Wyodrębnianie i zastępowanie treści postów HTML za pomocą PHP


Źródło