Ordonare după categorii în WordPress/WooCommerce

Azi mi-a cerut un client o ordonare după atributele produselor din WooCommerce. Pentru că SQL-ul meu scârțâie un pic, am apelat la un articol vechi de 10 ani de la Scribu. Treaba asta funcționează în doi pași:

Adăugarea opțiunilor în dropdown:§

add_filter('woocommerce_catalog_orderby', function ($orderby) {
    $orderby['book_authors'] = __('Authors (A-Z)');
    $orderby['book_authors-desc'] = __('Authors (Z-A)');

    return $orderby;
});

Este important ca fiecare cheie să nu conțină cratime, pentru că se face explode pentru ordonare. (I.e. book-authors nu va funcționa)

Alterarea Interogărilor§

Treaba asta se face în doi pași. În primul rând, adăugăm filtrul:

add_filter('woocommerce_get_catalog_ordering_args', function ($args, $orderby, $order) {
    if ($orderby !== 'book_authors') {
        return $args;
    }

    add_filter('posts_clauses', fn($clauses, $wp_query) => sort_by_terms($clauses, $wp_query, 'pa_book-author'), 10, 2);

    return $args;
}, 10, 3);

Dacă nu ai PHP 7.4 va fi nevoie să ajustezi linia cu add_filter astfel:

add_filter('posts_clauses', function($clauses, $wp_query){
  return sort_by_terms($clauses, $wp_query, 'pa_book-author')
}, 10, 2);

Este important parametrul 'pa_book-author', deoarece ăsta reprezintă atributul din WooCommerce (mereu prefixat cu pa_).

În al doilea rând, alterăm interogarea:

function sort_by_terms($clauses, $wp_query, $taxonomy)
{
    global $wpdb;

    $clauses['join'] .= " LEFT OUTER JOIN {$wpdb->term_relationships} ON {$wpdb->posts}.ID={$wpdb->term_relationships}.object_id ";
    $clauses['join'] .= " LEFT OUTER JOIN {$wpdb->term_taxonomy} USING (term_taxonomy_id) ";
    $clauses['join'] .= " LEFT OUTER JOIN {$wpdb->terms} USING (term_id) ";

    $clauses['where'] .= " AND (taxonomy = '{$taxonomy}' OR taxonomy IS NULL)";
    $clauses['orderby'] = "GROUP_CONCAT({$wpdb->terms}.name ORDER BY name ASC) ";
    $clauses['orderby'] .= ('ASC' === strtoupper($wp_query->get('order'))) ? 'ASC' : 'DESC';

    return $clauses;
}

Problema este căăăăă… sunt automat excluse produsele fără acel atribut. Ăsta poate fi un lucru bun, poate fi un lucru rău, depinde de situație.

Adaugă un comentariurăspuns pentru

Poți adăuga bucăți de cod folosind [code]codul tău aici[/code], [js][/js], [php][/php] etc.

Link-urile în context sunt binevenite. Comentariile fără nume/email valid sunt șterse.
PS: Comentariul NU este editabil.

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.

Site-ul blog.iamntz.com utilizează cookie-uri. Continuarea navigării presupune acceptarea lor. Mai multe informații.

windows apple dropbox facebook twitter