Перелінкування статей у WordPress (попередні записи з категорії)

Це продовження посту про перелінування статей.

У цій статті я хочу поділитися черговою функцією для WordPress, завдання, до якої входить виведення попередніх записів з категорії (рубрики), поточної статті. Функція, як і, створює кільцеву перелінковку ( див. першу статтю ).

Принципова відмінність цієї функції в тому, що вона виводить попередні записи з категорії, тоді як минула подібна функція виводить просто попередні записи.

Альтернатива цієї функції знаходиться за цим посиланням , в ній можна вказати таксономію та тип запису, для яких відбуватиметься перелінкування.

Майже таку ж функцію я публікував у коментарях на сайті Dimox.name тут . Чому “майже”? Тому що ця функція має низку переваг над тією, що була опублікована на Dimox.name, а саме:

  1. Можна задавати формат виводу, завдяки чому її просто впровадити в будь-який шаблон;

  2. Для цієї функції не потрібно наперед визначати поточну категорію (функція сама визначить її), тобто. менше зайвого коду в шаблоні та простіше новачкам.

  3. Функція не використовує важку функцію WordPress get_posts()

  4. До кожного тегу посилання додається класи li1 та li2 , щоб легко можна було розфарбувати список у зебру.

  5. Можна увімкнути кешування. Докладніше про це нижче.

  6. Список сортується за датою, а чи не за ID, тобто. якщо запис був опублікований заднім числом він буде виводиться як слід.

Використання функції

А ось, власне, і код, який потрібно помістити у файл шаблону functions.php .

/**
 * Попередні записи з рубрики (щодо поточного запису) + кільцева перелінковка
 * Параметри передані функції. У дужках вказано дефолтне значення.
 *
 * @param int $post_num (5) Кількість посилань.
 * @param string $format ('') Формат вводу: `{thumb} {date:jMY} - {a}{title}{/a} ({comments})`.
 * @param string $cache ('') Увімкнути кеш (за замовчуванням вимкнено). Пишемо 1, щоб увімкнути.
 * @param string $list_tag (li) Тег списку.
 * @param string $post_type (post) Тип запису з яким працюємо.
 * @param bool $echo (true) Виводити на екран або повертати для обробки (false).
 *
 * @version 1.1
 */
