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

Хочу поділитися доопрацюванням своєї функції для кільцевої перелінкування статей у WordPress . Перший варіант функції загалом ні чим не поступається цьому, різниця лише в тому, що за допомогою цього варіанта функції ви зможете вказати з якою таксономією працювати і який тип запису вас цікавить. Минула функція працює лише зі стандартними категоріями WordPress та постами, тобто. з таксономією categoryта типом записів post.

Ця функція повністю замінює минулу. Поштовхом для її створення стало прохання одного з читачів цього блогу, зробити функцію для кільцевої перелінковки, для кастомних (довільних) сторінок, які були передбачені на сайті. Таксономія також була створена нова. Не довго думаючи я переробив минулу функцію, змінивши там принцип отримання таксономії: якщо раніше категорія(и), в якій знаходиться запис, виходила стандартними функціями WordPress, то тепер таксономія до якої відноситься запис виходить прямий з бази даних, такий підхід начебто більш логічний і швидкий (не перевіряв).

Той хто просив цю функцію навіть віддячив мені 10 умовними одиницями на мій гаманець WebMoney, що звичайно приємно, спс йому, сподіваюся він не проти, що я викладаю цю функцію в паблік.

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

/**
 * Попередні записи з рубрики (щодо поточного запису) +
 * кільцева перелінковка (можна вказувати таксономію та тип запису).
 *
 * Кешує результат в об'єктний кеш, якщо він увімкнений.
 *
 * Викликаємо функцію так:
 *
 * echo kama_previous_posts_from_tax_lis([
 * 'post_num' => 5,
 * 'format' => '{date:jMY} - {a}{title}{/a}',
 *]));
 *
 * @param array|string $args {
 * Parameters passed as array or query string.
 *
 * @type int $post_num Кількість посилань.
 * @type string $format {thumb} {date:jMY} - {a}{title}{/a} ({comments})
 * @type string $list_tag Тег-обгортка кожного посилання.
 * @type string $tax Таксономія. ін category.
 * @type string $post_type Тип запису. пр. post.
 * }
 *
 * @version 1.2
 */
function kama_previous_posts_from_tax_lis( $args = array() ){
	Global $post, $wpdb;

	$rg = (object) wp_parse_args( $args, [
		'post_num' => 5,
		'format' => '',
		'list_tag' => 'li',
		'tax' => 'category',
		'post_type' => 'post',
	]);

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

		if( $cache_out = wp_cache_get( $cache_key, $cache_flag ) ){
			return $cache_out;
		}
	}

	$SELECT = "ID 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)";

	$WHERE = $wpdb->prepare( 'WHERE p.post_date < %s', $post->post_date );

	$sub_query_tax_id = $wpdb->prepare(
		"SELECT term_id FROM $wpdb->term_relationships rl
			LEFT JOIN $wpdb->term_taxonomy tx ON (rl.term_taxonomy_id = tx.term_taxonomy_id)
			WHERE object_id = %d AND tx.taxonomy = %s
			LIMIT 1",
		$post->ID, $rg->tax
	);

	$AND = $wpdb->prepare("
		AND tax.term_id = ($sub_query_tax_id) AND tax.taxonomy = %s
		AND p.post_status = 'publish'
		AND p.post_type = %s ORDER BY p.post_date DESC",
		$rg->tax, $rg->post_type
	);

	$LIMIT = 'LIMIT'. (int) $rg->post_num;
	$sql = "$SELECT $WHERE $AND $LIMIT";

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

	$ count_res = count ($ res);

	// якщо кількість менше потрібного, робимо 2-й запит (кільцева перелінковка)
	if( ! $res || $count_res < $rg->post_num ){
		$NOT_IN = $post->ID;
		foreach( $res as $id ){
			$NOT_IN .= ",$id->ID";
		}
		$sql = "$SELECT WHERE p.ID NOT IN ($NOT_IN) $AND LIMIT " . (int) ($ rg->post_num - $ count_res);

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

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

	if( ! $res ){
		return '';
	}

	// Висновок
	if( $rg->format ){
		preg_match('!{date:(.*?)}!', $rg->format, $date_m);
	}

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

	$out = '';
	foreach( $res as $pst ){
		$x = ( @ $ x === 'li1') ? 'li2': 'li1';

		$a = '<a href="' . get_permalink( $pst->ID ) . '" title="' . esc_attr( $pst->post_title ) . '">';

		if( $rg->format ){
			$formated = strtr( $rg->format, [
				'{title}' => esc_html( $pst->post_title ),
				'{a}' => $a,
				'{/a}' => '</a>',
				'{comments}' => $pst->comment_count ?: '',
				'{thumb}' => $add_thumb ? str_replace( '{thumb}', get_the_post_thumbnail( $pst->ID, 'thumbnail' ), $formated ) : '',
			]);

			// є дата
			if($date_m) {
				$formated = str_replace( $date_m[0], apply_filters( 'the_time', mysql2date( $date_m[1], $pst->post_date ) ), $formated );
			}
		}
		else {
			$formated = $a. esc_html($pst->post_title). '</a>';
		}

		$out .= "t<li class="$x">$formated</li>n";
	}

	if( wp_using_ext_object_cache() ){
		wp_cache_add ($ cache_key, $ out, $ cache_flag);
	}

	return $out;
}

Параметри, що передаються функції

  1. post_num– кількість посилань, що будуть виведені. Типово 5.
  2. format– Формат посилань, що виводяться. За промовчанням “{a}{title}{/a}”.
  3. tax– Таксономія до якої відноситься запис. За замовчуваннямcategory


  4. post_type– тип записів для якого відбуватиметься перелінковка. За замовчуванням post.

Декілька прикладів використання

#1. Виведемо 10 попередніх посилань із категорії, для звичайних записів WordPress:

<?php echo kama_previous_posts_from_tax('post_num=10'); ?>

#2. Приклад передачі параметрів та вказівки формату

Виведемо 6 попередніх посилань, для записів із таксономії movies, тип запису яких дорівнює movie. Також у форматі виводу додамо дату публікації запису та мініатюру:

<?php
echo kama_previous_posts_from_tax( array(
	'post_num' => 6,
	'format' => '{thumb} {a}{title}{/a} - {date:jMY}',
	'tax' => 'movies',
	'post_type' => 'movie',
);
?>

Весь список параметрів та шорткоди для параметра format дивіться у коді функції (на самому початку).

Зміни

Версія 1.0.

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

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

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