Sortowanie wpisów wg kategorii

W związku z tym, że ostatnio dużo programuje w WordPressie, postanowiłem dzielić się z Wami artykułami pt. „Rozwijamy WordPressa”. Będzie to cykl unikalnych artykułów (rozwiązań), które wdrażam w swoich projektach, a mogą się przydać każdemu z Was.

Sortowanie a inne wtyczki

Sortowanie wpisów z osobna dla każdej kategorii nie jest czymś nowym, jednak sam się zdziwiłem, że w repozytorium WordPress.org nie ma takiej wtyczki. Znalazłem kilka wtyczek, które pozwalały na sortowanie wpisów, jednak nie sortowały wg kategorii a na dodatek zawierały błędy.

Pierwszy błąd to sortowanie wg pola „menu_order”, które znajduje się w tabeli posts. Sortując wg tego pola nie mamy możliwości posortowania wpisów z osobna dla każdej kategorii. Drugi błąd, to filtr, który sortował wpisy globalnie, co powodowało, że „Najnowsze wpisy” były również posortowane wg pola „menu_order”.

Postanowiłem zatem napisać własną wtyczkę do sortowania wpisów, która pozwoli na wyświetlanie ich w różnej kolejności dla każdej kategorii z osobna.

Nie będę wklejał całego kodu wtyczki, gdyż nie ma to sensu, a jedynie wyjaśnię sposób implementacji dla custom queries w szablonie category.php.

Aktywacja wtyczki

Po aktywacji wtyczki przechodzimy do kategorii wpisów. Po najechaniu na daną kategorię widzimy link „Sortuj”. Po kliknięciu w Sortuj WordPress przenosi nas na stronę sortowania wpisów.

sortowanie wpisów z osobna dla kategorii

Poniżej przedstawiam przykładową listę wpisów, która została już posortowana. Sortowanie odbywa się na zasadzie drag and drop – oczywiście dzięki jquery sortable. Jeżeli wpisy nie zostały jeszcze posortowane nie będzie cyfry w nawiasie kwadratowym. Oczywiście mamy również możliwość usunięcia sortowania.

sortowanie wpisów z osobna dla kategorii

Wyniki sortowania zapisywane są jako metadane wpisów, gdzie nazwa to sort_id-taksonomii (sort_176) a wartość to liczba.

Jeżeli sortowanie zostało zapisane możemy przejść do naszej kategorii i zobaczyć efekty 🙂

Implementacja sortowania dla custom query

Implementacja w szablonie wygląda trochę skomplikowanie, jednak postaram się opisać to dokładnie. Sortowanie wpisów wg kategorii, możemy przetestować na szablonie category.php o ile taki plik istnieje w naszym motywie. Jeżeli nie istnieje należy go utworzyć.

Przed wprowadzaniem jakichkolwiek zmian zalecam zrobienie kopii pliku category.php. W pierwszej kolejności musimy pobrać ID taksonomii, a następnie utworzyć własne WP_Query.

Tak wygląda przykładowy kod zaimplementowany w moim szablonie:

	$cat_ID = get_query_var( 'cat' );
	$category = get_category( $cat_ID );
	$posts_per_page = 30;
	$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
	$args = array( 
		'posts_per_page' => $posts_per_page,
		'paged' => $paged,
		'meta_key' => 'sort_'.$category->term_id,
		'meta_type' => 'NUMERIC',
		'orderby' => 'meta_value',
		'order' => 'ASC',
		'meta_query' => array(
			'relation' => 'OR',
			array(
				'key' => 'sort_'.$category->term_id,
				'compare' => 'NOT EXISTS'
			)
		)
	);
	$query = new WP_Query( $args );
	<?php if( $query->have_posts() ): ?>
		<?php while ( $query->have_posts() ) : $query->the_post(); ?>
			<h3><?php the_title(); ?></h3>
			<div><?php the_content(); ?></div>
		<?php endwhile; ?>
	<?php else: ?>
		<?php _e('No posts'); ?>
	<?php endif; ?>

Do argumentów dodajemy sortowanie wg meta_value oraz definiujemy meta_type. Wartość numeric dla argumentu meta_type pozwala na numeryczne sortowanie. Domyślnie pole meta_value jest typu text, dlatego bez tej opcji nie byłoby możliwe sortowanie. Dodatkowo dodaliśmy meta_query, które również jest istotne, gdyż pozwala na wybranie wpisów, które nie zawierają zdefiniowanego sortowania.

Mam nadzieję, że komuś przyda się moja wtyczka, jest lekka i skuteczna. W razie problemów proszę pisać w komentarzach.

Pobierz wtyczkę

You may also like...