404错误PageNavi自定义类型分类|WordPress

时间:2014-12-03 作者:user3766356

我有一个自定义的帖子类型,叫做rock 使用名为genero. taxonomy-genero-curiosity.php

mypage/摇滚乐/好奇/

单击后续分页页面链接时(例如,[2]、[3]、[next])

mypage/摇滚乐/好奇心/第页/第2页

把我带到404页。

    <?php
$paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1;
//for a given post type, return all
$args = array(
    \'tax_query\' => array(
        array(
            \'taxonomy\' => \'genero\', 
            \'field\' => \'slug\', 
            \'terms\' => \'curiosity\' 
        )
    ),
    \'post_type\'=>\'\',    //add your post type name 
    \'posts_per_page\' => 1, 
);
    $my_query = null;
    $my_query = new WP_Query($args);
if( $my_query->have_posts() ) {
  while ($my_query->have_posts()) : $my_query->the_post(); ?>
        <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
<?php
  endwhile;
}
wp_reset_query();  // Restore global post data stomped by the_post().
?>
 <?php wp_pagenavi( array( \'query\' => $my_query ) ); ?>
            <?php wp_reset_postdata(); ?>
我怎样才能解决这个问题?我做错了什么?

EDIT

下面是我如何注册我的帖子类型

function my_custom_post_product() {
  $labels = array(
    \'name\'               => _x( \'Rock\', \'post type general name\' ),
    \'singular_name\'      => _x( \'Rock\', \'post type singular name\' ),
    \'add_new\'            => _x( \'Add New\', \'entry in rock\' ),
    \'add_new_item\'       => __( \'Add New entry in rock\' ),
    \'edit_item\'          => __( \'Modificar entry in rock\' ),
    \'new_item\'           => __( \'New entry in rock\' ),
    \'all_items\'          => __( \'all entry in rock\' ),
    \'view_item\'          => __( \'see entry in rock\' ),
    \'search_items\'       => __( \'search entry in rock\' ),
    \'not_found\'          => __( \'Nothing entry in rock\' ),
    \'not_found_in_trash\' => __( \'Nothing entry in rock on thrash\' ),
    \'parent_item_colon\'  => \'\',
    \'menu_icon\' => get_bloginfo(\'template_directory\'). \'/images/my_menu_icon.png\',
    \'menu_name\'          => \'Rock\'
  );

  $args = array(
    \'labels\'        => $labels,
    \'description\'   => \'Introduzca un nueva entrada en rock\',
    \'public\'        => true,
    \'menu_position\' => 5,
    \'supports\'      => array( \'title\', \'editor\', \'thumbnail\', \'excerpt\', \'comments\' ),
    \'has_archive\'   => true,
    \'hierarchical\'  => true,
    \'rewrite\'   => array(\'slug\' => \'Rock/%genero%\', \'with_front\' => false),
    \'query_var\'   => true,
    //\'rewrite\'   => true,
    //\'publicly_queryable\' => false,
  );
  register_post_type( \'Rock\', $args );
}
add_action( \'init\', \'my_custom_post_product\' );
这是我现在的循环。我仍然得到这个代码的404错误

<?php if (have_posts()) : while (have_posts()) : the_post(); ?>

    <header>
      <h2><a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
      <p><time datetime="<?php echo get_the_date(); ?>"><?php echo get_the_date(); ?></time>. <?php if ( comments_open() ) : ?><a class="comment" href="<?php the_permalink(); ?>#comments"><?php comments_number(\'0 Comments\', \'1 Comment\', \'% Comments\'); ?></a><?php endif; ?></p>
    </header>

<?php endwhile; else: ?>
  <p><?php _e(\'Sorry, no posts matched your criteria.\'); ?></p>
<?php endif; ?>


<nav class="paging">
  <?php if(function_exists(\'wp_pagenavi\')) : wp_pagenavi(); else : ?>
    <div class="prev"><?php next_posts_link(\'&laquo; Previous Posts\') ?></div>
    <div class="next"><?php previous_posts_link(\'Next Posts &raquo;\') ?></div>
  <?php endif; ?>
</nav>

EDIT 2

我已经将camelcase“Rock”更改为“Rock”,并且可以工作,但只有在“管理”>“设置”>“阅读”中更改配置,并将post设置为显示为5,就像每页的post\\u数(在循环中),但如果我需要在其他页上显示较少的post\\u,例如post\\u per\\u page=3(例如,[2],[next]),则会出现404错误页。

如果其他页面需要,是否有办法自定义数字?

<?php $posts=query_posts($query_string . \'&orderby=asc&posts_per_page=5\'); if (have_posts()) : while (have_posts()) : the_post(); ?>
 <h2><a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>
<?$content = get_the_excerpt();
echo substr($content, 0, 200);
global $post;
$text = $post->post_excerpt;?>

<?php endwhile; else: ?>

  <p><?php _e(\'Sorry, no posts matched your criteria.\'); ?></p>
<?php endif; ?>

4 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

您的问题肯定是您的自定义查询。您的自定义查询有一两个问题,我现在不处理。你应该努力完成this page (WP_Query) 如何正确构造自定义查询

您真正的问题是,您必须问自己,定制查询是否必要?直截了当的答案应该是可靠的NO. 应始终避免使用自定义查询,而应使用主页上的主查询和任何类型的存档页。主查询非常特定于所请求的特定页面,这是自定义查询无法复制的。

虽然这些自定义查询可以工作,但当您尝试分页时,真正的问题就会出现,正如您现在所经历的那样。

带有默认循环以显示任何模板的主查询结果的基本布局应如下所示

if( have_posts() ) {
    while( have_posts() ) {
        the_post();

        // CALL YOUR TEMPLATE TAGS

    }
} 
Theif 条件并不总是必要的,就像单打一样。php模板和归档模板。正如你所见,NO 自定义查询。

您需要对主查询进行的任何更改(需要运行自定义查询的页面模板除外)都可以通过pre_get_posts 这是更改模板上查询内容的正确方法。有关上述内容的更多信息,请查看this post

因此,您的解决方案是,删除自定义查询的所有部分,并将其替换为我上面给出的默认循环,只需添加循环对象和HTML标记,然后就可以正常分页

EDIT

从粘贴的代码来看,您的查询现在看起来很好。应该是这样的。

这一切的根本原因是你的帖子类型,Rock. 不能在自定义帖子类型名称中使用camelcase(这适用于自定义分类法和函数名称)。您应该考虑将自定义帖子类型重命名为rock.

请记住,刷新并重新刷新永久链接,以确保在更新自定义帖子类型代码后所做的更改生效

EDIT 2

你要么没有阅读链接的帖子,要么只是走了一条自杀的捷径query_posts. 请重新阅读此答案中的链接帖子。你应该NEVER 曾经利用过query_posts.

Note: 此功能不适用于插件或主题。如后文所述,有更好、性能更好的选项来更改主查询。query\\u posts()是一种过于简单且有问题的方法,通过将页面的主查询替换为新的查询实例来修改它。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。

删除此行

 $posts=query_posts($query_string . \'&orderby=asc&posts_per_page=5\'); 
这句话是你页面上邪恶的根源

您可以使用更改每页的分页pre_get_posts 这是正确的做法。如果您需要更改curiosity “术语”页面中,可以将以下内容添加到函数中。php(注意:这需要php 5.3+)

add_action( \'pre_get_posts\', function ($q ) {
    if( !is_admin() && $q->is_main_query() && $q->is_tax( \'genero\', \'curiosity\' ) ) {
       $q->set( \'posts_per_page\', 3 );
       $q->set( \'order\', \'ASC\' );
    }
)};

EDIT 3

对于PHP 5.3之前的版本,上述功能无法使用,因为匿名函数仅在PHP 5.3中引入。对于这些版本,请尝试以下操作

add_action( \'pre_get_posts\', \'wpse170243_custom_ppp\' );
function wpse170243_custom_ppp($q ) {
    if( !is_admin() && $q->is_main_query() && $q->is_tax( \'genero\', \'curiosity\' ) ) {
       $q->set( \'posts_per_page\', 3 );
       $q->set( \'order\', \'ASC\' );
    }
}

SO网友:shanebp

在重置查询之前,请尝试调用nav。

...

if (function_exists(\'wp_pagenavi\')) wp_pagenavi(array(\'query\' => $my_query));

wp_reset_query();  // Restore global post data stomped by the_post().

?>

SO网友:Amit Mishra

尝试以下操作:

将此custom\\u pagination()函数添加到函数中。php文件

 function custom_pagination($numpages = \'\', $pagerange = \'\', $paged=\'\') {

  if (empty($pagerange)) {
    $pagerange = 2;
}

  global $paged;
  if (empty($paged)) {
    $paged = 1;
    }
  if ($numpages == \'\') {
    global $wp_query;
    $numpages = $wp_query->max_num_pages;
    if(!$numpages) {
        $numpages = 1;
    }
}
  /** 
   * We construct the pagination arguments to enter into our paginate_links
   * function. 
   */
  $pagination_args = array(
    \'base\'               => get_pagenum_link(1) . \'%_%\',
    \'total\'              => $numpages,
    \'current\'            => $paged,
    \'show_all\'           => False,
    \'end_size\'           => 1,
    \'mid_size\'           => $pagerange,
    \'prev_next\'          => False,
    \'prev_text\'          => __(\'&laquo;\' , \'swift\'),
    \'next_text\'          => __(\'&raquo;\' , \'swift\'),
    \'type\'               => \'array\',
    \'add_args\'           => false,
    \'add_fragment\'      => \'\'
  );

  $paginate_links = paginate_links($pagination_args);
  echo \'<div class="Pagination-Num"><ul>\';
        foreach ( $paginate_links as $paginate_link ) {
                 echo "<li> $paginate_link </li>";
            }
        echo \'</ul></div>\';

}
并对Post循环文件调用custom\\u pagination()

<?php
    $paged = ( get_query_var( \'paged\' ) ) ? get_query_var( \'paged\' ) : 1;
    //for a given post type, return all
    $args = array(
        \'tax_query\' => array(
            array(
                \'taxonomy\' => \'genero\', 
                \'field\' => \'slug\', 
                \'terms\' => \'curiosity\' 
            )
        ),
        \'post_type\'=>\'\',    //add your post type name 
        \'posts_per_page\' => 1, 
    );
        $my_query = null;
        $my_query = new WP_Query($args);
    if( $my_query->have_posts() ) {
      while ($my_query->have_posts()) : $my_query->the_post(); ?>
            <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p>
    <?php
      endwhile;

     if (function_exists(custom_pagination)) {
        custom_pagination($my_query->max_num_pages,"",$paged);
      }
    }
    wp_reset_query();  // Restore global post data stomped by the_post().
    ?>

      <?php wp_reset_postdata(); ?>
我想它会很好用的

SO网友:Jinson Abraham

您的循环是否在主页上运行?

将此添加到您的函数中。php和测试。

   <?php function custom_loop_query( $query ) {
    if(  ! is_admin() && $query->is_main_query() ) {
    $query->set( \'post_type\', array( \'rock\' ) );
    }
    }
    add_action( \'pre_get_posts\', \'custom_loop_query\' );  
    ?>

结束

相关推荐

The Loop in Static Page

我对环路有一些问题。我以“Twenty14”主题为例。我正在使用基本循环创建2个php文件。一个是家。其中一个是名为示例页的模板页。php。两者都包含此代码;if( have_posts() ) : while( have_posts() ) : the_post(); the_content; endwhile; endif; 没什么特别的,唯一的区别是我在示例页面上有模板声明。php/** * Template Nam