wake-up-neo.net

Schreibe Regeln für mehrere (mehr als 2) Taxonomien um

Ich verwende Woocommerce und habe einige 'Produktattribute', die nur Taxonomien sind.

Ich habe folgende Taxonomien:

  • pa_color
  • pa_material
  • pa_style

das pa_ steht für das Produktattribut und ist in WooCommerce integriert. Es verarbeitet diese Taxonomien. Ich kann das also nicht ändern.

WooCommerce enthält auch Produktkategorien (product_cat) und Produkt-Tags (product_tag).

mit der folgenden Abfrage erhalte ich alle Rot, Vinyl-Produkte der Produktkategorie Stoffe

? product_cat = Stoffe & pa_material = Vinyl & pa_color = Rot

Ich möchte daraus einen hübschen Permalink machen, so etwas wie:

produktkategorie/Stoffe/Material/Vinyl/Farbe/rot

Mit dieser Antwort komme ich dem, was ich erreichen möchte, ziemlich nahe:

URL-Umschreiberegeln für die Abfrage mehrerer Taxonomien

ich kann meine URL so einrichten, dass sie 2 Taxonomien (product_cat + 1 Attribut Taxonomie) verarbeitet, aber ich weiß nicht, wie ich 3 (oder mehr) Parameter abrufen soll.

So kann ich bekommen:

/ produkte-kategorie/stoffe/farbe/rot

oder

/ produktkategorie/stoffe/material/vinyl

aber nicht alle 3 zusammen

/ produktkategorie/stoffe/material/vinyl/farbe/rot

edit/obwohl ich denke, dass es ideal wäre, die URL zu haben

/ stoffe/vinyl/rot

ich bin nicht sicher, ob das möglich ist?

ende bearbeiten /

WooCommerce hat auch einige Einstellungen zum Ändern der Permalinks (wie das Voranstellen der URL mit 'shop' oder das Ändern der Produktkategorie slug), so dass ich das irgendwann berücksichtigen muss, aber jetzt muss ich diesen ersten Schritt nach unten machen.

der Einfachheit halber ist dies eine abgespeckte Version meines Codes. Eigentlich beziehe ich die Taxonomien aus integrierten Woocommerce-Funktionen, aber die Frage ist nicht auf Woocommerce beschränkt ... da es sich um eine Site mit vielen Taxonomien handelt.

add_action( 'init', 'wpa_init' );
function wpa_init() {

$taxonomies = array ('pa_color'=>'Color','pa_material'=>'Material','pa_style'=>'Style');
$base = 'product-category';

        foreach ($taxonomies as $taxonomy=>$mask):      
            $attribute = strtolower(sanitize_title($mask));
            add_rewrite_rule( $base.'/(.+?)/'.$attribute.'/([^/]+)(/page/(\d+))?/?$', 'index.php?product_cat=$matches[1]&'.$taxonomy.'=$matches[2]&paged=$matches[4]', 'top' );         
        endforeach;     
}

dies war die beste Ressource, die ich bei Permalinks für Taxonomie-Abfragen gefunden habe: http://thereforei.am/2011/10/28/advanced-taxonomy-queries-with-pretty-urls/

aber es scheint auch bei 2 Taxonomien fest.

4
helgatheviking

Sie könnten so etwas versuchen:

function custom_rewrite( $wp_rewrite ) {

    $feed_rules = array(
        'product-category/(.+)/material/(.+)/color/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2).'&pa_color='. $wp_rewrite->preg_index(3)
        'product-category/(.+)/color/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_color='. $wp_rewrite->preg_index(2)
        'product-category/(.+)/material/(.+)'    =>  'index.php?product_cat='. $wp_rewrite->preg_index(1).'&pa_material='. $wp_rewrite->preg_index(2)
    );

    $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );

Es funktioniert möglicherweise nicht genau so, wie es angekündigt wurde, und Sie müssen möglicherweise einige Regex-Modifikationen vornehmen, aber das ist der allgemeine Kern dessen, was getan werden muss (90% der Arbeit).

Sie müssen die Permalinks leeren, wenn Sie diesen Code hinzufügen/bearbeiten/entfernen, in die Datei functions.php oder in ein benutzerdefiniertes Plugin einfügen. Sie können Permalinks löschen, indem Sie einfach in den Admin-Bereich gehen und die Permalinks erneut speichern

Als Randnotiz können Sie in Konfliktfragen geraten, wenn Sie anfangen, Erben zu verwenden,

z.B. Wenn Sie eine T-Shirt-/Klein- und eine Kleider-/Klein-Kategorie haben und eine URL wie/products-category/small/color/red verwenden, erhalten Sie möglicherweise nicht die erwarteten Ergebnisse, z. kleine T-Shirts? oder meintest du kleine kleider?

Also Vorsicht vor Mehrdeutigkeiten

4
Tom J Nowell

Zum späteren Nachschlagen (wie im nächsten Jahr, wenn ich google und meine eigene Frage wiederfinde) kann dies in add_rewrite_rule()-Syntax konvertiert werden, indem die Schlüssel im $new_rules-Array in den $ regex-Parameter von add_rewrite_rule() mit dem Wert $ rewrite und 'top' konvertiert werden. als die $ -Position.

add_rewrite_rule($regex,$rewrite, $position);

Oder als Beispiel einer meiner Anfragen von oben:

function custom_rewrite() {

   add_rewrite_rule(
    'product-category/(.+?)/material/(.+?)/?$',
    'index.php?product_cat=matches[1]&pa_material=$matches[2]',
    'top'
    );

}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_action( 'init', 'custom_rewrite' );

Aus irgendeinem Grund konnte ich regenerate_rewrite_rules nicht als Hook/Filter verwenden, also habe ich auf init umgestellt.

3
helgatheviking