it-swarm.com.de

Wie füge ich mehrere Taxonomien an die URL an?

Mehrere Taxonomien in URL

Wie hängt man mehrere Taxonomien an die URL mit den folgenden Angaben an:

  • Beitragstyp: Produkte
  • Taxonomie: Produkttyp
  • Taxonomie: Produktmarke


Hinzufügen eines neuen Produkts und Auswählen von Typ und Marke für dieses Produkt:

Beim Hinzufügen eines neuenProduktgibt es zwei Taxonomiefelder (Produkttyp und Produktmarke). Nennen wir diesen neuen BeitragTestprodukt 1. Das erste, was wir tun möchten, ist anzukreuzen, mit welcher Art von Produkt ich es zu tun habe, sagen wirHandys. Als nächstes möchte ich ankreuzen, zu welcher Marke das Produkt gehört, sagen wirsamsung.

Jetzt ist "Testprodukt 1" mit dem Typ"Handys"und der Marke" Samsung ".

Das gewünschte Endergebnis ist:

/Produkte
"Alle benutzerdefinierten Beiträge anzeigen

/produkte/handys
"Alle benutzerdefinierten Posts mit Taxonomie-Handys anzeigen

/Produkt/Handy/Samsung/
"Alle benutzerdefinierten Posts anzeigen, bei denen die Taxonomie" Mobiltelefone "lautetUNDsamsung

/produkte/handys/samsung/testprodukt-1
"Produkt anzeigen (einzelner benutzerdefinierter Beitrag)


Die Frage

Wie würde man das möglich machen? Mein erster Gedanke war die Verwendung einer Taxonomie mit"Handys"als übergeordnetem Begriff von"Samsung". Tatsächlich war das Anhängen der Taxonomie und ihrer Bedingungen nicht so schwierig. Aber es führte zu vielen anderen Problemen, von denen einige bekannt und andere weniger wichtig waren. Auf jeden Fall funktioniert es nicht so, da es 404 Probleme gibt und WP bestimmte Dinge nicht zulässt.
WP.org "Taxonomie-Archiv-Vorlage

Dies hat mich dazu gebracht, die Struktur neu zu überdenken, Taxonomien und ihre Bedingungen zu verlassen, und ich dachte: Warum nicht eine 2. Taxonomie erstellen und den Beitragstyp damit verknüpfen und an die URL anhängen?

Gute Frage, aber wie?

8
DRSK

Dies ist sicherlich möglich, indem Sie einige eigene Umschreiberegeln in gewissem Umfang verwenden. Die WP_Rewrite - API stellt Funktionen bereit, mit denen Sie Umschreiberegeln (oder 'Maps') hinzufügen können, um eine Anforderung in eine Abfrage zu konvertieren.

Es gibt Voraussetzungen, um gute Umschreiberegeln zu schreiben, und die wichtigste ist das grundlegende Verständnis für reguläre Ausdrücke. Die WordPress Rewrite-Engine verwendet reguläre Ausdrücke, um Teile einer URL in Abfragen zu übersetzen, mit denen Beiträge abgerufen werden können.

Dies ist ein kurzes und gutes Tutorial für PHP PCRE (Perl-kompatible reguläre Ausdrücke).

Nachdem Sie zwei Taxonomien hinzugefügt haben, nehmen wir an, dass ihre Namen wie folgt lauten:

  • produktart
  • produktmarke

Wir können diese in Abfragen wie folgt verwenden:

get_posts( array(
    'product_type' => 'cell-phones',
    'product_brand' => 'samsung'
) );

Die Abfrage wäre ?product_type=cell-phones&product_brand=samsung. Wenn Sie dies als Abfrage eingeben, wird eine Liste der Samsung-Telefone angezeigt. Um /cell-phones/samsung in diese Abfrage umzuschreiben, muss eine Umschreiberegel hinzugefügt werden.

add_rewrite_rule() wird dies für Sie tun. Hier ist ein Beispiel, wie Ihre Umschreiberegel für den obigen Fall aussehen könnte:

