Pagination a filtrování

Zvolené téma obsahuje celkem 11 odpovědí. Do diskuze (3 účastníci) se naposledy zapojil uživatel  admin a poslední změna je stará 10 let.

Aktuálně je na stránce zobrazeno 12 příspěvků - 1. až 12. (z celkem 12)
  • Autor
    Příspěvky
  • #18386

    Firest
    Participant

    Zdravím,

    při tvorbě stránkování v šabloně jsem narazil na problém, který nejsem schopen vyřešit – při výpisu filtruji záznamy, které chci vybrat:

    $display_count = get_option('posts_per_page');
    				$page = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
    				$offset = ( $page - 1 ) * $display_count + $off;
    				$args = array(
    					'meta_key' => 'pozice',
    					'meta_value' => 100,
    					'offset' => $offset,
    					'paged' =>  $page,
    					'cat' => -15,
    					'posts_per_page' =>  $display_count,
    				);
    				$the_query = new WP_Query( $args );

    Záznamy se zobrazí podle kritérií, avšak pagination tyto kritéria ignoruje a vytvoří stránkování, jako by žádné filtrování nebylo (např. mám 18 záznamů kde filtrování odpovídá 9, a když nastavím 1 záznam na stránku, zobrazí se mi 18 stránek a 9 z nich prázdných). Díky za odpověď

    #18388

    admin
    Keymaster
    Web

    Duplicitní dotaz je zde.

    Kde tento kód spouštíte? Na nějaké stránce (aneb v souboru page.php)? Nemůže to způsobovat parametr offset? V proměnné $offset používáte ještě další proměnnou $off, ale nevíme, kde se vzala a co by měla vlastně dělat…

    K čemu to vlastně má být dobré? Řekněme, že pomocí dotazu získáte 36 stránek. Pokud máte v administraci nastavené stránkování např. na 10 (tedy $display_count = 10) a budete na druhé stránce (tedy $page = 2), tak bude $offset = (2 – 1) * (10 + $off) = tedy 10 + $off (neznámá hodnota).

    #18391

    Firest
    Participant

    Kód spouštím na index.php, proměnná $off je posunutí výběru o články, které jsou vypisovány jinde (kvůli specifické pozici). V této proměnné ale asi problém nebude, zkoušel jsem bez i s, ale se stejným výsledkem – články se vypíší přesně podle filtrování, ale pagination filtrování stále ignoruje (a vytváří stránkování na všechny příspěvky).

    #18393

    Musilda
    Participant
    Web

    Zkuste to takto

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

    Nebylo by lepší ty články, které jsou publikovány “jinde” definovat v query?

    #18394

    Firest
    Participant

    Děkuji za reakci,
    bohužel jediná změna byla v tom, že se posunul výběr (o jednu položku nahoru), ale stránkování stále zůstalo pro všechny články. Lepší by to určitě bylo, problém je v tom, že počet těchto článků je proměnlivý a vypisují se jak před tímto výpisem, tak i po něm.
    Pro jistotu sem dám celý kód, snad to nějak pomůže.

    <div class="news">
    				<?php 
    				$display_count = get_option('posts_per_page');
    				$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
    				$offset = ( $paged - 1 ) * $display_count + $off;
    				$args = array(
    					'meta_key' => 'pozice',
    					'meta_value' => 100,
    					'offset' => $offset,
    					'paged' =>  $paged,
    					'cat' => -15,
    					'posts_per_page' =>  $display_count,
    				);
    				$the_query = new WP_Query($args);
    				?>
    				<?php if( $the_query->have_posts() ): ?>
    					<?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
    						<article class="list">
    							<figure class="post-image"> 
    								<a href="<?php the_permalink(); ?>" title="Ilustrační foto">
    								<?php if ( has_post_thumbnail() ) {
    									the_post_thumbnail();
    								} else { ?>
    									<img src="<?php bloginfo('template_url'); ?>/images/default.jpg">
    								<?php } ?>
    								</a> 
    							</figure>
    							<header class="post-header">
    								<h1><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h1>
    								<p class="post-meta">
    								<?php if(get_field('tag') and get_field('tag') !== "Žádný")
    								{ ?>
    								<span class="tag"><?php echo get_field('tag')?></span>
    								<?php } ?><time class="date" datetime="<?php the_time("Y-m-d"); ?>" pubdate><?php the_time("d. F Y"); ?></time></p>
    							</header>
    							<div class="post-body"><?php the_content('...'); ?></div>		
    						</article>
    						<div class="oddelovac"></div>
    					<?php endwhile; ?>
    				<?php endif; ?>
    			</div>
    
    			<div id="paginator">
    				<?php if(function_exists('wpnumeric_pagination')) wpnumeric_pagination();?>
    			</div>
    #18398

    Musilda
    Participant
    Web

    Ale nějak se ty články musí definovat? Nebo prostě si vybereš, že tento článek tam nechceš? Takto vypisuješ články s meta pozice a hodnotou 100. Pořád mi není jasné, jaké články chceš vynechat.
    Podle mne je lepší definovat, které články tam mají být a pak vytvořit stránkování. Já jsem si pro takové případy upravil funkci, protože s tím bylo hrozné trápení.
    Mimochodem, nevidím tam global $paged;

    #18400

    Firest
    Participant

    Články mají pozici definovanou právě tím meta pozice (např. Pozice1 má hodnotu 1, Pozice2 2, …), 100 znamená, že článek nemá pozici (a proto vybírám s meta_value 100). Ve filtrování to funguje parádně, ale pagination prostě ignoruje tu pozici 100 a počítá i s články co mají pozici 1,2, .. a i ty, které pozici vůbec nemají (třeba z kategorie 15, proto ji vylučuji z query).

    EDIT: $paged mám definovanou v header.php, zkoušel jsem ji přesunout, ale bezvýsledně, tak jsem ji vrátil zpět aby byla zachována alespoň původní funkčnost.

    #18401

    Musilda
    Participant
    Web

    Snad ti pomůže toto, s tím jsem si vypomáhal, když už jsem nevěděl kudy kam:

    function mm_pagination($cats, $perpage, $range = 2)
    {  
         
         $showitems = ($range * 2)+1;
        
        $args = array(
          'cat' => $cats,
          'showposts' => '-1'
          );
        
        global $wp_query;
        $temp = $wp_query;
        $wp_query= null;
        $wp_query = new WP_Query();
        $wp_query->query($args);
        $pages = $wp_query->post_count;
         global $paged;
        if(empty($paged)) $paged = 1;
        $pages = ceil($pages / $perpage);
         if(1 != $pages)
         {
             echo "<div class='mm-pagination'>";
             if($paged > 2 && $paged > $range+1 && $showitems < $pages) echo "<a href='".get_pagenum_link(1)."'>First</a>";
             if($paged > 1 && $showitems < $pages) echo "<a href='".get_pagenum_link($paged - 1)."'>Last</a>";
             for ($i=1; $i <= $pages; $i++)
             {
              if (1 != $pages &&( !($i >= $paged+$range || $i <= $paged-$range) || $pages <= $showitems ))
                 {
                     echo ($paged == $i)? "<span class='current'>".$i."</span>":"<a href='".get_pagenum_link($i)."' class='inactive' >".$i."</a>";
                 }
             }
             if ($paged < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($paged + 1)."'>Next</a>";  
             if ($paged < $pages-1 &&  $paged+$range-1 < $pages && $showitems < $pages) echo "<a href='".get_pagenum_link($pages)."'>Last</a>";
             echo "</div>\n";
         }
         
    }
      

    V šabloně pak jenom zavolat funkci. Mám to testované i na custom post type, takže by to mělo fungovat.

    #18408

    Firest
    Participant

    Po drobných úpravách to funguje, díky moc!

    #18420

    admin
    Keymaster
    Web

    Prosím, prosím, vysvětlí mi tady někdo, o co tu vlastně šlo? :-)

    Můžete mi dát někdo příklad, abych si to mohl vyzkoušet? Z těch dlouhých funkcí se mi tady nedělá dobře :-) Určitě to nejde nějak jednodušeji? Nikdy jsem na žádný větší problém se stránkováním nenarazil…

    Příklad: Pomocí WP_Query chci získat všechny stránky, které mají nějakou hodnotu uživatelského pole. Takže jich dostanu třeba 38. Některé z nich chci ale z nějakého důvodu nezobrazovat (aneb použitý offset), takže jich budu mít jen 32 a chci je stránkovat po deseti, takže to jsou celkem 4 stránky. Kde v tom je nějaký problém a co tam nefunguje?

    Nebo mi prosím někdo pošlete celou ukázku souboru, kde je ten problém, opravdu bych si to chtěl vyzkoušet… Díky!

    #18421

    Musilda
    Participant
    Web

    Jde o to, že pokud máš WP_Query na indexu a nevíš jak na to, tak ti tam WordPress cpe jeho stránkování, neovlivněné WP_Query.
    No a protože jsem s tím měl taky dříve problémy, tak jsem si udělal takovou berličku, sice je ta funkce trochu fujky, ale občas mi pomůže vyřešit problém.

    #18423

    admin
    Keymaster
    Web

    Musilda: Já jsem ale nikdy neměl na úvodní stránce žádný problém se stránkováním ani WP_Query, takže ani netuším, že by tam měl nějaký být :-) Když jsem dělal dotaz na úvodní stránce, tak všechno vždy fungovalo. Nemáš nějaký příklad třeba u nějaké starší šablony? Docela rád bych se na to podíval…

Aktuálně je na stránce zobrazeno 12 příspěvků - 1. až 12. (z celkem 12)

Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.

WordPress – novinky, návody a zajímavosti