Benutzerdefinierte Beitragstypen, Taxonomien und Permalinks

62

Das macht mich verrückt und ich bin sicher, dass es einfach ist, aber nichts, wonach ich suche, hat eine einfache Struktur (alles ist sehr komplex).

Ich habe einen benutzerdefinierten Beitragstyp product_listingund eine benutzerdefinierte Taxonomie von product_cat(die hierarchisch ist und ähnliche Kategorien haben sollte).

Ich möchte einfach, dass meine URLs so aussehen:

mysite.com/products/category1/product-name1 
mysite.com/products/category2/product-name2

Aber für mein ganzes Leben, egal was ich tue, bekomme ich die gefürchtete 404-Ausgabe. Seiten funktionieren in Ordnung und Beiträge funktionieren in Ordnung, aber meine benutzerdefinierten Beiträge funktionieren nicht richtig. Sie erscheinen als:

mysite.com/products/product-name1
mysite.com/products/product-name2

Welches funktioniert eigentlich ! Es ist nur so, dass ich meine benutzerdefinierte Taxonomie dort sehen möchte und ich in der Lage sein möchte, auf die taxonomy.phpVorlage zuzugreifen, die ich eingerichtet habe, indem ich gehe zu:

mysite.com/products/category1/
mysite.com/products/category2/

Weder sind meine Schnecken gleich, noch möchte ich, dass sie gleich sind. Hier ist der Beitragstyp und der Taxonomieteil meiner functions.phpDatei:

///// CUSTOM POST TYPES /////

// register the new post type
register_post_type( 'product_listing', array( 
    'labels'                 => array(
        'name'               => __( 'Products' ),
        'singular_name'      => __( 'Product' ),
        'add_new'            => __( 'Add New' ),
        'add_new_item'       => __( 'Create New Product' ),
        'edit'               => __( 'Edit' ),
        'edit_item'          => __( 'Edit Product' ),
        'new_item'           => __( 'New Product' ),
        'view'               => __( 'View Products' ),
        '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' ),
    ),
    'description'           => __( 'This is where you can create new products on your site.' ),
    'public'                => true,
    'show_ui'               => true,
    'capability_type'       => 'post',
    'publicly_queryable'    => true,
    'exclude_from_search'   => false,
    'menu_position'         => 2,
    'menu_icon'             => get_stylesheet_directory_uri() . '/images/tag_orange.png',
    'hierarchical'          => true,
    '_builtin'              => false, // It's a custom post type, not built in!
    'rewrite'               => array( 'slug' => 'products', 'with_front' => true ),
    'query_var'             => true,
    'supports'              => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions' ),
) );


//hook into the init action and call create_book_taxonomies when it fires
add_action( 'init', 'create_product_taxonomies', 0 );
//add_action('admin_init', 'flush_rewrite_rules');

//create two taxonomies, genres and writers for the post type "book"
function create_product_taxonomies() {
    // Add new taxonomy, make it hierarchical (like categories)
    $labels = array(
        'name'              => _x( 'Categories', 'taxonomy general name' ),
        'singular_name'     => _x( 'Category', 'taxonomy singular name' ),
        'search_items'      =>  __( 'Search Categories' ),
        'all_items'         => __( 'All Categories' ),
        'parent_item'       => __( 'Parent Categories' ),
        'parent_item_colon' => __( 'Parent Categories:' ),
        'edit_item'         => __( 'Edit Category' ), 
        'update_item'       => __( 'Update Category' ),
        'add_new_item'      => __( 'Add New Category' ),
        'new_item_name'     => __( 'New Category Name' ),
        'menu_name'         => __( 'Category' ),
    );  

    register_taxonomy( 'product_cat', array( 'product_listing' ), array(
        'hierarchical'  => true,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => true,
        'rewrite'       => array( 'slug' => '%category%', 'with_front' => true ),
    ) );

    // Add new taxonomy, NOT hierarchical (like tags)
    $labels = array(
        'name'                       => _x( 'Scents', 'taxonomy general name' ),
        'singular_name'              => _x( 'Scent', 'taxonomy singular name' ),
        'search_items'               =>  __( 'Search Scents' ),
        'popular_items'              => __( 'Popular Scents' ),
        'all_items'                  => __( 'All Scents' ),
        'parent_item'                => null,
        'parent_item_colon'          => null,
        'edit_item'                  => __( 'Edit Scent' ), 
        'update_item'                => __( 'Update Scent' ),
        'add_new_item'               => __( 'Add New Scent' ),
        'new_item_name'              => __( 'New Scent Name' ),
        'separate_items_with_commas' => __( 'Separate scents with commas' ),
        'add_or_remove_items'        => __( 'Add or remove scents' ),
        'choose_from_most_used'      => __( 'Choose from the most used scents' ),
        'menu_name'                  => __( 'Scents' ),
    ); 

    register_taxonomy( 'scent', 'product_listing', array(
        'hierarchical'  => false,
        'labels'        => $labels,
        'show_ui'       => true,
        'query_var'     => true,
        //'rewrite'     => array( 'slug' => 'scents' ),
    ) );
}