function kama_previous_posts_from_cat( $args ){
	Global $post, $wpdb;

	$args = (object) wp_parse_args( $args, [
		'post_num' => 5,
		'format' => '',
		'cache' => true,
		'list_tag' => 'li',
		'post_type' => 'post',
		'echo' => true,
	]);

	$cache_key = md5( __FUNCTION__ . $post->ID );
	$cache_flag = __FUNCTION__;

	if( $args->cache && $cache_out = wp_cache_get( $cache_key, $cache_flag ) ){
		if( $args->echo ){
			return print ($ cache_out);
		}

		return $cache_out;
	}

	$cat = get_the_category( $post->ID );
	$cat_id = (int) $cat[0]->term_id;

	$sql_SELECT = "SELECT ID, post_title, post_date, comment_count, guid
	FROM $wpdb->posts p
		LEFT JOIN $wpdb->term_relationships rel ON (p.ID = rel.object_id)
		LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id)";

	$same_AND = $wpdb->prepare(
		"AND tax.term_id = %s AND tax.taxonomy = 'category' AND p.post_status = 'publish' AND p.post_type = %s",
		$cat_id, $args->post_type
	);

	// пробуємо отримати попередні записи
	$sql = "$sql_SELECT WHERE p.ID < $post->ID $same_AND ORDER BY p.post_date DESC LIMIT " . (int) $args->post_num;

	$res = $wpdb->get_results( $sql );

	$ count_res = count ($ res);

	// якщо кількість менша за потрібну, робимо 2-й запит
	if( ! $res || $count_res < $args->post_num ){
		$exclude = array_merge( [ $post->ID ], wp_list_pluck( $res, 'ID' ) );
		$exclude = implode(',', array_map('intval', $exclude));

		$post_num = (int) $args->post_num - $ count_res;

		$sql = "$sql_SELECT WHERE p.ID NOT IN ($exclude) AND p.ID != {$post->ID} $same_AND
		ORDER BY p.post_date DESC LIMIT". (int) $post_num;

		$res2 = $wpdb->get_results( $sql );

		$ Res = array_merge ($ Res, $ Res2);
	}

	if( ! $res ){
		return false;
	}

	// output

	if( $args->format ){
		preg_match( '!{date:(.*?)}!', $args->format, $date_m );
	}

	$add_thumb = ( false !== strpos( $args->format, '{thumb}' ) );

	$out = $x = '';
	foreach( $res as $pst ){
		$x = ($ x === 'li1')? 'li2': 'li1';
		$a1 = '<a href="' . get_permalink( $pst->ID ) . '" title="' . esc_attr( $pst->post_title ) . '">';
		$a2 = "</a>";

		if( $args->format ){
			$date = apply_filters( 'the_time', mysql2date( $date_m[1], $pst->post_date ) );
			$com_count = $pst->comment_count?: '';

			$formated = strtr( $args->format, [
				$date_m[0] => $date,
				'{title}' => esc_html( $pst->post_title ),
				'{a}' => $a1,
				'{/a}' => $a2,
				'{comments}' => $com_count,
			]);

			// є мініатюра
			if( isset( $add_thumb ) ){
				$thumb = get_the_post_thumbnail( $pst->ID, 'thumbnail');
				$formated = str_replace( '{thumb}', $thumb, $formated );
			}
		}
		else {
			$formated = $a1 . esc_html($pst->post_title). $a2;
		}

		$out .= apply_filters( 'kama_previous_posts_from_cat__append_out',
			"n<$args->list_tag class="$x">$formated</$args->list_tag>",
			$args, $formated, $x, $pst
		);
	}

	if( $args->cache ){
		wp_cache_add ($ cache_key, $ out, $ cache_flag);
	}

	if( $args->echo ){
		return print $out;
	}

	return $out;
}

Після того, як код, успішно, скопійований у файл теми functions.php , там де ми хочемо вивести попередні записи з поточної категорії викликаємо функцію так:

<ul>
	<?php kama_previous_posts_from_cat('post_num=5'); ?>
</ul>

Ось, власне, і все, що потрібно зробити для використання функції.

Важливо! Виклик працюватиме коректно тільки у файлі теми, що відповідає за виведення постів, зазвичай це single.php .

Розширене використання

Для налаштування формату виводу використовуйте

У форматі format можна використовувати такі шорткоди:

  • {thumb} – мініатюра запису (вона має бути встановлена ​​для запису);
  • {comments} – покаже кількість коментарів у статті;
  • {title} – заголовок статті;
  • {date:jMY} – дата у форматі jMY (11.квіт.2010);
  • {a} та {/a} – тег посилання. Відкривається та закривається.

Виклик буде таким:

<ul>
<?php
kama_previous_posts_from_cat(array(
	'post_num' => 5,
	'format' => '{a}{title}{/a} ? {date:jMY} // {comments}',
)));
?>
</ul>
// виведе список у форматі - <li class='li1'><a href='http://посилання' title='Заголовок статті'>Заголовок статті</a> ? дата // кількість коментарів</li>
Використання кешу

За замовчуванням кешування включено, але користь від використання можна буде відчути, якщо функція викликається кілька разів або якщо включений плагін об’єктного кешування: WP File Cache , SJ Object Cache та інші…

Тег списку

Можна змінити тег списку li на будь-який інший, наприкладdiv

<?php kama_previous_posts_from_cat('post_num=5&list_tag=div'); ?>

// виведе 5 посилань у форматі - <div class='li1'><a href='http://посилання' title='Заголовок статті'>Заголовок статті</a></div> .

Зміни

Версія 1.0.

  • Додав шорткод {thumb}до параметраformat
  • Тепер усі аргументи передаються у першому параметрі функції, як масиву чи рядка.

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *