Úvodní stránka › Fórum podpory WordPressu › Problémy s WordPressem › Pagination a filtrování
Štítky: Stránkování, WP_Query
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á 9 let, 1 měsíc.
-
AutorPříspěvky
-
17. dubna 2014 (20:37) #18386
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ěď
17. dubna 2014 (22:13) #18388Duplicitní 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).
18. dubna 2014 (2:40) #18391Kó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).
18. dubna 2014 (6:11) #18393Zkuste 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?
18. dubna 2014 (8:16) #18394Dě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>
18. dubna 2014 (9:05) #18398Ale 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;18. dubna 2014 (9:20) #18400Č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.
18. dubna 2014 (9:25) #18401Snad 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.
18. dubna 2014 (12:06) #18408Po drobných úpravách to funguje, díky moc!
18. dubna 2014 (14:38) #18420Prosí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!
18. dubna 2014 (15:59) #18421Jde 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.18. dubna 2014 (16:13) #18423Musilda: 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…
-
AutorPříspěvky
Pokud chcete odpovědět na toto téma, musíte se nejdříve přihlásit.