Move all domain folders from src/AKSRT/{Domain} to src/{Domain}; remap
Composer PSR-4 "AKSRT\\": "src/"; update audit script + README + ADR
paths; remove dead tools/build-psr4-map.php (scanned deleted inc/classes).
96 lines
3.9 KiB
PHP
96 lines
3.9 KiB
PHP
<?php
|
|
/**
|
|
* In-article / topic TOC shell (zibll widget_ui_posts_navs parity).
|
|
*
|
|
* Shell matches the built-in single sidebar TOC so page-template.js can fill
|
|
* `.posts-nav-box.toc-widget > .toc-list` from `[data-nav]` headings.
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
namespace AKSRT\Widgets;
|
|
|
|
use AKSRT\Widgets\Traits\CommonWidgetFields;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
class WidgetPostsNavs extends \WP_Widget {
|
|
use CommonWidgetFields;
|
|
|
|
public function __construct() {
|
|
parent::__construct(
|
|
'aksrt_posts_navs',
|
|
esc_html__('AKSRT 文章目录树', 'aksrt'),
|
|
[
|
|
'description' => esc_html__('显示当前文章/帖子标题目录,非详情页不输出。标题超过 2 个才填充。', 'aksrt'),
|
|
'classname' => 'widget_aksrt_posts_navs',
|
|
]
|
|
);
|
|
}
|
|
|
|
public function widget($args, $instance): void {
|
|
if (!is_singular(['post', 'page'])) {
|
|
if (current_user_can('manage_options')) {
|
|
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
echo function_exists('aksrt_get_widget_null')
|
|
? aksrt_get_widget_null(__('目录树仅在文章页面显示', 'aksrt')) // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
: '<p class="widget-empty">' . esc_html__('目录树仅在详情页显示', 'aksrt') . '</p>';
|
|
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
}
|
|
return;
|
|
}
|
|
|
|
$title = sanitize_text_field((string) ($instance['title'] ?? __('文章目录', 'aksrt')));
|
|
$mini_title = sanitize_text_field((string) ($instance['mini_title'] ?? ''));
|
|
$affix = function_exists('aksrt_widget_affix_attrs') ? aksrt_widget_affix_attrs($instance) : ['class' => '', 'attr' => ''];
|
|
|
|
$data_title = $title;
|
|
if ($mini_title !== '') {
|
|
$data_title .= ($data_title !== '' ? ' · ' : '') . $mini_title;
|
|
}
|
|
if ($data_title === '') {
|
|
$data_title = __('文章目录', 'aksrt');
|
|
}
|
|
|
|
// Mirror aksrt-single-render built-in TOC shell so page-template.js binds.
|
|
$classes = 'zib-widget toc-widget posts-nav-box' . $affix['class'];
|
|
|
|
echo $args['before_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
printf(
|
|
'<div class="%s"%s data-title="%s" aria-label="%s">',
|
|
esc_attr($classes),
|
|
$affix['attr'],
|
|
esc_attr($data_title),
|
|
esc_attr($data_title)
|
|
);
|
|
echo '<h3 class="widget-title toc-widget__title">' . esc_html($data_title) . '</h3>';
|
|
echo '<ol class="toc-list"></ol>';
|
|
echo '</div>';
|
|
echo $args['after_widget']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
|
}
|
|
|
|
public function form($instance): void {
|
|
$title = (string) ($instance['title'] ?? __('文章目录', 'aksrt'));
|
|
$mini_title = (string) ($instance['mini_title'] ?? '');
|
|
?>
|
|
<p>
|
|
<label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php esc_html_e('标题:', 'aksrt'); ?></label>
|
|
<input class="widefat" type="text" id="<?php echo esc_attr($this->get_field_id('title')); ?>" name="<?php echo esc_attr($this->get_field_name('title')); ?>" value="<?php echo esc_attr($title); ?>">
|
|
</p>
|
|
<p>
|
|
<label for="<?php echo esc_attr($this->get_field_id('mini_title')); ?>"><?php esc_html_e('副标题:', 'aksrt'); ?></label>
|
|
<input class="widefat" type="text" id="<?php echo esc_attr($this->get_field_id('mini_title')); ?>" name="<?php echo esc_attr($this->get_field_name('mini_title')); ?>" value="<?php echo esc_attr($mini_title); ?>">
|
|
</p>
|
|
<p class="description"><?php esc_html_e('请添加到文章/帖子侧栏。正文标题 ≥3 个时由前端填充目录;无标题则自动移除。', 'aksrt'); ?></p>
|
|
<?php $this->render_common_form_section($instance); ?>
|
|
<?php
|
|
}
|
|
|
|
public function update($new_instance, $old_instance): array {
|
|
return $this->update_common_fields($new_instance, $old_instance, [
|
|
'title' => sanitize_text_field((string) ($new_instance['title'] ?? '')),
|
|
'mini_title' => sanitize_text_field((string) ($new_instance['mini_title'] ?? '')),
|
|
]);
|
|
}
|
|
}
|