add_rewrite_rule( '^products/([^/]*)/([^/]*)/?',
    'index.php?product_type=$matches[1]&product_brand=$matches[2]',
    'top' );

Sie müssen flush_rewrite_rules() ausführen, sobald Sie die Umschreiberegel hinzugefügt haben, um sie in der Datenbank zu speichern. Dies geschieht nur einmal, es ist nicht erforderlich, dies bei jeder Anforderung zu tun, sobald eine Regel gelöscht wurde. Um es zu entfernen, leeren Sie es einfach ohne die hinzugefügte Umschreiberegel.

Wenn Sie eine Paginierung hinzufügen möchten, können Sie dies folgendermaßen tun:

add_rewrite_rule( '^products/([^/]*)/([^/]*)/(\d*)?',
    'index.php?product_type=$matches[1]&product_brand=$matches[2]&p=$matches[3]',
    'top' );
5
soulseekah

Das Endergebnis

Dies ist, was ich teilweise mit Bits und Stücken aus allen Antworten, die ich habe:

/**
 * Changes the permalink setting <:> post_type_link
 * Functions by looking for %product-type% and %product-brands% in the URL
 * 
  * products_type_link(): returns the converted url after inserting tags
  *
  * products_add_rewrite_rules(): creates the post type, taxonomies and applies the rewrites rules to the url
 *
 *
 * Setting:         [ produkter / %product-type%  / %product-brand% / %postname% ]
 * Is actually:     [ post-type / taxonomy        /  taxonomy       / postname   ]
 *                   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
 * Desired result:  [ products  / cellphones      / Apple           / iphone-4   ]
 */

    // Add the actual filter    
    add_filter('post_type_link', 'products_type_link', 1, 3);

    function products_type_link($url, $post = null, $leavename = false)
    {
        // products only
        if ($post->post_type != 'products') {
            return $url;
        }

        // Post ID
        $post_id = $post->ID;

        /**
         * URL tag <:> %product-type%
         */
            $taxonomy = 'product-type';
            $taxonomy_tag = '%' . $taxonomy . '%';

            // Check if taxonomy exists in the url
            if (strpos($taxonomy_tag, $url) <= 0) {

                // Get the terms
                $terms = wp_get_post_terms($post_id, $taxonomy);

                if (is_array($terms) && sizeof($terms) > 0) {
                    $category = $terms[0];
                }

                // replace taxonomy tag with the term slug » /products/%product-type%/productname
                $url = str_replace($taxonomy_tag, $category->slug, $url);
            }

        /** 
         * URL tag <:> %product-brand%
         */
        $brand = 'product-brand';
        $brand_tag = '%' . $brand . '%';

        // Check if taxonomy exists in the url
        if (strpos($brand_tag, $url) < 0) {
            return $url;
        } else { $brand_terms = wp_get_post_terms($post_id, $brand); }

        if (is_array($brand_terms) && sizeof($brand_terms) > 0) {
            $brand_category = $brand_terms[0];
        }

        // replace brand tag with the term slug and return complete url » /products/%product-type%/%product-brand%/productname
        return str_replace($brand_tag, $brand_category->slug, $url);

    }

    function products_add_rewrite_rules() 
    {
        global $wp_rewrite;
        global $wp_query;

        /**
         * Post Type <:> products
         */

            // Product labels
            $product_labels = array (
                'name'                  => 'Products',
                'singular_name'         => 'product',
                'menu_name'             => 'Products',
                'add_new'               => 'Add product',
                'add_new_item'          => 'Add New product',
                'edit'                  => 'Edit',
                'edit_item'             => 'Edit product',
                'new_item'              => 'New product',
                'view'                  => 'View product',
                'view_item'             => 'View product',
                'search_items'          => 'Search Products',
                'not_found'             => 'No Products Found',
                'not_found_in_trash'    => 'No Products Found in Trash',
                'parent'                => 'Parent product'
            );

            // Register the post type
            register_post_type('products', array(
                'label'                 => 'Products',
                'labels'                => $product_labels,
                'description'           => '',
                'public'                => true,
                'show_ui'               => true,
                'show_in_menu'          => true,
                'capability_type'       => 'post',
                'hierarchical'          => true,
                'rewrite'               => array('slug' => 'products'),
                'query_var'             => true,
                'has_archive'           => true,
                'menu_position'         => 5,
                'supports'              => array(
                                            'title',
                                            'editor',
                                            'excerpt',
                                            'trackbacks',
                                            'revisions',
                                            'thumbnail',
                                            'author'
                                        )
                )
            );

        /**
         * Taxonomy <:> product-type
         */
            register_taxonomy('product-type', 'products', array(
                'hierarchical' => true, 
                'label' => 'Product Types', 
                'show_ui' => true, 
                'query_var' => true, 
                'rewrite' => array('slug' => 'products/types'),
                'singular_label' => 'Product Types') 
            );

        /**
         * Taxonomy <:> product-type
         */
            register_taxonomy('product-brand', 'products', array(
                'hierarchical' => true, 
                'label' => 'Product Brands', 
                'show_ui' => true, 
                'query_var' => true, 
                'rewrite' => array('slug' => 'product/brands'),
                'singular_label' => 'Product Brands') 
            );

            $wp_rewrite->extra_permastructs['products'][0] = "/products/%product-type%/%product-brand%/%products%";

            // flush the rules
            flush_rewrite_rules();
    }

    // rewrite at init
    add_action('init', 'products_add_rewrite_rules');


