类文档

WP_Widget_Pages

💡 云策文档标注

概述

WP_Widget_Pages 是 WordPress 核心类,用于实现一个显示网站页面列表的小工具。它继承自 WP_Widget,提供页面列表的显示、设置表单和更新功能。

关键要点

  • 继承自 WP_Widget,用于创建页面列表小工具
  • 包含构造方法 __construct() 初始化小工具属性
  • widget() 方法输出页面列表内容,支持排序和排除设置
  • update() 方法处理小工具设置更新,包括标题、排序和排除项
  • form() 方法生成小工具后台设置表单
  • 使用 wp_list_pages() 函数生成页面列表,并应用 widget_pages_args 过滤器

代码示例

public function __construct() {
    $widget_ops = array(
        'classname'                   => 'widget_pages',
        'description'                 => __( 'A list of your site’s Pages.' ),
        'customize_selective_refresh' => true,
        'show_instance_in_rest'       => true,
    );
    parent::__construct( 'pages', __( 'Pages' ), $widget_ops );
}

注意事项

  • 小工具支持自定义刷新和 REST API 实例显示
  • 排序选项包括 post_title、menu_order 和 ID,默认 menu_order
  • 排除项通过 exclude 参数设置,支持页面 ID 列表
  • 输出格式支持 HTML5 和 XHTML,通过 navigation_widgets_format 过滤器控制

📄 原文内容

Core class used to implement a Pages widget.

Description

See also

Methods

Name Description
WP_Widget_Pages::__construct Sets up a new Pages widget instance.
WP_Widget_Pages::form Outputs the settings form for the Pages widget.
WP_Widget_Pages::update Handles updating settings for the current Pages widget instance.
WP_Widget_Pages::widget Outputs the content for the current Pages widget instance.

Source

class WP_Widget_Pages extends WP_Widget {

/**
* Sets up a new Pages widget instance.
*
* @since 2.8.0
*/

public function __construct() {
$widget_ops = array(
'classname' => 'widget_pages',
'description' => __( 'A list of your site’s Pages.' ),
'customize_selective_refresh' => true,
'show_instance_in_rest' => true,
);
parent::__construct( 'pages', __( 'Pages' ), $widget_ops );
}

/**
* Outputs the content for the current Pages widget instance.
*
* @since 2.8.0
*
* @param array $args Display arguments including 'before_title', 'after_title',
* 'before_widget', and 'after_widget'.
* @param array $instance Settings for the current Pages widget instance.
*/

public function widget( $args, $instance ) {
$default_title = __( 'Pages' );
$title = ! empty( $instance['title'] ) ? $instance['title'] : $default_title;

/**
* Filters the widget title.
*
* @since 2.6.0
*
* @param string $title The widget title. Default 'Pages'.
* @param array $instance Array of settings for the current widget.
* @param mixed $id_base The widget ID.
*/

$title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

$sortby = empty( $instance['sortby'] ) ? 'menu_order' : $instance['sortby'];
$exclude = empty( $instance['exclude'] ) ? '' : $instance['exclude'];

if ( 'menu_order' === $sortby ) {
$sortby = 'menu_order, post_title';
}

$output = wp_list_pages(
/**
* Filters the arguments for the Pages widget.
*
* @since 2.8.0
* @since 4.9.0 Added the `$instance` parameter.
*
* @see wp_list_pages()
*
* @param array $args An array of arguments to retrieve the pages list.
* @param array $instance Array of settings for the current widget.
*/

apply_filters(
'widget_pages_args',
array(
'title_li' => '',
'echo' => 0,
'sort_column' => $sortby,
'exclude' => $exclude,
),
$instance
)
);

if ( ! empty( $output ) ) {
echo $args['before_widget'];
if ( $title ) {
echo $args['before_title'] . $title . $args['after_title'];
}

$format = current_theme_supports( 'html5', 'navigation-widgets' ) ? 'html5' : 'xhtml';

/** This filter is documented in wp-includes/widgets/class-wp-nav-menu-widget.php */
$format = apply_filters( 'navigation_widgets_format', $format );

if ( 'html5' === $format ) {
// The title may be filtered: Strip out HTML and make sure the aria-label is never empty.
$title = trim( strip_tags( $title ) );
$aria_label = $title ? $title : $default_title;
echo '<nav aria-label="' . esc_attr( $aria_label ) . '">';
}
?>

<ul>

</ul>

';
}

echo $args['after_widget'];
}
}

/**
* Handles updating settings for the current Pages widget instance.
*
* @since 2.8.0
*
* @param array $new_instance New settings for this instance as input by the user via
* WP_Widget::form().
* @param array $old_instance Old settings for this instance.
* @return array Updated settings to save.
*/
public function update( $new_instance, $old_instance ) {
$instance = $old_instance;
$instance['title'] = sanitize_text_field( $new_instance['title'] );
if ( in_array( $new_instance['
sortby'], array( 'post_title', 'menu_order', 'ID' ), true ) ) {
$instance['
sortby'] = $new_instance['sortby'];
} else {
$instance['
sortby'] = 'menu_order';
}

$instance['exclude'] = sanitize_text_field( $new_instance['exclude'] );

return $instance;
}

/**
* Outputs the settings form for the Pages widget.
*
* @since 2.8.0
*
* @param array $instance Current settings.
*/
public function form( $instance ) {
// Defaults.
$instance = wp_parse_args(
(array) $instance,
array(
'sortby' => 'post_title',
'
title' => '',
'
exclude' => '',
)
);
?>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( '
title' ) ); ?>"></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( '
title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $instance['title'] ); ?>" />
</p>

<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'sortby' ) ); ?>"></label>
<select name="<?php echo esc_attr( $this->get_field_name( '
sortby' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'sortby' ) ); ?>" class="widefat">
<option value="post_title"<?php selected( $instance['
sortby'], 'post_title' ); ?>></option>
<option value="menu_order"<?php selected( $instance['
sortby'], 'menu_order' ); ?>></option>
<option value="ID"<?php selected( $instance['
sortby'], 'ID' ); ?>></option>
</select>
</p>

<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'exclude' ) ); ?>"></label>
<input type="text" value="<?php echo esc_attr( $instance['
exclude'] ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'exclude' ) ); ?>" id="<?php echo esc_attr( $this->get_field_id( 'exclude' ) ); ?>" class="widefat" />
<br />
<small></small>
</p>
</pre><p class="wporg-dot-link-list"><a href="https://developer.wordpress.org/reference/files/wp-includes/widgets/class-wp-widget-pages.php/">View all references</a> <a href="https://core.trac.wordpress.org/browser/tags/6.9.4/src/wp-includes/widgets/class-wp-widget-pages.php#L17">View on Trac</a> <a href="https://github.com/WordPress/wordpress-develop/blob/6.9.4/src/wp-includes/widgets/class-wp-widget-pages.php#L17-L185">View on GitHub</a></p></section>

<section class="wp-block-wporg-code-reference-related" data-nosnippet="true"><h2 id="related" class="is-toc-heading wp-block-heading has-heading-5-font-size" tabindex="-1" ><a href="#related">Related</a></h2> <section style="margin-top:var(--wp--preset--spacing--20)" class="wp-block-wporg-code-table" id="uses"><figure class="wp-block-table "><table><thead><tr><th scope="col">Uses</th><th scope="col">Description</th></tr></thead><tbody><tr class=""><td><a href="https://developer.wordpress.org/reference/classes/wp_widget/">WP_Widget</a><code>wp-includes/class-wp-widget.php

Core base class extended to register widgets.

Changelog

Version Description
2.8.0 Introduced.