Paginare care nu funcționează pe pagina principală

25 apr. 2013, 04:23:04
Vizualizări: 15.4K
Voturi: 4

Am o pagină numită "share" cu un loop complex care funcționează perfect. Această pagină se află la domain.com/share. Acum trebuie să folosesc această pagină ca pagină principală, așa că am mers la "Setări -> Citire" și am selectat acea pagină ca pagină statică.

Problema acum este că paginarea nu mai funcționează. Pe pagina reală afișa domain.com/share/page/2 dar acum afișează domain.com/page/2 și încarcă mereu același conținut de la prima pagină, indiferent de pagina în care te afli.

Nu am făcut alte modificări, doar am setat acea pagină ca pagină principală. Care sunt posibilele soluții aici?

Folosesc WP Pagenavi dacă asta face vreo diferență.

Acesta este template-ul meu page.php:

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

if (is_page('join')) $post_types = array('articles');
if (is_page('learn')) $post_types = array('actions');
if (is_page('share')) $post_types = array('articles', 'actions');

$category = get_query_var('category');
$type = get_query_var('type');

$args = array(
  'post_type' => $post_types,
  'paged' => $paged,
  'tax_query' => array('relation' => 'AND')
);

// Obține toate taxonomiile pentru tipurile de postări
$taxonomies = array();
foreach ($post_types as $post_type) {
  foreach (get_object_taxonomies($post_type) as $tax) {
    if (array_search($tax, $taxonomies) === false) $taxonomies[] = $tax;
  }
}

// Construiește query-ul pentru taxonomii
foreach ($taxonomies as $taxonomy) {

  $all_terms = get_terms($taxonomy, array('fields' => 'names'));
  $query_terms = array(ucfirst($category), ucwords(str_replace('-', ' ', $type)));
  $cur_terms = array_values(array_filter(array_intersect($all_terms, $query_terms)));

  if (! empty($cur_terms)) {
    $args['tax_query'][] = array(
      'taxonomy' => $taxonomy,
      'terms' => empty($cur_terms) ? $all_terms : $cur_terms,
      'field' => 'slug'
    );
  }
}

if (is_page('join')) $args['posts_per_page'] = 36;

$query = new WP_Query($args);

get_header();
Theme::toolbar();
?>

<div class="center">
  <div id="content">
    <? if ($query->have_posts()): ?>
      <? while ($query->have_posts()): $query->the_post() ?>
        <? get_template_part('content') ?>
      <? endwhile ?>
    <? else: ?>
    <? endif ?>
  </div>
</div>

<?
wp_reset_query();
Theme::pagination($query);
get_footer();
?>

Și acesta este codul de paginare din Theme:

function pagination($query = null)
{
  global $wp_query;
  if (empty($query)) $query = $wp_query;
  $is_paged = $query->max_num_pages > 1;
  ?>

  <? if ($is_paged): ?>
    <div class="center"><div id="pagination"><? wp_pagenavi(array('query' => $query)) ?></div></div>
  <? endif ?>

  <?
}
8
Comentarii

Poate sunt prost, dar există vreun motiv anume pentru care apelezi wp_reset_query(); înainte de a apela paginare?

netfreak netfreak
25 apr. 2013 14:49:58

Theme-ul tău are un șablon front-page.php? Dacă da, acesta va suprascrie șablonul page.php.

mrwweb mrwweb
25 apr. 2013 18:08:17

@mrwweb: Nu, nu am front-page.php. Conținutul apare corect, la fel ca în share. Paginarea apare, dar toate paginile încarcă conținutul de la prima. Am infinite scroll, așa că se blochează și încarcă același conținut la infinit.

elclanrs elclanrs
25 apr. 2013 22:39:28

Poți activa WP_DEBUG și poate un dump al variabilei tale $query, mai ales când mergi la pagina următoare?

netfreak netfreak
26 apr. 2013 01:49:36

@netfreak: Am WP_DEBUG activat. Tocmai am verificat din nou query-ul atent, iar în page/2 scrie paged=>1?! Dar în share/page/2 scrie paged=>2... Nu înțeleg.

elclanrs elclanrs
26 apr. 2013 02:09:41

is_page('share') nu mai este adevărat când este pagina principală, nu sunt sigur dacă asta contribuie la problemă.

Milo Milo
26 apr. 2013 02:23:14

@Milo: Am încercat cu is_front_page() și nu a făcut nicio diferență, problema persistă...

elclanrs elclanrs
26 apr. 2013 03:26:15