Ich habe auch eine andere benutzerdefinierte Taxonomie, von scentsder ich im Idealfall eine Art freundliche URL haben möchte, aber ich bin offener dafür. Ich möchte vielleicht auf eine Liste aller Düfte zugreifen, mysite.com/products/scentsaber sie müssen nicht kategoriespezifisch sein.

Kann mir jemand helfen?

RodeoRamsey
quelle

Antworten:

63

Ändern slugSie die Argumente für den Beitragstyp in products/%product_cat%und slugfür die Taxonomie in products, und leeren Sie dann die Umschreiberegeln. WordPress sollte jetzt damit umgehen /products/my-product-cat/post-name/!

Jetzt müssen wir WordPress endlich ein wenig beim Generieren von Permalinks helfen (standardmäßig wird das Permastruct-Tag nicht erkannt %product_cat%):

/**
 * Inject term slug into custom post type permastruct.
 * 
 * @link   http://wordpress.stackexchange.com/a/5313/1685
 * 
 * @param  string  $link
 * @param  WP_Post $post 
 * @return array
 */
function wpse_5308_post_type_link( $link, $post ) {
    if ( $post->post_type === 'product_listing' ) {
        if ( $terms = get_the_terms( $post->ID, 'product_cat' ) )
            $link = str_replace( '%product_cat%', current( $terms )->slug, $link );
    }

    return $link;
}

add_filter( 'post_type_link', 'wpse_5308_post_type_link', 10, 2 );

Zu beachten ist, dass hiermit nur die erste Produktkategorie für den nach Namen geordneten Beitrag abgerufen wird . Wenn Sie einem Produkt mehrere Kategorien zuweisen, kann ich leicht ändern, wie bestimmt wird, welche Kategorie im Permalink verwendet werden soll.

Ich weiß, wie Sie damit umgehen, und wir können die anderen Probleme angehen!

