Last active
December 20, 2015 05:19
-
-
Save alisspers/6077419 to your computer and use it in GitHub Desktop.
Exempel på hur du kan implementera alfabetisk paginering för en lista av WordPress-poster
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Tar bort den transient som genererats för postlistan med | |
* alfabetisk paginering. | |
* | |
* @wp-hook save_post,before_delete_post | |
* @param int $post_id ID på posten som sparas/raderas | |
*/ | |
function wg_clear_postlist_cache( $post_id ) | |
{ | |
$post = get_post( $post_id ); | |
if ( ! is_object( $post ) || $post->post_type != 'post' ) // < Kolla efter rätt posttyp här | |
return; | |
// Ta bort vår transient, så att postlistan och | |
// pagineringen genereras på nytt | |
delete_transient( 'my-posts-list' ); | |
} | |
add_action( 'save_post', 'wg_clear_postlist_cache' ); | |
add_action( 'before_delete_post', 'wg_clear_postlist_cache' ); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Template name: Arkiv med alfabetisk paginering | |
* | |
* Denna sidmall är ett exempel på hur man kan skapa | |
* alfabetisk paginering för en lista av poster i WordPress. | |
* | |
* Koden är lång, och hör möjligen bättre hemma i ett plugin. | |
* Men den fungerar, och du lär dig säker någonting av att | |
* kika på den. | |
*/ | |
// Använd en transient för att lagra den paginerade | |
// listan, så att pagineringen inte behöver beräknas | |
// vid varje sidladdning. | |
$transient_key = 'my-posts-list'; | |
$post_list = get_transient( $transient_key ); | |
// Fanns listan sen tidigare eller måste den genereras? | |
if ( false === $post_list ) | |
{ | |
// Hämta ut alla poster i alfabetisk ordning | |
$args = array( | |
'post_type' => 'post', // < Ange din posttyp | |
'posts_per_page' => - 1, | |
'orderby' => 'post_title', | |
'order' => 'ASC', | |
); | |
$posts = get_posts( $args ); | |
// Våra framräknade sidor | |
$pages = array(); | |
// Håller koll på nuvarande antal poster | |
$current_count = 0; | |
// Vi måste ligga "ett steg bakom" i loopen, eftersom | |
// vi måste jämföra posttiteln med den förra postens titel | |
$last_post = null; | |
$last_initial = ''; | |
// Gå igenom alla poster och lägg in dem i sidor | |
foreach ( $posts as $post ) | |
{ | |
// Första bokstaven i titeln | |
$initial = strtoupper( mb_substr( $post->post_title, 0, 1 ) ); | |
// Är det dags att skapa en ny sida? | |
// Villkor: | |
// 1) Antal poster är satt till 0 | |
// 2) Vi är inte på första varvet i loopen | |
if ( 0 == $current_count && isset( $last_post ) ) | |
{ | |
$current_page = array( | |
'posts' => array(), | |
'first-letter' => $last_initial, | |
); | |
} | |
// Är vi klara med den nuvarande sidan? | |
// Villkor: | |
// 1) Minimum antal poster har nåtts | |
// 2) Den förra första bokstaven skiljer sig från | |
// den nuvarande | |
// 3) Den förra första bokstaven skiljer sig från den | |
// första i denna sida (undviker sidor som "B-B") | |
if ( $current_count >= $posts_per_page | |
&& $last_initial != $initial | |
&& $last_initial != $current_page['first-letter'] ) | |
{ | |
// Se till att denna sida avslutas och en ny | |
// påbörjas nästa varv. | |
$current_count = -1; | |
} | |
// Om vi inte är på första varvet i loopen, lägg till | |
// posten till den nuvarande sidan | |
if ( ! is_null( $last_post ) ) | |
{ | |
$current_page['posts'][] = $last_post; | |
$current_count++; | |
} | |
// Om vi är klar med nuvarande sidan, spara undan den | |
if ( 0 === $current_count && isset( $current_page ) ) | |
{ | |
$current_page['last-letter'] = $last_initial; | |
// Bokstavsspannet är namnet på vår sida | |
$name = "{$current_page['first-letter']}-{$current_page['last-letter']}"; | |
$pages[ $name ] = $current_page; | |
} | |
// Kom ihåg nuvarande post och initial till nästa varv | |
$last_post = $post; | |
$last_initial = $initial; | |
} | |
// Eftersom loopen ligger "ett steg efter" måste vi lägga till | |
// den sista posten och den sista sidan efter vi loopat klart | |
$current_page['posts'][] = $last_post; | |
$current_page['last-letter'] = $last_initial; | |
$name = "{$current_page['first-letter']}-{$current_page['last-letter']}"; | |
$pages[ $name ] = $current_page; | |
// Skapa pagineringslänkarna utifrån tillagda sidor | |
$pagination_items = array(); | |
foreach ( $pages as $name => $page ) | |
{ | |
$pagination_items[ $name ] = array( | |
// Vad som ska stå i länken | |
'label' => $name, | |
// Länkens URL | |
'url' => add_query_arg( 'page', $name ), | |
); | |
} | |
// Spara undan sidor och pagineringlänkar i transient | |
$post_list = array( | |
'pages' => $pages, | |
'pagination_items' => $pagination_items, | |
); | |
set_transient( $transient_key, $post_list ); | |
} | |
// Hämta ut vald sida från frågesträngen | |
$selected_page = ''; | |
if ( isset( $_GET['page'] ) && strlen( $_GET['page'] ) > 0 ) | |
$selected_page = $_GET['page']; | |
// Finns verkligen den valda sidan? | |
if ( ! isset( $post_list['pages'][ $selected_page ] ) ) | |
{ | |
// Hämta ut den första sidan som "vald sida" | |
$keys = array_keys( $post_list['pages'] ); | |
$selected_page = $keys[0]; | |
} | |
// Hämta ut aktuella poster samt pagineringslänkarna | |
$posts = $post_list['pages'][ $selected_page ]['posts']; | |
$pagination_items = $post_list['pagination_items']; | |
// Generera HTML-markup för pagineringslistan, då vi skriver ut den | |
// två gånger (ovanför och nedanför posterna) | |
$pagination_markup = '<ul class="pagination">'; | |
foreach ( $pagination_items as $key => $item ) | |
{ | |
$current = ( $selected_page == $key ); | |
$pagination_markup .= '<li class="pagination-item' . ( $current ? ' current' : '' ) . '">'; | |
// Vi struntar i länken när vi skriver ut den valda sidan | |
if ( ! $current ) | |
$pagination_markup .= "<a href=\"{$item['url']}\">"; | |
$pagination_markup .= $item['label']; | |
if ( ! $current ) | |
$pagination_markup .= '</a>'; | |
$pagination_markup .= '</li>'; | |
} | |
$pagination_markup .= '</ul>'; | |
/** | |
* Vi är klara med alla förberedelser, nu skapar vi en sida! | |
*/ | |
get_header(); | |
// Vi skriver ut innehållet för den aktuella sidan först, | |
// detta har dock lite att göra med vårt ämne. | |
the_post(); | |
?> | |
<h1><?php the_title(); ?></h1> | |
<?php the_content(); ?> | |
<?php // Här kommer vår postlista ?> | |
<div class="posts"> | |
<?php | |
// Pagineringen | |
echo $pagination_markup; | |
?> | |
<ul class="post-list"> | |
<?php | |
// Skriv ut alla poster | |
foreach ( $posts as $post ) | |
{ | |
// Kallar på content-post.php i ditt tema, | |
// här är det upp till dig hur du vill skriva | |
// ut dina poster. | |
get_template_part( 'content', 'post' ); | |
} | |
?> | |
</ul> | |
<?php | |
// Pagineringen igen, för att göra det lätt för besökaren | |
echo $pagination_markup; | |
?> | |
</div> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment