web-dev-qa-db-fra.com

404 erreur Taxonomie de type personnalisé PageNavi | wordpress

J'ai un type de message personnalisé appelé rock avec une taxonomie personnalisée appelée genero. taxonomy-genero-curiosity.php

mypage/Rock/curiosité /

Lorsque je clique sur les liens de page paginés suivants (par exemple, [2], [3], [suivant])

mypage/Rock/curiosité/page/2

me amène à une page 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(); ?>

Comment puis-je réparer cela? Qu'est-ce que je fais mal?

MODIFIER

Voici comment enregistrer mon type de message

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' );

Et voici ma boucle telle qu'elle se présente maintenant. J'ai toujours l'erreur 404 avec ce code

<?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

J'ai changé le camelcase "Rock" pour "rock" et cela fonctionne, mais seulement si vous modifiez la configuration dans Admin> Paramètres> Lecture et réglez la publication sur 5 comme le nombre de posts_per_page (sur la boucle), mais si j'ai besoin de montrer moins post sur une autre page, par exemple post_per_page = 3 (par exemple, [2], [next]) apparaît avec une page d'erreur 404.

Est-il possible de personnaliser le numéro si nécessaire sur d'autres pages?

<?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; ?>
1
user3766356

Votre problème est définitivement votre requête personnalisée. Il y a un problème ou deux avec votre requête personnalisée que je ne traiterai pas maintenant. Vous devriez travailler avec cette page (WP_Query) sur la manière de construire correctement une requête personnalisée

Votre vrai problème ici est, et la question que vous devez vous poser, la requête personnalisée est-elle nécessaire? Et la réponse directe devrait être un solide {NON. Les requêtes personnalisées doivent toujours être évitées au profit de la requête principale sur la page d'accueil et de tout type de page d'archive. La requête principale est très spécifique à la page demandée, quelque chose qui n'est pas répliqué par votre requête personnalisée.

Bien que ces requêtes personnalisées fonctionnent, les véritables problèmes se posent lorsque vous essayez de paginer, comme vous l'avez expérimenté maintenant.

La présentation de base avec la boucle par défaut pour afficher les résultats de la requête principale de tout modèle devrait ressembler à ceci:

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

        // CALL YOUR TEMPLATE TAGS

    }
} 

La condition if n'est pas toujours nécessaire, contrairement au modèle single.php et aux modèles d'archive. Comme vous pouvez le constater, NO requêtes personnalisées.

Toute modification que vous devez apporter à la requête principale (à l'exception des modèles de page dans lesquels vous devez exécuter une requête personnalisée) peut être effectuée via pre_get_posts, qui est le moyen correct de modifier le contenu de la requête d'un modèle. Pour plus d'informations sur ce qui précède, vérifiez ce post

Donc, votre solution serait de supprimer toutes les parties de votre requête personnalisée et de la remplacer par la boucle par défaut comme ci-dessus, ajoutez simplement vos objets de boucle et votre marque HTML jusqu’à ce que vous puissiez paginer normalement.

MODIFIER

À partir du code de vos pâtes, votre requête semble bien maintenant. C'est ainsi que cela devrait être.

Votre cause principale de tout cela est votre type de message, Rock. Vous ne pouvez pas utiliser camelcase dans les noms de type d'article personnalisé (cela s'applique aux noms de taxonomie et de fonction personnalisés). Vous devriez envisager de renommer votre type de publication personnalisé en rock.

Et rappelez-vous, purgez et libérez vos permaliens pour vous assurer que vos modifications ont pris effet après la mise à jour de votre code de type de publication personnalisé.

EDIT 2

Soit vous n'avez pas lu les messages liés, soit vous venez de prendre un raccourci suicidaire avec query_posts . Veuillez relire le message lié dans cette réponse. Vous devriez NEVER jamais utiliser query_posts.

Note: Cette fonction n'est pas destinée à être utilisée par des plugins ou des thèmes. Comme expliqué plus tard, il existe de meilleures options plus performantes pour modifier la requête principale. query_posts () est une façon trop simpliste et problématique de modifier la requête principale d'une page en la remplaçant par une nouvelle instance de la requête. Il est inefficace (ré-exécute les requêtes SQL) et échouera carrément dans certaines circonstances (particulièrement lorsqu'il s'agit de pagination de publications).

Supprimer cette ligne

 $posts=query_posts($query_string . '&orderby=asc&posts_per_page=5'); 

Cette ligne est la racine de votre mal sur votre page

Vous pouvez modifier la pagination page par page avec pre_get_posts, ce qui est la bonne façon de procéder. Si vous devez modifier le nombre de publications uniquement sur votre page de terme curiosity, vous pouvez ajouter les éléments suivants à votre fichier functions.php ( Remarque: cela nécessite 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

Pour les versions antérieures à PHP5.3, la procédure ci-dessus ne fonctionnera pas comme des fonctions anonymes. Elle n'a été introduite que dans PHP 5.3. Pour ces versions, essayez ce qui suit

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' );
    }
}
0
Pieter Goosen

Essayez d'appeler la navigation avant de réinitialiser la requête.

...

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

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

?>
1
shanebp

Essayez ceci:

Ajouter cette fonction custom_pagination () à votre fichier function.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>';

}

Et appelez custom_pagination () dans votre fichier de boucle Post

<?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(); ?>

Je pense que ça va marcher

0
Amit Mishra