wake-up-neo.com

Paginierung der benutzerdefinierten Suchseite funktioniert nicht

Meine Suchseiten-URLs:

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

Hier meine benutzerdefinierte Suchseite:

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

Meine Paginierungslinks sind in Ordnung, aber ich sehe immer die Seite Nr. 1, weil query_vars['paged'] irgendwie leer ist.

Ich habe den Abschnitt Preserving Search Page Results and Pagination auf dieser Seite gesehen, konnte aber nicht herausfinden, wie ich ihn verwende, glaube aber nicht, dass dies in meinem Fall wirklich erforderlich ist.

EDIT 1 (Antwort auf Kommentar von J.D.):

Diese von Ihnen erwähnte Funktion gibt nur ein Array von Produkt-IDs zurück. Um meinen Code zu vereinfachen, habe ich meine Funktion entfernt und stattdessen ein statisches Array hinzugefügt.

3
HOY

Es kommt zu einem Konflikt zwischen Ihrer Ersatzabfrage und der Standardsuchabfrage, die im Hintergrund ausgeführt wird.

Anstatt eine neue WP_Query auszuführen, versuchen Sie, die Standardabfrage durch Verknüpfen mit pre_get_posts zu ändern:

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

Dann würden Sie die Standardschleife in Ihrer Vorlage anstelle Ihrer benutzerdefinierten WP_Query-Schleife ausgeben.

Dies hat den Vorteil, dass die Datenbank bei der Standardabfrage nicht ein einziges Mal aufgerufen wird und die Ergebnisse ignoriert werden und stattdessen die benutzerdefinierte Abfrage zum Rendern der Seite verwendet wird. Außerdem stimmen die Argumente paged und posts_per_page mit den Erwartungen von WP überein.

Bearbeiten: Ich habe irgendwie vermisst, dass dies in einer Seitenvorlage ist. Das ist genug WPSE für mich für heute, aber ich werde meine Antwort aktualisieren, um dies widerzuspiegeln, anstatt die Standardsuchabfrage zu ändern (was immer noch eine bessere Option ist, es sei denn, Sie müssen Ihre benutzerdefinierte Suche mit dem integrierten Suchformular koexistieren). .

In diesem Fall geschieht Folgendes: WP erwartet, dass die Argumente paged und posts_per_page auf die Hauptabfrage angewendet werden, die Ihre Suchseite abgerufen hat. Dies bedeutet, dass die Anweisungen auf der von Ihnen verknüpften Codex-Seite absolut zutreffen.

$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

für dieses Problem verwenden Sie zuerst eine Paginierungsfunktion wie diese:

 Funktion 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')); 
 $ a ['total '] = $ max; 
 $ a [' current '] = $ current; 
 $ total = 1; 
 $ a [' mid_size '] = 4; 
 $ a ['end_size'] = 4; 
 $ a ['prev_text'] = 'Vorherige Seite'; 
 $ a ['next_text'] = 'Nächste Seite'; 
 if ($ max> 1) echo ''; 
 echo $ pages. paginate_links ($ a); 
 if ($ max> 1) echo ''; 
}

verwenden Sie zur Verwendung dieser Funktion diesen Code

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

und dann in deiner Abfrage nachträglich verwenden:

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

es ist nicht ganz klar, auf welche 'ausgelagerte' Variable Sie verweisen, da Sie sie an verschiedenen Stellen haben.

eigentlich sollten Sie anstelle von $wp_query->get.. $ loop oder $ GLOBALS ['wp_query'] ausprobieren.

// vom Handy gesendet, sorry für die Grammatik

1
T.Todua