TheDeadMedic
quelle
Oh WOW, ich bin voller Ehrfurcht! Das hat funktioniert! Endlich! Ich hätte nie gedacht, dass etwas würde !!! Vielen Dank SOOOOOO !!! ............ Nun, wie würde ich einen Link erzeugen (so etwas wie the_permalink), um die Taxonomie-URL selbst zu erhalten? / products / my-product-cat /
RodeoRamsey
Ich denke, das hat geklappt ^^^ ............ aber jetzt bin ich bei Pagination geblieben. Scheint zu brechen, wenn eine Paginierung (benutzerdefinierte Funktion oder eingebaute Funktion) als / products / my-product-cat / verwendet wird, aber / products / my-product-cat / page / 2 / eine 404 zurückgibt und die taxonomy.php-Datei einfügt zugunsten der index.php Datei. Ich habe alles versucht, was ich finden konnte und immer noch nichts.
RodeoRamsey
1
Würden Sie in Betracht ziehen, die einzelnen Produktumschreibungen auf zu ändern product/cat-name/product-name? (Beachten Sie die Singularität) Das Problem ist, dass die Umschreiberegel für die Taxonomie-Paginierung nicht ausgelöst wird, da sie von einer früheren Regel für einzelne Produkte erfasst wird!
TheDeadMedic
Ich bin offen dafür. Aber um es in den Kopf zu schließen: Bedeutet das, dass Produkte einen anderen URL-Pfad haben, wenn Sie eine einzelne Produktseite im Vergleich zu einer "Kategorieseite" anzeigen? Also wäre Single Produkt / Katzenname / Produktname, aber Katzen wären Produkte / Katzenname / ? Würde das nicht den Zweck von "human friendly" URLs zunichte machen? Es fällt mir schwer, meinen Kunden dabei zu helfen, das WP-Dashboard zu erlernen, geschweige denn den Unterschied ... Wenn ich Missverständnisse habe, lass es mich wissen! Ich könnte auch mit KEINEM Front-Directory zufrieden sein, wie zum Beispiel product-cat / product-nam und nur product-cat / . Könnte das funktionieren?
RodeoRamsey
2
Sie haben es - obwohl ich sagen würde, es ist "menschlich freundlich", da es eine klare Unterscheidung zwischen Archiven ( products/) und einzelnen Gegenständen ( product/) gibt. Und nein, ich würde das "vordere Verzeichnis" behalten - es hilft, eine klare Unterscheidung von Posts und Seiten zu behalten, und sonst könnten Sie unter Leistungsproblemen leiden (z. B. ausführliche Umschreibungsregeln).
TheDeadMedic
6

Danke @TheDeadMechanic, deine Antwort hat mir geholfen, aber nur teilweise. Ich wollte das Gleiche tun, worum @RodeoRamsey gebeten hatte, aber mit verschachtelten Kategorien (dh:) mysite.com/products/category1/child-category-1/grandchild-category-1/product-nameund Ihre Lösung funktionierte dafür nicht.

Ich habe schließlich eine erweiterte Lösung für meine Frage gefunden, die funktioniert. Wenn also jemand verschachtelte Kategorien / Unterkategorien benötigt, können Sie eine detaillierte Lösung für meine eigene Frage anzeigen. Hoffe es hilft anderen und danke für die ersten Schritte.

Jeff
quelle
4

Ich bin mir nicht sicher, ob wp diese Struktur standardmäßig unterstützt - aber Sie können sehr einfach Ihre eigenen Umschreiberegeln erstellen, um dies zu tun.

Überprüfen Sie eine vorherige Antwort hier aus Autor URL Rewrite .

Sie können die Zeile ändern

$newrules['author/([^/]+)/songs/?$'] = 'index.php?post_type=songs&author=$matches[1]';

zu so etwas wie

$newrules['products/([^/]+)/([^/]+)/?$'] = 'index.php?post_type=product_listing&product_cat=$matches[1]&name=$matches[2]';

Der product_cat-Teil hier ist möglicherweise überflüssig - ich bin nicht sicher, ob er benötigt wird.

Sie können beliebige Regeln hinzufügen, die Vorrang vor den eingebauten haben.

Chris
quelle
Nun, ist das nicht interessant? Oh Mann, ich denke, benutzerdefinierte Umschreiberegeln sind mir ein Rätsel. Ich habe den obigen Code ausprobiert (und den Rest vom anderen Beitrag) und nichts hat sich geändert. Ich habe alles geleert und es dann erneut versucht und immer noch keine Änderung vorgenommen, also habe ich alle in den benutzerdefinierten Beitragstypen und Taxonomien festgelegten Umschreibregeln auskommentiert und geleert und NOCH nichts.
RodeoRamsey
2

Ja, es hat mich verrückt gemacht, bevor ich den Permalink für den benutzerdefinierten Post-Typ gesetzt habe. Ich habe ein Plugin für den benutzerdefinierten Beitragstyp gefunden. Es ist sehr einfach zu bedienen. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP sollte dies als Kernfeature hinzufügen! Löwe


quelle
Ich hatte dieses schon einmal gesehen und es nicht benutzt, weil es "für nicht hierarchische" Taxonomien lautete. Ich hatte eine, die auf hierarchisch eingestellt war, also dachte ich nicht, dass es funktionieren würde, aber bisher scheint es den Trick getan zu haben! Außerdem scheint es zu funktionieren, um die Struktur / products / cat-name / prod-name / zu erreichen, die ich erreichen wollte (siehe Kommentar zu einer anderen Antwort). @TheDeadMedic, ist dies eine praktikable Option? Oder sollte ich mich an die Änderungen in der Datei functions.php halten?
RodeoRamsey
0

