Niestandardowe typy postów, taksonomie i łącza bezpośrednie

62

To doprowadza mnie do szału i jestem pewien, że to proste, ale nic, czego szukam, nie ma prostej struktury (wszystko jest bardzo złożone).

Mam niestandardowy typ posta product_listingi niestandardową taksonomię product_cat(która jest hierarchiczna i powinna mieć podobne kategorie).

Chcę po prostu, aby moje adresy URL wyglądały tak:

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

Ale na całe moje życie, bez względu na to, co robię, dostaję przerażający problem 404. Strony działają dobrze, a posty działają dobrze, ale moje niestandardowe posty nie działają poprawnie. Wyświetlają się jako:

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

Co faktycznie działa ! Po prostu chcę zobaczyć tam swoją niestandardową systematykę i chcę mieć dostęp do taxonomy.phpszablonu, który skonfigurowałem, przechodząc do:

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

Żadne z moich ślimaków nie są takie same i nie chcę, żeby były. Oto typ wpisu i część taksonomiczna mojego functions.phppliku:

///// 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' ),
    ) );
}

Mam też inną niestandardową taksonomię scents, którą idealnie chciałbym mieć jakiś przyjazny adres URL, ale jestem bardziej otwarty na ten temat. Chciałbym uzyskać dostęp do listy wszystkich zapachów, mysite.com/products/scentsale nie muszą one być specyficzne dla kategorii.

Czy ktoś może mi pomóc?

RodeoRamsey
źródło

Odpowiedzi:

63

Zmień slugargumenty typu post na products/%product_cat%i slugargumenty taksonomiczne na just products, a następnie opróżnij reguły przepisywania. WordPress powinien teraz obsłużyć /products/my-product-cat/post-name/!

Teraz wreszcie musimy trochę pomóc WordPressowi w generowaniu permalinków (po wyjęciu z pudełka nie rozpoznaje tagu permastruct %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 );

Należy zauważyć, że po prostu pobierze pierwszą kategorię produktu dla postu uporządkowanego według nazwy . Jeśli przypisujesz wiele kategorii do jednego produktu, mogę łatwo zmienić sposób, w jaki określa, która z nich ma być używana w permalink.

Daj mi znać, jak sobie z tym radzisz, a my możemy rozwiązać inne problemy!

TheDeadMedic
źródło
Och WOW, jestem pod wrażeniem! DZIAŁAŁO! Wreszcie! Nigdy nie myślałem, że cokolwiek by to zrobiło !!! dziękuję SOOOOOO bardzo !!! ............ W jaki sposób wygenerowałbym link (coś w rodzaju the_permalink), aby samodzielnie pobrać adres taksonomii? / products / my-product-cat /
RodeoRamsey
Myślę, że udało mi się to wypracować ^^^ ............ ale teraz utknąłem na Pagination. Wygląda na zepsuty podczas korzystania z dowolnej paginacji (funkcja niestandardowa lub wbudowana) jako / products / my-product-cat / wygląda dobrze, ale / products / my-product-cat / page / 2 / zwraca 404 i upuszcza plik taxonomy.php w za korzyść pliku index.php. Próbowałem wszystkiego, co mogłem znaleźć i wciąż nic.
RodeoRamsey,
1
Czy zastanawiasz się nad zmianą przepisywania jednego produktu na product/cat-name/product-name? (zwróć uwagę na osobliwość) Problem polega na tym, że reguła przepisywania nie jest uruchamiana, ponieważ podział na taksonomię nie jest uruchamiany, ponieważ zostaje złapany przez wcześniejszą regułę dla pojedynczych produktów!
TheDeadMedic,
Jestem na to otwarty. Ale żeby to wszystko owinąć wokół głowy, czy oznaczałoby to, że produkty będą miały inną ścieżkę URL, jeśli oglądasz stronę pojedynczego produktu niż stronę „kategorii”? Więc singiel byłby nazwą produktu / cat-name / prod-name, ale koty byłyby produktami / cat-name / ? Czy to nie pokona celu „przyjaznych ludziom” adresów URL? Trudno mi pomóc moim klientom nauczyć się pulpitu nawigacyjnego wp, nie mówiąc już o tej różnicy ... Jeśli nie rozumiem, proszę daj mi znać! Mógłbym również być zadowolony z ŻADNEGO katalogu głównego, takiego jak product-cat / product-nam i po prostu product-cat / . Czy to może zadziałać?
RodeoRamsey
2
Masz - choć powiedziałbym, że jest „przyjazny dla człowieka”, ponieważ istnieje wyraźne rozróżnienie między archiwami ( products/) a pojedynczymi elementami ( product/). I nie, trzymałbym „katalog główny” - pomaga to zachować wyraźne rozróżnienie od postów i stron, a w przeciwnym razie możesz skończyć z problemami z wydajnością (tj. Szczegółowe reguły przepisywania).
TheDeadMedic,
6

