| Server IP : 3.147.158.171 / Your IP : 216.73.216.216 Web Server : Apache/2.4.67 (Amazon Linux) OpenSSL/3.5.5 System : Linux ip-172-31-2-178.us-east-2.compute.internal 6.1.172-216.329.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Wed May 20 06:31:34 UTC 2026 x86_64 User : ec2-user ( 1000) PHP Version : 8.4.21 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /tsai/repo/sites/dev/wp-content/plugins/tsai-plugin/includes/ |
Upload File : |
<?php
if (!defined('ABSPATH')) {
exit;
}
class TSAI_Series_Nav {
public function __construct() {
add_shortcode('tsai_series_nav', array($this, 'render'));
add_action('wp_enqueue_scripts', array($this, 'enqueue_assets'));
}
public function enqueue_assets() {
if (!is_singular('post')) {
return;
}
wp_enqueue_style(
'tsai-series-nav',
TSAI_PLUGIN_URL . 'assets/css/tsai-series-nav.css',
array(),
'1.0.0'
);
}
public function render($atts = array()) {
$post_id = get_the_ID();
if (!$post_id) {
return '';
}
$terms = wp_get_post_terms($post_id, 'article_series');
if (is_wp_error($terms) || empty($terms)) {
return '';
}
$series_term = $terms[0];
$current_part = (int) get_post_meta($post_id, '_series_part_number', true);
$series_posts = get_posts(array(
'post_type' => 'post',
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'article_series',
'terms' => $series_term->term_id,
),
),
'meta_key' => '_series_part_number',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'posts_per_page' => -1,
));
if (empty($series_posts)) {
return '';
}
$total = count($series_posts);
$series_name = esc_html($series_term->name);
$prefix_pattern = '/^' . preg_quote($series_term->name, '/') . ',\s*Part\s+\d+:\s*/';
$items = '';
foreach ($series_posts as $sp) {
$part_num = (int) get_post_meta($sp->ID, '_series_part_number', true);
$title = get_the_title($sp->ID);
$title = preg_replace($prefix_pattern, '', $title);
$title = esc_html($title);
$num = esc_html($part_num);
if ($sp->ID === $post_id) {
$items .= '<li class="tsai-series-nav__item is-current" aria-current="page">'
. '<span class="tsai-series-nav__link">'
. '<span class="tsai-series-nav__part-num">' . $num . '</span>'
. '<span class="tsai-series-nav__part-title">' . $title . '</span>'
. '</span></li>';
} else {
$url = esc_url(get_permalink($sp->ID));
$items .= '<li class="tsai-series-nav__item">'
. '<a href="' . $url . '" class="tsai-series-nav__link">'
. '<span class="tsai-series-nav__part-num">' . $num . '</span>'
. '<span class="tsai-series-nav__part-title">' . $title . '</span>'
. '</a></li>';
}
}
return '<nav class="tsai-series-nav" aria-label="Article series navigation">'
. '<div class="tsai-series-nav__header">'
. '<div class="tsai-series-nav__title">' . $series_name . '</div>'
. '<div class="tsai-series-nav__subtitle">Part ' . esc_html($current_part) . ' of ' . esc_html($total) . '</div>'
. '</div>'
. '<ol class="tsai-series-nav__list">' . $items . '</ol>'
. '</nav>';
}
}
new TSAI_Series_Nav();