Vă rugăm să evitați discuțiile extinse în comentarii. @elclanrs vă rugăm să trimiteți [edit]ri cu informații suplimentare, nu comentarii.

kaiser kaiser
25 apr. 2014 09:41:03
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 4
1
11

Am avut aceeași problemă. Și în final, am rezolvat-o.
Obținerea numărului curent de paginare

<?php  $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;  ?>

Pentru a obține numărul curent de paginare pe o pagină frontală statică (șablon de pagină) trebuie să utilizați variabila de interogare 'page'.

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

Deci ar trebui să utilizați get_query_var('page') în loc de get_query_var('paged').
Puteți utiliza funcția is_front_page() într-o condiție if pentru interogarea paginii frontale. Exact ca în exemplul următor:

<?php
if(is_front_page()) {
    $paged = (get_query_var('page')) ? get_query_var('page') : 1;
}else {
    $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
}

Creditul merge aici

31 iul. 2017 18:25:00
Comentarii

Genial! Mulțumesc!!

tillinberlin tillinberlin
15 apr. 2024 15:56:31
0

Nu am testat acest lucru, dar pagina WP Query menționează:

Notă privind paginarea: Folosește get_query_var('page'); dacă dorești ca interogarea ta să funcționeze într-un șablon de Pagină pe care l-ai setat ca pagină principală statică.

Deci, probabil ai nevoie de asta:

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

[ ... ]

$args = array(
    'post_type' => $post_types,
    'page'      => $page_number,
    'tax_query' => array( 'relation' => 'AND' ),
);
10 mai 2013 21:21:03
0

Folosesc acest cod pentru paginare în index.php pentru bucla de postări:

<?php if ( have_posts() ) :  while ( have_posts() ) : the_post(); ?>
    // adaugă titlu, rezumat sau link-uri permanente 
<?php endwhile; ?>
    <?php pagination(); ?>
<?php else : ?>
        <?php // mesaj pentru lipsa postărilor se adaugă aici ?>
<?php endif; ?>

Apoi adaug următoarele linii în functions.php

function pagination() {

    if( is_singular() )
        return;

    global $wp_query;

    /** Oprește execuția dacă există doar 1 pagină */
    if( $wp_query->max_num_pages <= 1 )
        return;

    $paged = get_query_var( 'paged' ) ? absint( get_query_var( 'paged' ) ) : 1;
    $max   = intval( $wp_query->max_num_pages );

    /** Adaugă pagina curentă în array */
    if ( $paged >= 1 )
        $links[] = $paged;

    /** Adaugă paginile din jurul paginii curente în array */
    if ( $paged >= 3 ) {
        $links[] = $paged - 1;
        $links[] = $paged - 2;
    }

    if ( ( $paged + 2 ) <= $max ) {
        $links[] = $paged + 2;
        $links[] = $paged + 1;
    }

    echo '<div class="navigation"><ul>' . "\n";

    /** Link către postările anterioare */
    if ( get_previous_posts_link() )
        printf( '<li>%s</li>' . "\n", get_previous_posts_link() );

    /** Link către prima pagină, plus puncte de suspensie dacă e necesar */
    if ( ! in_array( 1, $links ) ) {
        $class = 1 == $paged ? ' class="active"' : '';

        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( 1 ) ), '1' );

        if ( ! in_array( 2, $links ) )
            echo '<li>…</li>';
    }

    /** Link către pagina curentă, plus 2 pagini în ambele direcții dacă e necesar */
    sort( $links );
    foreach ( (array) $links as $link ) {
        $class = $paged == $link ? ' class="active"' : '';
        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $link ) ), $link );
    }

    /** Link către ultima pagină, plus puncte de suspensie dacă e necesar */
    if ( ! in_array( $max, $links ) ) {
        if ( ! in_array( $max - 1, $links ) )
            echo '<li>…</li>' . "\n";

        $class = $paged == $max ? ' class="active"' : '';
        printf( '<li%s><a href="%s">%s</a></li>' . "\n", $class, esc_url( get_pagenum_link( $max ) ), $max );
    }

    /** Link către postările următoare */
    if ( get_next_posts_link() )
        printf( '<li>%s</li>' . "\n", get_next_posts_link() );

    echo '</ul></div>' . "\n";

}
3 sept. 2013 10:26:22
0

Ai resetat interogarea înainte de a genera paginarea, uită-te la aceste linii din codul tău:

wp_reset_query();
Theme::pagination($query);
get_footer();

Nu am analizat mai departe din cauza acestei probleme. Rezolvă această eroare și spune-mi dacă soluționează problema.

3 sept. 2013 10:49:59