web-dev-qa-db-fra.com

La page de recherche personnalisée ne fonctionne pas

Mes URL de page de recherche:

https://www.example.com/search/keyword/page/2/

Voici ma page de recherche personnalisée:

<?php 

    if($_GET['search_text'] && !empty($_GET['search_text']))
    {
        $text = $_GET['search_text'];
    }
    else
    {
        $text = urldecode( get_query_var('search_text') ) ;            
    }

?>

<div id="primary" class="content-area">
    <main id="main" class="site-main" role="main">            
        <div class="searchpage-container">
            <div class="searchpage-filter-container">
                <span>Arama Sonuçları:</span>
            </div>                
            <div class="product-container">
                <?php
                    $my_products = array( 2085, 4094, 2900, 4072, 131 );

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

                    $args = array(
                        'post_type' => 'product',
                        'posts_per_page' => 2,
                        'paged' => $paged,
                        'post__in' => $my_products

                    );
                    $loop = new WP_Query( $args );

                    if ( $loop->have_posts() ) {
                        while ( $loop->have_posts() ) : $loop->the_post();
                            wc_get_template_part( 'content', 'product' );
                        endwhile;

                        $total_pages = $loop->max_num_pages;

                        if ($total_pages > 1){

                            /* $current_page = max(1, get_query_var('paged')); */
                            $wp_query->query_vars['paged'] > 1 ? $current_page = $wp_query->query_vars['paged'] : $current_page = 1;   
                            echo $wp_query->query_vars['paged'];

                            echo paginate_links(array(
                                'base' => get_pagenum_link(1) . '%_%',
                                'format' => '/page/%#%',
                                'current' => $current_page,
                                'total' => $total_pages,
                                'prev_text'    => __('« prev'),
                                'next_text'    => __('next »'),
                            ));
                        }
                    } 
                    wp_reset_postdata();                    

                ?>  
            </div>            
        </div>


    </main><!-- #main -->
</div><!-- #primary -->

Mes liens de pagination sont bien créés, mais je vois toujours la page 1 parce que query_vars['paged'] est vide.

J'ai vu la section Preserving Search Page Results and Pagination sur cette page , mais je ne savais pas comment l'utiliser, mais je ne pense pas que cela soit vraiment nécessaire dans mon cas.

EDIT 1 (réponse au commentaire de J.D.):

Cette fonction que vous avez mentionnée ne renvoie qu'un tableau d'ID de produits. Pour simplifier mon code, j'ai supprimé ma fonction et ajouter un tableau statique à la place.

3
HOY

Vous rencontrez un conflit entre votre requête de remplacement et la requête de recherche par défaut qui s'exécute en arrière-plan.

Au lieu d'exécuter un nouveau WP_Query, essayez de modifier la requête par défaut en vous connectant à pre_get_posts:

function wpse276396_search_filter($query) {
  if ( !is_admin() && $query->is_main_query() ) {
    if ($query->is_search) {
      $text = urldecode( get_query_var('search_text') );
      $my_products = aws_search_byozan($text);
      $query->set('post_type', 'product');
      $query->set('posts_per_page', 2);
      $query->set('post__in', $my_products);
    }
  }
}

add_action('pre_get_posts','wpse276396_search_filter');

Vous devez ensuite générer la boucle par défaut dans votre modèle au lieu de votre boucle WP_Query personnalisée.

Cela présente l'avantage de ne pas toucher la base de données une fois pour la requête par défaut, puis d'ignorer les résultats et d'utiliser votre requête personnalisée pour restituer la page. De plus, les arguments paged et posts_per_page correspondent à ce que WP attend.

Modifier: J'ai réussi à rater que c'est dans un modèle de page. C'est assez WPSE pour moi pour aujourd'hui, mais je mettrai à jour ma réponse afin de refléter cela plutôt que de modifier la requête de recherche par défaut (qui est toujours une meilleure option, sauf si vous avez besoin que votre recherche personnalisée coexiste avec le formulaire de recherche intégré). .

Dans ce cas, WP s'attend à ce que les arguments paged et posts_per_page soient appliqués à la requête principale qui a extrait votre page de recherche, ce qui signifie que les instructions de la page Codex que vous avez liée s'appliquent absolument.

$my_products = aws_search_byozan($text);
global $query_string;

$query_args = explode("&", $query_string);
$search_query = array();

if( strlen($query_string) > 0 ) {
    foreach($query_args as $key => $string) {
        $query_split = explode("=", $string);
        $search_query[$query_split[0]] = urldecode($query_split[1]);
    } // foreach
} //if

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

$args = array(
    'post_type' => 'product',
    'posts_per_page' => 2,
    'paged' => $paged,
    'post__in' => $my_products

);
$loop = new WP_Query( array_merge($search_query, $args ) );
0
Chris Cox

pour ce problème, vous utilisez d'abord une fonction de pagination comme ceci:

 fonction cupagenavi () {
 global $ wp_query, $ wp_rewrite; 
 $ pages = ''; 
 $ max = $ wp_query-> max_num_pages; 
 if (! $ current = get_query_var ('paged')) $ current = 1; 
 $ a ['base'] = ($ wp_rewrite-> using_permalinks ())? user_trailingslashit (trailingslashit (remove_query_arg ('page', get_pagenum_link (1)))). '? page =% #%', 'page'): @add_query_arg ('page', '% #%'); 
 if (! empty ($ wp_query-> query_vars ['s'])) $ a ['add_args'] = array ('s' => get_query_var ('s')); 
 $ un ['total '] = $ max; 
 $ a [' actuelle '] = $ actuelle; 
 $ total = 1; 
 $ a [' taille_taillante '] = 4; 
 $ a ['end_size'] = 4; 
 $ a ['prev_text'] = 'Page précédente'; 
 $ a ['next_text'] = 'Page suivante'; 
 if ($ max> 1) echo ''; 
 echo $ pages. paginate_links ($ a); 
 if ($ max> 1) echo ''; 
}

pour utiliser cette fonction, utilisez ce code

 if (function_exists ('cupagenavi')) cupagenavi (); 

et ensuite, dans votre requête, utilisez:

 $ paged = $ _GET ['page']; 
 $ args = array (
 'post_type' => 'product', 
 'posts_per_page' => '2', 
 'Paged' => $ paged, 
); 
 Query_posts ($ args); 
1
Sajjad Sky

il est difficile de savoir à quelle variable "paginée" vous vous référez, car vous l'avez à différents endroits.

en fait, au lieu de $wp_query->get.., vous devriez essayer $ loop ou $ GLOBALS ['wp_query']

// envoyé depuis un mobile, désolé pour la grammaire

1
T.Todua