Перелінкування статей у 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; }
Параметри, що передаються функції
post_num
– кількість посилань, що будуть виведені. Типово 5.format
– Формат посилань, що виводяться. За промовчанням “{a}{title}{/a}”.tax
– Таксономія до якої відноситься запис. За замовчуваннямcategory
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
- Тепер усі аргументи передаються у першому параметрі функції, як масиву чи рядка.