尝试不带任何术语进入taxonomy.php页面时为什么会出现404错误Wordpress看不到taxonomy页面

问题描述

我正在尝试创建分类页面,所以我使用分类法taxonomy-Nowe.PHP创建了分类

但是我的WP无法看到页面,或者我将重写URL弄乱了吗?有人可以检查我的代码,看看我是否做错了。我通过保存Plain刷新了永久链接,然后返回到Post name永久链接。但是我没有结果。

我想实现这样的想法:domain.pl/oferta/kopiarki/Nowe

// custom post type
function td_devices_posttype() {
 $labels = array(
     'name'                => _x( 'Kopiarki','Ogólna nazwa wpisów','textdomain' ),'singular_name'       => _x( 'Kopiarka','Pojedyńcza nazwa wpisu','menu_name'           => esc_html__( 'Kopiarki','parent_item_colon'   => esc_html__( 'Rodzic','all_items'           => esc_html__( 'Wszystkie kopiarki','view_item'           => esc_html__( 'Wyświetl kopiarki','add_new_item'        => esc_html__( 'Dodaj Nową kopiarkę','add_new'             => esc_html__( 'Dodaj Nową','edit_item'           => esc_html__( 'Edytuj Kopiarkę','update_item'         => esc_html__( 'Zaktualizuj kopiarkę','search_items'        => esc_html__( 'Szukaj kopiarkę','not_found'           => esc_html__( 'Nie zanleziono','not_found_in_trash'  => esc_html__( 'Nie znaleziono w koszu','textdomain' )
 );
 $args = array(
     'label'               => esc_html__( 'kopiarki','description'         => esc_html__( 'Wszystkie kopiarki','labels'              => $labels,'taxonomies'          => array( 'Nowe' ),'hierarchical'        => true,'public'              => true,'show_ui'             => true,'show_in_menu'        => true,'show_in_nav_menus'   => true,'show_in_admin_bar'   => true,'menu_position'       => 100,'can_export'          => true,'has_archive'         => true,'exclude_from_search' => false,'publicly_queryable'  => true,'query_var'           => true,'show_admin_column'   => true,'capability_type'     => 'page','rewrite'             => array('slug' => 'oferta/kopiarki'),'supports'            => array( 'title','editor','thumbnail','custom-fields')
 );
 register_post_type( 'kopiarki',$args );
  //flush_rewrite_rules();
}
add_action( 'init','td_devices_posttype' );

// custom taxonomies new
function new_posttype_taxonomy() {
    $labels = array(
        'name'                  => 'Nowe','singular_name'         => 'Nowa','search_items'          => 'Szukaj Nowych','all_items'             => 'Wszystkie Nowe kopiarki','parent_item'           => 'Rodzic','parent_item_colon'     => 'Dwukropek elementu nadrzędnego:','edit_item'             => 'Edytuj Nową kopiarkę','update_item'           => 'Zaktualizuj Nową kopiarkę','add_new_item'          => 'Dodaj Nową kopiarkę','new_item_name'         => 'Nowa nazwa kopiarki','menu_name'             => 'Nowe'
    );

    $args = array (
        'hierarchical'          => true,'labels'                => $labels,'show_ui'               => true,'show_admin_column'     => true,'show_in_rest'          => true,'query_var'             => true,'rewrite'               => array(
      'slug'                    => 'Nowe','with_front'              => false,)
    );
    register_taxonomy( 'Nowe',array( 'kopiarki' ),$args );

解决方法

此帖子已被多次编辑,因为当时我没有有关此问题的所有信息。从那以后,我对该主题进行了广泛的研究。以下内容直达重点和答案。


我们在这里有两个目标,使永久链接结构如下
domain.com/_custom_post_type_/_taxonomy_/_term_/ ...

并获得taxonomy.php来返回与自定义帖子类型的特定分类法部分a相关的帖子和​​术语的索引,而不是返回404.php页面。


”当访问者单击指向类别,标签或自定义的超链接时 分类法,WordPress按时间倒序显示帖子页面 该分类法过滤的订单。”

来源:@ https://developer.wordpress.org/themes/template-files-section/taxonomy-templates/

用于分类法的默认模板为taxonomy.php。这些文件使您可以定位特定的分类法或特定的分类法术语。例如:taxonomy-{taxonomy}-{term}.phptaxonomy-{taxonomy}.php

对于您的情况,当您搜索./fruits/apples时,您会在applestaxonomy.php上或最后在{{1 }}。 但是,如果您想访问taxonomy-fruits.php,该怎么办? 为什么访问水果会返回taxonomy-fruits-aples.php错误?好吧,因为./fruits/的目的是显示针对术语的帖子,而不是针对分类法的帖子。 这是正常行为和预期行为

这可以追溯到10年前的https://core.trac.wordpress.org/ticket/13816,并引发了多个问题。 (有趣的阅读,应该看看)。

当您搜索404.php时,我们会得到一个taxonomy.php,但是如果用户搜索./fruits/apples/,则"true"会得到一个./fruits/并牢记这一逻辑或"false",他应该被重定向到包含所有相关./fruits/帖子或术语的模板,由于这不是默认行为,我提出了一个个案解决方案:

./fruits

对于fruits,值应与分类标准子句中等于WITH破折号的字符数匹配。 <?php add_action( 'template_redirect','fallback_custom_taxonomy_fruits' ); function fallback_custom_taxonomy_fruits() { $url = $_SERVER[ 'REQUEST_URI' ]; if ( ! is_tax( 'fruits' ) && substr( $url,-7 ) == '/fruits' || substr( $url,-8 ) == '/fruits/' ) { include( get_template_directory() . '/fruits.php' ); exit(); }; }; ?>

这可能不是最好的方法,但它可以完成工作,而且速度很快。我没有看到其他有效的解决方案(2020年9月)。

substr是您的后备模板的情况下,以防用户搜索substr( $url,-7 ) == '/fruits'fruits.php。我们将网址的末尾与我们的自定义分类标准段匹配。仅当./fruits/为假./fruits并且网址与我们的分类法匹配时,这种情况才会发生。

现在让我们说,我们的自定义分类法与一个称为“食谱”的自定义帖子类型相关联。然后,我们可以使用以下内容在后备is_tax()模板文件上显示自定义帖子类型的帖子和相关术语:

! is_tax( 'fruits' )

此外,您还希望在您的分类法前面的固定链接中具有用于您的自定义分类法的自定义帖子类型(CPT),以获得如下结构: fruit.php,其中食谱是您的自定义帖子类型。使用以下命令注册该分类法的参数时,可以使用重写规则:<?php $custom_post_type = 'recipes'; $taxonomy = 'fruits'; $terms = get_terms( $taxonomy ); foreach ( $terms as $term ) { wp_reset_query(); $args = array( 'post_type' => $custom_post_type,'tax_query' => array( array( 'taxonomy' => $taxonomy,'field' => 'slug','terms' => $term->slug,),); $query = new WP_Query( $args ); if ( $query->have_posts() ) { echo $term->name.'<br/>'; while ( $query->have_posts() ) : $query->the_post(); echo '<a href="'.get_permalink().'">'.the_title().'</a><br>'; endwhile; }; }; ?>

recipes/fruits/apples

我们的永久链接结构现在应如下所示
'rewrite' => array( 'slug' => 'recipes/fruits' ),hierarchical => true,
add_action( 'init','custom_taxonomy_nowe' ); function custom_taxonomy_nowe() { $custom_post_type = 'Recipes'; $singular = 'Fruit'; $plural = 'Fruits'; $labels = array( 'name' => $plural,'singular_name' => $singular,); $args = array( 'labels' => $labels,'hierarchical' => true,'rewrite' => array( 'slug' => strtolower( $custom_post_type.'/'.$plural ),); register_taxonomy( strtolower( $plural ),strtolower( $custom_post_type ),$args ); };

现在可以将分类页面用作帖子和分类索引。