未找到具有自定义分页 404 的自定义分类和自定义帖子类型

Posted

技术标签:

【中文标题】未找到具有自定义分页 404 的自定义分类和自定义帖子类型【英文标题】:Custom taxonomy and custom post type with custom pagination 404 not found 【发布时间】:2014-10-26 01:33:55 【问题描述】:

当来自 General -> Reading 的帖子小于我的自定义分类 cities(自定义帖子类型 city)上的自定义帖子数时,我的分页会引发 404 错误。根据我在 SO 上看到的情况,通常可以通过使用 pre_get_posts 过滤器来解决此问题,但不知道如何将其应用于我的案例。 我想提一下,在taxonomy-cities.php 中,我收到了自定义帖子类型的自定义分类的类别的帖子。

分类-城市.php

$cat_ID = get_query_var('cities');
$custom_id = get_term_by('slug', $cat_ID, 'cities');
add_filter('posts_orderby', 'edit_posts_orderby');
function edit_posts_orderby($orderby_statement) 
    global $aPostsIDs;
    $orderby_statement = 'FIELD(ID, '.implode(',',$_SESSION['saved_city_ids']).')';
    return $orderby_statement;

$offset     = ($paged - 1) * $num_city_guides_post; 
$args['post_type'] = 'city'; 
$args['posts_per_page'] = $num_city_guides_post; // 5
$args['orderby'] = $orderby; // rand
$args['order'] = $order; // DESC
$args['paged'] = $paged; // 1
$args['tax_query'] = array(
                        array(
                               'taxonomy' => 'cities',
                               'field' => 'id',
                               'terms' =>  array($custom_id->term_id) // 3742
                             )
                    );

$wp_query = new WP_Query($args);
if ( $wp_query->have_posts() ) : 
  while ( $wp_query->have_posts() ) : $wp_query->the_post();
  // some code here
  endwhile; 
else: echo 'No Posts';
endif; 
wp_reset_postdata();

对于archive-city.php,我在functions.php 中使用了这个过滤器,它工作正常,但它没有应用于taxonomy-cities.php,所以我得到404:

function portfolio_posts_per_page_city( $query ) 
        if (array_key_exists('post_type', $query->query_vars)) 
        if ( $query->query_vars['post_type'] == 'city' ) 
        $num_city_guides_post = get_option('num_city_post');
        if( empty( $num_city_guides_post ) )
        $num_city_guides_post = 9;

        $query->query_vars['posts_per_page'] = $num_city_guides_post;
        return $query;
    

if ( !is_admin() ) add_filter( 'pre_get_posts', 'portfolio_posts_per_page_city' );

【问题讨论】:

【参考方案1】:

这是一个老问题,但我最近遇到了同样的问题。下面的Snippet其实就是我的taxonomy-template.php使用标准WP_Query的内容,例如here。

如何正确对自定义帖子类型分类进行分页

查询

首先因为它是一个分类模板,第一行声明 $term 允许我访问术语数组以及分类 ID、名称 url 等。

其次我将术语 id 设置为要在 tax_query 参数中使用的变量。这用于查询我的自定义帖子类型videos,然后获取循环的分类(类别),存储在$term_id

修复

因为我正在循环浏览帖子并限制结果,我们实际上需要搜索我们剩余的帖子,同时排除之前的结果和之后的结果。这意味着很简单:

必须使您的自定义帖子类型可搜索,以便分页工作:

重要

'exclude_from_search' => false,


示例taxonomy-template.php

<?php $term = get_term_by( 'slug', get_query_var( 'term' ), get_query_var( 'taxonomy' ) ); ?>

<?php
$term_id = $term->term_id;
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = array(
  'post_type'       => 'videos',
  'posts_per_page'  => 4,
  'paged'           => $paged,
  'tax_query'       => array(
    array(
      'taxonomy' => $term->taxonomy,
      'field' => 'term_id',
      'terms' => $term_id
    )
  )
);
$the_query = new WP_Query( $args );
?>

<?php if ( $the_query->have_posts() ) : while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
  <!-- Loop -->
<?php endwhile; ?>
<?php if ($the_query->max_num_pages > 1) :  ?>
<?php endif; ?>
<?php else: ?>
  <!-- Nothing Found -->
<?php endif; ?>

【讨论】:

【参考方案2】:

我的自定义帖子分类法分页遇到了同样的问题。较旧的帖子页面带有未找到的 404 页面。此问题与 WP taxonomy slug 有关,因此您必须为您的自定义帖子类型分类重写规则,如下所示:

function generate_taxonomy_rewrite_rules( $wp_rewrite ) 

    $rules = array();

    $post_types = get_post_types( array( 'public' => true, '_builtin' => false ), 'objects' );
    $taxonomies = get_taxonomies( array( 'public' => true, '_builtin' => false ), 'objects' );

    foreach ( $post_types as $post_type ) 
        $post_type_name = $post_type->name;
        $post_type_slug = $post_type->rewrite['slug'];

        foreach ( $taxonomies as $taxonomy ) 
            if ( $taxonomy->object_type[0] == $post_type_name ) 
                $terms = get_categories( array( 'type' => $post_type_name, 'taxonomy' => $taxonomy->name, 'hide_empty' => 0 ) );
                foreach ( $terms as $term ) 
                    $rules[$post_type_slug . '/' . $term->slug . '/?$'] = 'index.php?' . $term->taxonomy . '=' . $term->slug;
                    $rules[$post_type_slug . '/' . $term->slug . '/page/?([0-9]1,)/?$'] = 'index.php?' . $term->taxonomy . '=' . $term->slug . '&paged=' . $wp_rewrite->preg_index( 1 );
                
            
        
    

    $wp_rewrite->rules = $rules + $wp_rewrite->rules;



add_action('generate_rewrite_rules', 'generate_taxonomy_rewrite_rules');

这应该适用于所有自定义帖子类型分类法,如果您想更具体,可以尝试像这样更新这两个变量:

$post_types = get_post_types(array('name' => 'city', 'public' => true, '_builtin' => false), 'objects');

$taxonomies = get_taxonomies(array('name' => 'cities', 'public' => true, '_builtin' => false), 'objects');

最后,只需使用您的默认查询循环而不传递任何参数。页面会根据General -> Reading生成。

【讨论】:

【参考方案3】:

也许你可以在没有过滤器的情况下解决这个问题。 它适用于对我的自定义帖子类型进行分页

$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array( 'post_type' =>'cities', 'posts_per_page' => 0, 'paged' => $paged );
$query = query_posts( $args );
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
//Do wordpress Loop
<?php endwhile; else:  include( get_404_template() ); ?>
<?php endif; wp_reset_postdata(); ?>

【讨论】:

posts_per_page 我需要在后台设置,动态的 如果你设置 posts_per_page = 0(或 -1 我不记得了,对不起),wordpress 看看你在 bakend 的设置。 试过了,不行。我想知道你的意思。我在主题选项中有一个自定义设置。在这种情况下,它应该从 General -> Reading 中获取帖子数。

以上是关于未找到具有自定义分页 404 的自定义分类和自定义帖子类型的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 应用程序的自定义“未找到”

自定义帖子类型和分类法分页 404 错误

Wordpress 自定义帖子类型和自定义分类

wordpress 3.8.1 类别第 2 页错误 404 未找到 / 自定义帖子类型

具有自定义文章类型和自定义分类的WordPress库页面

Spring Security 未路由到自定义登录页面 404 错误