WP_List_Table::months_dropdown( string $post_type )

In this article

Displays a dropdown for filtering items in the list table by month.

Parameters

$post_typestringrequired
The post type.

Source

protected function months_dropdown( $post_type ) {
	global $wpdb, $wp_locale;

	/**
	 * Filters whether to remove the 'Months' drop-down from the post list table.
	 *
	 * @since 4.2.0
	 *
	 * @param bool   $disable   Whether to disable the drop-down. Default false.
	 * @param string $post_type The post type.
	 */
	if ( apply_filters( 'disable_months_dropdown', false, $post_type ) ) {
		return;
	}

	/**
	 * Filters whether to short-circuit performing the months dropdown query.
	 *
	 * @since 5.7.0
	 *
	 * @param object[]|false $months   'Months' drop-down results. Default false.
	 * @param string         $post_type The post type.
	 */
	$months = apply_filters( 'pre_months_dropdown_query', false, $post_type );

	if ( ! is_array( $months ) ) {
		$extra_checks = "AND post_status != 'auto-draft'";
		if ( ! isset( $_GET['post_status'] ) || 'trash' !== $_GET['post_status'] ) {
			$extra_checks .= " AND post_status != 'trash'";
		} elseif ( isset( $_GET['post_status'] ) ) {
			$extra_checks = $wpdb->prepare( ' AND post_status = %s', $_GET['post_status'] );
		}

		$months = $wpdb->get_results(
			$wpdb->prepare(
				"SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
				FROM $wpdb->posts
				WHERE post_type = %s
				$extra_checks
				ORDER BY post_date DESC",
				$post_type
			)
		);
	}

	/**
	 * Filters the 'Months' drop-down results.
	 *
	 * @since 3.7.0
	 *
	 * @param object[] $months    Array of the months drop-down query results.
	 * @param string   $post_type The post type.
	 */
	$months = apply_filters( 'months_dropdown_results', $months, $post_type );

	$month_count = count( $months );

	if ( ! $month_count || ( 1 === $month_count && 0 === (int) $months[0]->month ) ) {
		return;
	}

	$m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;
	?>
	<label for="filter-by-date" class="screen-reader-text"><?php echo get_post_type_object( $post_type )->labels->filter_by_date; ?></label>
	<select name="m" id="filter-by-date">
		<option<?php selected( $m, 0 ); ?> value="0"><?php _e( 'All dates' ); ?></option>
	<?php
	foreach ( $months as $arc_row ) {
		if ( 0 === (int) $arc_row->year ) {
			continue;
		}

		$month = zeroise( $arc_row->month, 2 );
		$year  = $arc_row->year;

		printf(
			"<option %s value='%s'>%s</option>\n",
			selected( $m, $year . $month, false ),
			esc_attr( $arc_row->year . $month ),
			/* translators: 1: Month name, 2: 4-digit year. */
			sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
		);
	}
	?>
	</select>
	<?php
}

Hooks

apply_filters( ‘disable_months_dropdown’, bool $disable, string $post_type )

Filters whether to remove the ‘Months’ drop-down from the post list table.

apply_filters( ‘months_dropdown_results’, object[] $months, string $post_type )

Filters the ‘Months’ drop-down results.

apply_filters( ‘pre_months_dropdown_query’, object[]|false $months, string $post_type )

Filters whether to short-circuit performing the months dropdown query.

Changelog

VersionDescription
3.1.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.