Dzięki @TheDeadMechanic, twoja odpowiedź pomogła mi, ale tylko częściowo. Chciałem zrobić to samo, o co prosił @ RodeoRamsey, ale z zagnieżdżonymi kategoriami (tj .:), mysite.com/products/category1/child-category-1/grandchild-category-1/product-namea twoje rozwiązanie nie zadziałało.

W końcu wymyśliłem rozszerzone rozwiązanie mojego pytania, które działa, więc jeśli ktokolwiek potrzebuje zagnieżdżonych kategorii / podkategorii, możesz zobaczyć szczegółowe rozwiązanie na moje pytanie. Mam nadzieję, że pomaga innym i dziękuję za pierwsze kroki.

Jeff
źródło
4

Nie jestem pewien, czy wp obsługuje tę strukturę od razu po wyjęciu z pudełka - ale możesz bardzo łatwo stworzyć własne reguły przepisywania.

Sprawdź poprzednią odpowiedź tutaj . Przepisz adres URL autora .

Możesz zmienić linię

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

do czegoś takiego

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

część product_cat tutaj może być zbędna - nie jestem pewien, czy jest potrzebna.

Możesz dodać dowolne reguły, które będą miały wyższy priorytet niż te wbudowane.

Chris
źródło
Cóż, to nie jest interesujące. Och chłopcze, myślę, że niestandardowe reguły przepisywania są poza mną. Wypróbowałem powyższy kod (i resztę z drugiego postu) i nic się nie zmieniło. Wyczyściłem wszystko, a następnie spróbowałem jeszcze raz i nadal nie wprowadziłem żadnych zmian, więc skomentowałem wszystkie reguły przepisywania ustawione w niestandardowych typach postów i taksonomiach oraz opróżniłem i NIGDY nic.
RodeoRamsey
2

Tak, doprowadzało mnie to do szału, zanim ustawiłem bezpośredni link do niestandardowego typu postu. Znalazłem wtyczkę do obsługi niestandardowego typu postu. Jest bardzo łatwy w użyciu. http://wordpress.org/extend/plugins/custom-post-permalinks/ WP powinien dodać to jako podstawową funkcję! Lew


źródło
Widziałem to już wcześniej i powstrzymałem się od korzystania z niej, ponieważ zawierało ono „taksonomie niehierarchiczne”. Miałem taki, który był ustawiony na hierarchiczny, więc nie sądziłem, że to zadziała, ale jak dotąd wydaje się, że to zadziałało! Dodatkowo wydaje się, że działa to na rzecz struktury / products / cat-name / prod-name / structure, którą próbowałem osiągnąć (patrz komentarz do innej odpowiedzi). @TheDeadMedic, czy jest to realna opcja? Czy powinienem trzymać się przepisywania w pliku functions.php?
RodeoRamsey
0

W rzeczywistości jest to dość łatwe. Potrzebujesz tylko jednej linii. Oto mój kod

