Eigene Produkt-Sortierung in WooCommerce

Willkommen im Newsbereich der netzGiraffe

Eigene Produkt-Sortierung in WooCommerce

Veröffentlicht von: | | Bereich: Tipps, Tutorials und Snippets
Für ein Kundenprojekt bestand die Anforderung, Produkte in einer Shop-Kategorie nach eigenen Kriterien sortieren zu lassen. Neben der Standard-Sortierung nach Name, Artikelnummer, Preis und Aktualität ist eine Sortierung nach eigenem Nummernkreis gewünscht.

Schritt 1 – Artikel erweitern

Damit im WordPress Backend ein weiteres Datenfeld, ein sogenanntes „custom field“, erscheint, müsst Ihr folgenden PHP Code in die functions.php eures WordPress Templates oder über ein eigenes Plugin einfügen:

/* Action: display input custom_sort in product general tabs */
add_action( 'woocommerce_product_options_general_product_data', 'ng_product_meta_customsort' );
function ng_product_meta_customsort() {
  global $woocommerce, $post;
  // Number Field
  woocommerce_wp_text_input( 
    array( 
      'id'                => '_customsort', 
      'label'             => __( 'Custom sort', 'theme' ), 
      'placeholder'       => '0', 
      'description'       => __( 'Enter your custom sort value here.', 'theme' ),
      'type'              => 'number', 
      'custom_attributes' => array(
          'min' => '0'
        ) 
    )
  );
}
Diese Zeilen Code erzeugen dank der hervorragenden WooCommerce API ein weiteres Datenfeld im Produkt. Das Ganze sieht dann so aus: wocommerce_custom_field_custom_sort_input

Ersetzt dabei einfach den Bezeichner „theme“ durch euren aktuellen Theme-Sprachkatalog („Textdomain“). Falls keine Mehrsprachigkeit verwendet wird, können auch deutsche Bezeichnungen verwendet werden.

Damit euer Datenfeld auch gespeichert wird, müssen wir der WooCommerce-API noch mittteilen, dass unser Datenfeld auch gespeichert werden soll.
Dazu kann man folgendes Script verwenden:

// Action: save product field
add_action( 'woocommerce_process_product_meta', 'ng_product_meta_customsort_save' );
function ng_product_meta_customsort_save( $post_id ) {  
    // Check if is autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
            return;

    // Check permission
    if ( ( isset ( $_POST['post_type'] ) ) && ( 'page' == $_POST['post_type'] )  ) {
        if ( ! current_user_can( 'edit_page', $post_id ) ) {
            return;
        }       
    }
    else {
        if ( ! current_user_can( 'edit_post', $post_id ) ) {
            return;
        }
    }
    // Filter input by type INTEGER and save post meta
    $custom_field = filter_input(INPUT_POST, '_customsort', FILTER_VALIDATE_INT);
    if( !empty( $custom_field ) )
      update_post_meta( $post_id, '_customsort', $custom_field );
}

Schritt 2 – Artikel bearbeiten

Nun könnt ihr alle Artikel durch dieses neue Zahlenfeld mit einem eigenen Nummernkreis befüllen. So ist es zum Beispiel möglich mit 1000er Nummernkreise eigene Zahlensegmente zu schaffen, nach denen dann sortiert werden kann.

Zum Beispiel:
Produkt 1: 1001
Produkt 2: 1002
Produkt 3: 1011
Produkt 4: 1012
Produkt 22: 1003
Produkt 23: 1013

Später werden die Produkte dann an Hand dieser Nummernkreise wie folgt sortiert:
Produkt 1
Produkt 2
Produkt 22
Produkt 3
Produkt 4
Produkt 23

Schritt 3 – Kategoriesortierung erweitern

Mit Hilfe folgenden Scripts könnt ihr nun die Standard-Sortierung in WooCommerce durch euer eigenes Datenfeld ersetzen.

Die folgenden Zeilen könnt ihr direkt unter die Code-Beispiele von Schritt 1 kopieren.

// Filter: catalog ordering args
add_filter('woocommerce_get_catalog_ordering_args', 'ng_woocommerce_catalog_orderby');
function ng_woocommerce_catalog_orderby( $args ) {
    $args['meta_key'] = '_customsort';
    $args['orderby'] = 'meta_value';
    $args['order'] = 'asc'; 
    return $args;
}
Nachdem ihr nun eure Nummerierung im WooCommerce eingepflegt habt, ist nun beim Aufruf der einer Shop-Kategorie im Frontend nun der neue Nummernkreis Indikator zur Sortierung der Produkte.