Eigentlich ist es ziemlich einfach. Sie brauchen nur eine Zeile. Hier ist mein Code

Funktion create_product_taxonomies ()
{
// Neue Taxonomie hinzufügen, hierarchisch gestalten (wie Kategorien)
    $ labels = array (
        'name' => _x ('Categories', 'taxonomy general name'),
        'singular_name' => _x ('Category', 'taxonomy singular name'),
        'search_items' => __ ('Suchkategorien'),
        'all_items' => __ ('Alle Kategorien'),
        'parent_item' => __ ('Elternkategorien'),
        'parent_item_colon' => __ ('Übergeordnete Kategorien:'),
        'edit_item' => __ ('Kategorie bearbeiten'),
        'update_item' => __ ('Update Category'),
        'add_new_item' => __ ('Neue Kategorie hinzufügen'),
        'new_item_name' => __ ('New Category Name'),
        'menu_name' => __ ('Kategorie'),
    );

    register_taxonomy ('product_cat', array ('product_listing'), array (
        'hierarchisch' => wahr,
        'labels' => $ labels,
        'show_ui' => true,
        'query_var' => true,
        'rewrite' => array ('hierarchisch' => true),
    ));

Und auf die generierte Taxonomie für meine Reviews CPT von GenerateWP.com angewendet. Ich verwende dies auf meiner eigenen WordPress-Site, https://www.wpstarters.com

Funktion reviews_category_taxonomy () {

    $ labels = array (
        'name' => _x ('Reviews Categories', 'Taxonomy General Name', 'reviews_category'),
        'singular_name' => _x ('Reviews Category', 'Taxonomy Singular Name', 'reviews_category'),
        'menu_name' => __ ('Reviews Category', 'reviews_category'),
        'all_items' => __ ('Alle Überprüfungskategorien', 'reviews_category'),
        'parent_item' => __ ('Parent Review Category', 'reviews_category'),
        'parent_item_colon' => __ ('Parent Review Category:', 'reviews_category'),
        'new_item_name' => __ ('New Review Category Name', 'reviews_category'),
        'add_new_item' => __ ('Neue Überprüfungskategorie hinzufügen', 'reviews_category'),
        'edit_item' => __ ('Überprüfungskategorie bearbeiten', 'reviews_category'),
        'update_item' => __ ('Update Review Category', 'reviews_category'),
        'view_item' => __ ('View Review Category', 'reviews_category'),
        'separate_items_with_commas' => __ ('Elemente durch Kommas trennen', 'reviews_category'),
        'add_or_remove_items' => __ ('Elemente hinzufügen oder entfernen', 'reviews_category'),
        'choose_from_most_used' => __ ('Wähle aus den am häufigsten verwendeten', 'reviews_category'),
        'popular_items' => __ ('Beliebte Überprüfungskategorien', 'reviews_category'),
        'search_items' => __ ('Search Items', 'reviews_category'),
        'not_found' => __ ('Not Found', 'reviews_category'),
        'no_terms' => __ ('Keine Überprüfungskategorien', 'reviews_category'),
        'items_list' => __ ('Liste der Überprüfungskategorien', 'reviews_category'),
        'items_list_navigation' => __ ('Review Categories list navigation', 'reviews_category'),
    );
    $ args = array (
        'labels' => $ labels,
        'hierarchisch' => wahr,
        'public' => true,
        'show_ui' => true,
        'show_admin_column' => true,
        'show_in_nav_menus' => true,
        'show_tagcloud' => false,
        'show_in_rest' => true,
        'rewrite' => array ('hierarchisch' => true),
    );
    register_taxonomy ('reviews_category', array ('wps_reviews'), $ args);

}
add_action ('init', 'reviews_category_taxonomy', 0);

Alles, was Sie dazu brauchen, setzen Sie das Array 'rewrite' => ('hierarchical' => true),

Leo Koo
quelle