funkcja create_product_taxonomies ()
{
// Dodaj nową systematykę, zhierarchizuj ją (jak kategorie)
    $ labels = tablica (
        „name” => _x („Kategorie”, „ogólna nazwa systematyki”),
        „nazwa pojedyncza” => _x („Kategoria”, „nazwa pojedyncza taksonomii”),
        „search_items” => __ („Kategorie wyszukiwania”),
        „all_items” => __ („Wszystkie kategorie”),
        „parent_item” => __ („Kategorie rodziców”),
        „parent_item_colon” ​​=> __ („Kategorie rodziców:”),
        „edit_item” => __ („Edytuj kategorię”),
        „update_item” => __ („Aktualizuj kategorię”),
        „add_new_item” => __ („Dodaj nową kategorię”),
        „new_item_name” => __ („Nowa nazwa kategorii”),
        „menu_name” => __ („Kategoria”),
    );

    register_taxonomy ('product_cat', array ('product_listing'), array (
        „hierarchical” => true,
        „etykiety” => $ etykiety,
        „show_ui” => true,
        „query_var” => true,
        'rewrite' => array ('hierarchical' => true),
    ));

I zastosowałem się do wygenerowanej taksonomii dla moich recenzji CPT z GenerateWP.com. Używam tego na własnej stronie WordPress, https://www.wpstarters.com

funkcja reviews_category_taxonomy () {

    $ labels = tablica (
        „nazwa” => _x („Kategorie recenzji”, „Ogólna nazwa taksonomii”, „kategoria recenzji”),
        „singular_name” => _x („Kategoria recenzji”, „Nazwa szczególna taksonomii”, „kategoria recenzji”),
        „menu_name” => __ („Kategoria recenzji”, „kategoria recenzji”),
        „all_items” => __ („Wszystkie kategorie recenzji”, „opinia_kategoria”),
        „parent_item” => __ („Parent Review Category”, „reviews_category”),
        „parent_item_colon” ​​=> __ („Kategoria recenzji rodzica:”, „kategoria recenzji”),
        „new_item_name” => __ („Nazwa nowej kategorii recenzji”, „kategoria recenzji”),
        „add_new_item” => __ („Dodaj nową kategorię recenzji”, „opinia_kategoria”),
        „edit_item” => __ („Edytuj kategorię recenzji”, „opinia_kategoria”),
        „update_item” => __ („Aktualizuj kategorię recenzji”, „opinia_kategoria”),
        „view_item” => __ („Wyświetl kategorię recenzji”, „opinia_kategoria”),
        „separ_items_with_commas” => __ („Oddziel przecinki”, „kategoria_ recenzji”),
        „add_or_remove_items” => __ („Dodaj lub usuń elementy”, „opinia_kategoria”),
        „choose_from_most_used” => __ („Wybierz z najczęściej używanych”, „opinia_kategoria”),
        „popular_items” => __ („Popularne kategorie recenzji”, „opinia_kategoria”),
        „search_items” => __ („Search Items”, „reviews_category”),
        „not_found” => __ („Not Found”, „reviews_category”),
        „no_terms” => __ („Brak kategorii recenzji”, „opinia_kategoria”),
        „items_list” => __ („Lista kategorii recenzji”, „opinia_kategoria”),
        „items_list_navigation” => __ („Nawigacja po liście kategorii recenzji”, „opinia_kategoria”),
    );
    $ args = tablica (
        „etykiety” => $ etykiety,
        „hierarchical” => true,
        „public” => true,
        „show_ui” => true,
        „show_admin_column” => true,
        „show_in_nav_menus” => true,
        'show_tagcloud' => false,
        'show_in_rest' => true,
        'rewrite' => array ('hierarchical' => true),
    );
    register_taxonomy ('reviews_category', array ('wps_reviews'), $ args);

}
działanie dodatkowe („init”, „reviews_category_taxonomy”, 0);

Wystarczy, że wstawisz „rewrite” => tablica („hierarchiczna” => prawda),

Leo Koo
źródło