Einige Gedanken:

Das funktioniert. Obwohl Sie 'Erforderlich' sind, um jedem Beitrag beide Taxonomien zuzuweisen, hat die URL einen nachgestellten '/' "'/products/taxonomy//postname'. Da ich allen meinen Prozessen beide Taxonomien zuweisen werde und einen Typ und eine Marke habe, scheint dieser Code für meine Bedürfnisse zu funktionieren. Wenn jemand Vorschläge oder Verbesserungen hat, kann er gerne antworten!

3
DRSK

Obwohl nicht Ihre genaue gewünschte URL-Struktur, können Sie Folgendes erhalten:

/Produkte
"Alle benutzerdefinierten Beiträge anzeigen

/products/type/cell-phones
"Alle benutzerdefinierten Posts mit Taxonomie-Handys anzeigen

/produkte/typ/handys/marke/samsung
"Alle benutzerdefinierten Posts anzeigen, bei denen die Taxonomie" Mobiltelefone "lautetUNDsamsung

/brand/samsung
"Alle benutzerdefinierten Beiträge anzeigen, bei denen die Taxonomie Samsung ist

/product/test-product-1
"Produkt anzeigen (einzelner benutzerdefinierter Beitrag)

ohne dass benutzerdefinierte Regeln für das erneute Schreiben angegeben werden müssen.

Es ist jedoch erforderlich, dass Sie Ihre Taxonomien und benutzerdefinierten Beitragstypen in einer bestimmten Reihenfolge registrieren. Der Trick besteht darin, eine Taxonomie zu registrieren, bei der der Slug mit dem Slug Ihres Post-Typs beginnt, bevor Sie diesen benutzerdefinierten Post-Typ registrieren. Nehmen Sie zum Beispiel die folgenden Slugs an:

product_type taxonomy slug               = products/type
product custom_post_type slug            = product
product custom_post_type archive slug    = products
product_brand taxonomy slug              = brand

Dann könnten Sie sie in dieser Reihenfolge registrieren:

register_taxonomy( 
    'products_type', 
    'products', 
        array( 
            'label' => 'Product Type', 
            'labels' => $product_type_labels,
            'public' => true, 
            'show_ui' => true, 
            'show_in_nav_menus' => true, 
            'args' => array( 'orderby' => 'term_order' ),
            'rewrite' => array( 'slug' => 'products/type', 'with_front' => false  ),
            'has_archive' => true,
            'query_var' => true, 
        ) 
);

register_post_type('products', array(
    'labels' =>$products_labels,
    'singular_label' => __('Product'),
    'public' => true,
    'show_ui' => true,
    'capability_type' => 'post',
    'hierarchical' => false,
    'rewrite' => array('slug' => 'product', 'with_front' => false ),
    'has_archive' => 'products',
    'supports' => array('title', 'editor', 'thumbnail', 'revisions','comments','excerpt'),
 ));

register_taxonomy( 
    'products_brand', 
    'products', 
        array( 
            'label' => 'Brand', 
            'labels' => $products_brand_labels,
            'public' => true, 
            'show_ui' => true, 
            'show_in_nav_menus' => true, 
            'args' => array( 'orderby' => 'term_order' ),
            'rewrite' => array( 'slug' => 'brand', 'with_front' => false  ),
            'has_archive' => true,
            'query_var' => true, 
        ) 
);

Wenn Sie unbedingt eine URL haben müssen wie:

/produkte/typ/handys/marke/samsung/testprodukt-1
"Produkt anzeigen (einzelner benutzerdefinierter Beitrag)

Dann würden Sie eine Umschreiberegel wie diese benötigen:

    add_rewrite_rule(
        '/products/type/*/brand/*/([^/]+)/?',
        'index.php?pagename='product/$matches[1]',
        'top' );

UPDATEhttps://stackoverflow.com/questions/3861291/multiple-custom-permalink-structures-in-wordpress

Hier erfahren Sie, wie Sie die URL für einen einzelnen Beitrag korrekt neu definieren.

Setzen Sie für den benutzerdefinierten Beitragstyp die Option "Erneut schreiben" auf "Falsch". (Belassen Sie das Archiv wie es ist) und registrieren Sie nach der Registrierung der Taxonomien und Posts auch die folgenden Umschreiberegeln.

  'rewrite' => false

   global $wp_rewrite;
   $product_structure = '/%product_type%/%brand%/%product%';
   $wp_rewrite->add_rewrite_tag("%product%", '([^/]+)', "product=");
   $wp_rewrite->add_permastruct('product', $product_structure, false);

Filtern Sie anschließend post_type_link, um die gewünschte URL-Struktur zu erstellen. Dabei werden nicht festgelegte Taxonomiewerte berücksichtigt. Wenn Sie den Code aus dem verlinkten Beitrag ändern, haben Sie:

function product_permalink($permalink, $post_id, $leavename){
    $post = get_post($post_id);

    if( 'product' != $post->post_type )
         return $permalink;

    $rewritecode = array(
    '%product_type%',
    '%brand%',
    $leavename? '' : '%postname%',
    $leavename? '' : '%pagename%',
    );

    if('' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft'))){

        if (strpos($permalink, '%product_type%') !== FALSE){

            $terms = wp_get_object_terms($post->ID, 'product_type'); 

            if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0]))  
               $product_type = $terms[0]->slug;
            else 
               $product_type = 'unassigned-artist';         
        }

        if (strpos($permalink, '%brand%') !== FALSE){
           $terms = wp_get_object_terms($post->ID, 'brand');  
           if (!is_wp_error($terms) && !empty($terms) && is_object($terms[0])) 
               $brand = $terms[0]->slug;
           else 
               $brand = 'unassigned-brand';         
        }           

        $rewritereplace = array(
           $product_type,
           $brand,
           $post->post_name,
           $post->post_name,
        );

        $permalink = str_replace($rewritecode, $rewritereplace, $permalink);
    }
    return $permalink;
}

add_filter('post_type_link', 'product_permalink', 10, 3);

Jetzt muss ich nur noch herausfinden, wie ich die Marken-Taxonomie-URL ohne das führende Marken-Tag neu schreiben kann, und ich sollte genau zu Ihrer gewünschten URL passen.

1
marfarma

Überprüfen Sie auf diese Weise, es gibt immer noch einige Fehler mit dem Markenarchiv

http://Pastebin.com/t8SxbDJy

add_filter('post_type_link', 'products_type_link', 1, 3);

