Skip to content

Instantly share code, notes, and snippets.

@alisspers
Last active December 20, 2015 05:19
Show Gist options
  • Save alisspers/6077419 to your computer and use it in GitHub Desktop.
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
<?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' );
<?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