web-dev-qa-db-fra.com

Pagination de soumission de formulaire de requête personnalisée

Il y a une question très semblable à la mienne, qui peut être trouvée ici . La différence avec ma question est la suivante: mon formulaire de recherche figure sur plusieurs pages (page.php et single.php) et je n’utilise pas wp-pagenavi. J'ai essayé les solutions suggérées, mais elles n'ont pas fonctionné.

Qu'est-ce qui fonctionne

  • La requête affiche les bons résultats
  • La requête affiche les bons résultats après la soumission du formulaire
  • Spectacles de pagination avec les liens appropriés (exemple: example.com/overview/?paged=2 et example.com/city/boston/?paged=2)
  • La pagination avec les mêmes paramètres fonctionne sur search.php

Ce qui ne fonctionne pas:si je soumets le formulaire et que je clique sur une page autre que la page 1, l'URL devient exemple.com/overview/?paged=2 ou exemple.com/city/boston/. ? paged = 2 mais aucun résultat n'est affiché.

Mis à jour après la réponse acceptée:Veuillez lire les remarques dans le code pour voir comment le problème a été résolu.

--- Ci-dessous, la configuration de mon code

Sur page.php

if(is_page('overview')) {
    get_template_part('templates/overview', 'main');
}

Sur single.php (inclure le même fichier)

if(is_singular('cities')) {
    get_template_part('templates/overview', 'main');
}

Sur overview-main.php

include_once 'overview-search-input.php'; 
include_once 'overview-sidebar.php';

Sur overview-search-input.php (modifié après UPDATE 3, code original ci-dessous ici)

   if(!empty($_GET['period'])) {
        $period = $_GET['period'];
   }
   else {
        $period = 'upcoming'; // Set to upcoming if nothing is selected
   }

   $query = search_v1($period, $paged); // Passing the $paged parameter in the query

   $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; // The $paged parameter

Sur overview-sidebar.php

<form action="<?php echo get_permalink(); ?>" method="get"> 
<select name="period" placeholder="Select">
  <option value=""></option>
  <option value="all"></option>
  <option value="upcoming"></option>
</select>
</form>

dans la fonctionsearch_v1:

    $args = array(
        'post_type'         => 'events',
        'post_status'       => 'publish',
        'posts_per_page'    => 20,
        'paged'             => $paged, // This was passed into the function
        'meta_query'        => array($meta_query), // This is generated based on the $period input and it's working (tested)
        'meta_key'          => 'date_from',
        'orderby'           => 'meta_value',
        'order'             => 'ASC',
    );

    return new WP_Query($args);

Puis sur overview-main.php

   if($query->have_posts()): while ($query->have_posts()): $query->the_post();
      // Do stuff
    endwhile;

    create_pagination($query);

    wp_reset_postdata();
    endif;

Et dans la fonctioncreate_pagination:

$query->query_vars['paged'] > 1 ? $current = $query->query_vars['paged'] : $current = 1;

$args = array(
    'base' => @add_query_arg('paged','%#%'),
    'format' => '?paged=%#%',
    'total' => $query->max_num_pages,
    'current' => $current,
    'show_all' => false,
    'end_size' => 1,
    'mid_size' => 2,
    'prev_next' => true,
    'prev_text' => '<i class="icon-chevron-left"></i>',
    'next_text' => '<i class="icon-chevron-right"></i>',
    'type' => 'list'
);

return paginate_links($args);

Le problème était:Comme les deux fonctions de pagination fonctionnent et affichent les liens de pagination corrects, je suppose que ce n'est pas le problème. Je pense que cela se trouve dans la requête personnalisée (puisque cette pagination fonctionne sur search.php lorsque les résultats sont générés une fois et ne sont pas modifiés par la saisie de formulaire).

Le problème a été résolu:en utilisant le paramètre 'paged' et en le transmettant à la requête

2
eskimo

Il y a des choses qui devraient être changées dans votre code:

  1. S'il vous plaît, ne pas utiliser de trucs $_SESSION. Donc, n’ajoutez pas session_start n’importe où. Vous pouvez transmettre l'état actuel via la chaîne de requête, en utilisant method="get" dans votre formulaire.
  2. Pour un meilleur déroulement, vous pouvez passer la page en cours à la fonction search_v1 en tant qu'argument, de cette façon, vous êtes sûr que ce ne sera pas une erreur.
  3. Lorsque vous devez accéder à superglobals array, il est recommandé au lieu d’accéder directement à filter_input
  4. dans le fichier overview-search-input.php, la dernière ligne est $query = search_v1($_SESSION['period']); qui est complètement inutile
  5. Je pense qu'il est utile dans le formulaire de sélectionner l'option de période des messages actuellement affichés, par exemple. lorsque vous visualisez des publications pour la période "à venir", l'option "à venir" doit être sélectionnée dans le formulaire.

Appliquer ces changements:

  • page.php et single.php et rester inchangé.
  • enlever session_start(); de l'endroit où vous avez ajouté

Ensuite

overview-search-input.php

<?php
$period = filter_input(INPUT_GET, 'period', FILTER_SANITIZE_STRING);
$paged = get_query_var('paged');
if ( empty($period ) ) $period  = 'upcoming';
if ( empty($paged) ) $paged = 1;

overview-sidebar.php

<form action="<?php echo get_permalink(); ?>" method="get">
<select name="period" placeholder="Select">
  <option <?php selected('', $period) ?>></option>
  <option <?php selected('all', $period) ?>>all</option>
  <option <?php selected('upcoming', $period) ?>>upcoming</option>
</select>
</form>

overview-main.php

include_once 'overview-search-input.php';
include_once 'overview-sidebar.php';

$query = search_v1( $period, $paged );

if( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post();
  // Do stuff
endwhile;

echo create_pagination( $query, $period );

wp_reset_postdata();
endif;

Enfin les 2 fonctions, search_v1 et create_pagination:

function search_v1( $period = 'upcoming', $paged = 1 ) {
  if ( empty($paged) ) $paged = 1;
  $meta_query = array(
    // create your meta query here
  );
  $args = array(
    'post_type'         => 'events',
    'post_status'       => 'publish',
    'posts_per_page'    => 20,
    'paged'             => $paged,
    'meta_query'        => array($meta_query),
    'meta_key'          => 'date_from',
    'orderby'           => 'meta_value',
    'order'             => 'ASC',
  );
  return new WP_Query( $args );
}


function create_pagination( $query, $period = 'upcoming' ) {
  $current = isset($query->query_vars['paged']) ? $query->query_vars['paged'] : 1;
  $args = array(
    'base' => get_permalink() . '%_%',
    'format' => '?paged=%#%&period=' . $period,
    'total' => $query->max_num_pages,
    'current' => ($current > 0) ? $current : 1,
    'show_all' => false,
    'end_size' => 1,
    'mid_size' => 2,
    'prev_next' => true,
    'prev_text' => '<i class="icon-chevron-left"></i>',
    'next_text' => '<i class="icon-chevron-right"></i>',
    'type' => 'list'
  );
  return paginate_links($args);
}
2
gmazzap

Au lieu de cette ligne

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

Pouvez-vous utiliser cela et vérifier.

$paged = (get_query_var('page')) ? get_query_var('page') : 1;

Aussi cette

$query->query_vars['paged'] > 1 ? $current = $query->query_vars['paged'] : $current = 1;

à

$query->query_vars['page'] > 1 ? $current = $query->query_vars['page'] : $current = 1;

Remarque: Comme vous utilisez des modèles de page personnalisés, "paginé" ne fonctionne pas ici.

0
Subharanjan