it-swarm.com.de

Benutzerdefinierte Beitragstypen, Taxonomien und Permalinks

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_listing und 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

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

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

Keine meiner Nacktschnecken ist gleich und ich möchte auch nicht, dass sie gleich sind. Hier ist der Beitragstyp und der Taxonomieteil meiner functions.php-Datei:

///// 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 scents, für die 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, indem ich zu mysite.com/products/scents gehe, aber sie müssen nicht kategoriespezifisch sein.

Kann mir jemand helfen?

61
RodeoRamsey

Ändern Sie slug in Ihren Beitragstypargumenten in products/%product_cat% und slug in Ihren Taxonomieargumenten in nur products, und leeren Sie dann Ihre Umschreiberegeln. WordPress sollte jetzt /products/my-product-cat/post-name/ verarbeiten!

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

/**
 * 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 );

Eine Sache zu beachten, dies wird nur die erste Produktkategorie für den Beitrag sortiert nach Namen greifen. 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!

63
TheDeadMedic

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-name), und Ihre Lösung funktionierte dafür nicht.

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

6
Jeff

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.

Sehen Sie sich hier eine frühere Antwort an Url des Autors umschreiben .

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.

4
Chris

Ja, es hat mich verrückt gemacht, bevor ich den Permalink für den benutzerdefinierten Beitragstyp 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

2
user1975

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 '=> __ ('Kategorien durchsuchen'), 
 'All_items' => __ ('Alle Kategorien'), 
 'Parent_item' => __ ('Übergeordnete Kategorien'), 
 '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' => array ('hierarchical' => true), 
)); 

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

 function reviews_category_taxonomy () {
 
 $ labels = array (
 'name' => _x ('Reviews Categories', 'Taxonomy General Name', 'reviews_category '), 
' singular_name '=> _x (' Überprüfungskategorie ',' Taxonomie-Singularname ',' Überprüfungskategorie '), 
' menu_name '=> __ (' Überprüfungskategorie ',' Überprüfungskategorie ' '), 
' all_items '=> __ (' Alle Überprüfungskategorien ',' Überprüfungskategorie '), 
' parent_item '=> __ (' Übergeordnete Überprüfungskategorie ',' Überprüfungskategorie '), 
 '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_cat egory '), 
' 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' => __ ('Choose from the most used', 'reviews_category'), 
 'popular_items' => __ ('Popular Review Categories', 'reviews_category'), 
 'search_items' => __ ('Search Items', 'reviews_category'), 
 'not_found' => __ ('Not Found', 'reviews_category'), 
 'no_terms' => __ ('Keine Überprüfungskategorien', 'Überprüfungskategorie'), 
 'Artikelliste' => __ ('Überprüfungskategorienliste', 'Überprüfungskategorie'), 
 'Artikel s_list_navigation '=> __ (' Review Categories list navigation ',' reviews_category '), 
); 
 $ args = array (
' labels '=> $ labels, 
 'hierarchisch' => wahr, 
 'öffentlich' => wahr, 
 'show_ui' => wahr, 
 'show_admin_column' => wahr, 
 'show_in_nav_menus' => true, 
 'show_tagcloud' => false, 
 'show_in_rest' => true, 
 'rewrite' => array ('hierarchical' => true ), 
); 
 register_taxonomy ('reviews_category', array ('wps_reviews'), $ args); 
 
} 
 add_action (' init ',' reviews_category_taxonomy ', 0); 

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

0
Leo Koo