function products_type_link($url, $post = null, $leavename = false)
{
// products only
    if ($post->post_type != self::CUSTOM_TYPE_NAME) {
        return $url;
    }

    $post_id = $post->ID;

    $taxonomy = 'product_type';
    $taxonomy_tag = '%' . $taxonomy . '%';

    // Check if exists the product type tag
    if (strpos($taxonomy_tag, $url) < 0) {
        // replace taxonomy tag with the term slug: /products/%product_type%/samsumng/productname
        $url = str_replace($taxonomy_tag, '', $url);
    } else {
        // Get the terms
        $terms = wp_get_post_terms($post_id, $taxonomy);

        if (is_array($terms) && sizeof($terms) > 0) {
            $category = $terms[0];
            // replace taxonomy tag with the term slug: /products/%product_type%/samsumng/productname
            $url = str_replace($taxonomy_tag, $category->slug, $url);
        }
        }

    /* 
     * Brand tags 
     */
    $brand = 'product_brand';
    $brand_tag = '%' . $brand . '%';

    // Check if exists the brand tag 
    if (strpos($brand_tag, $url) < 0) {
        return str_replace($brand_tag, '', $url);
    }

    $brand_terms = wp_get_post_terms($post_id, $brand);

    if (is_array($brand_terms) && sizeof($brand_terms) > 0) {
        $brand_category = $brand_terms[0];
    }

    // replace brand tag with the term slug: /products/cell-phone/%product_brand%/productname 
    return str_replace($brand_tag, $brand_category->slug, $url);
}

function products_add_rewrite_rules() 
{
global $wp_rewrite;
global $wp_query;

register_post_type('products', array(
    'label' => 'Products',
    'description' => 'GVS products and services.',
    'public' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'capability_type' => 'post',
    'hierarchical' => true,
    'rewrite' => array('slug' => 'products'),
    'query_var' => true,
    'has_archive' => true,
    'menu_position' => 6,
    'supports' => array(
        'title',
        'editor',
        'excerpt',
        'trackbacks',
        'revisions',
        'thumbnail',
        'author'),
    'labels' => array (
        'name' => 'Products',
        'singular_name' => 'product',
        'menu_name' => 'Products',
        'add_new' => 'Add product',
        'add_new_item' => 'Add New product',
        'edit' => 'Edit',
        'edit_item' => 'Edit product',
        'new_item' => 'New product',
        'view' => 'View product',
        'view_item' => 'View product',
        'search_items' => 'Search Products',
        'not_found' => 'No Products Found',
        'not_found_in_trash' => 'No Products Found in Trash',
        'parent' => 'Parent product'),
    ) 
);

register_taxonomy('product-categories', 'products', array(
    'hierarchical' => true, 
    'label' => 'Product Categories', 
    'show_ui' => true, 
    'query_var' => true, 
    'rewrite' => array('slug' => 'products'),
    'singular_label' => 'Product Category') 
);

$wp_rewrite->extra_permastructs['products'][0] = "/products/%product_type%/%product_brand%/%products%";

    // product archive
    add_rewrite_rule("products/?$", 'index.php?post_type=products', 'top');

    /* 
     * Product brands
     */
    add_rewrite_rule("products/([^/]+)/([^/]+)/?$", 'index.php?post_type=products&product_brand=$matches[2]', 'top');
    add_rewrite_rule("products/([^/]+)/([^/]+)/page/([0-9]{1,})/?$", 'index.php?post_type=products&product_brand=$matches[2]&paged=$matches[3]', 'top');

    /*
     * Product type archive
     */
    add_rewrite_rule("products/([^/]+)/?$", 'index.php?post_type=products&product_type=$matches[1]', 'top');    
    add_rewrite_rule("products/([^/]+)/page/([0-9]{1,})/?$", 'index.php?post_type=products&product_type=$matches[1]&paged=$matches[1]', 'bottom'); // product type pagination

    // single product
    add_rewrite_rule("products/([^/]+)/([^/]+)/([^/]+)/?$", 'index.php?post_type=products&product_type=$matches[1]&product_brand=$matches[2]&products=$matches[3]', 'top');



flush_rewrite_rules();

}

add_action('init', 'products_add_rewrite_rules');
1
Luis Abarca