is_filter_active() ) {
add_action( 'restrict_manage_posts', array( $this, 'render_hidden_input' ) );
}
if ( $this->is_filter_active() && $this->get_explanation() !== null ) {
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_explanation_assets' ) );
}
}
/**
* Adds the filter links to the view_edit screens to give the user a filter link.
*
* @return void
*/
public function add_filter_links() {
foreach ( $this->get_post_types() as $post_type ) {
add_filter( 'views_edit-' . $post_type, array( $this, 'add_filter_link' ) );
}
}
/**
* Enqueues the necessary assets to display a filter explanation.
*
* @return void
*/
public function enqueue_explanation_assets() {
$asset_manager = new WPSEO_Admin_Asset_Manager();
$asset_manager->enqueue_script( 'filter-explanation' );
$asset_manager->enqueue_style( 'filter-explanation' );
wp_localize_script(
WPSEO_Admin_Asset_Manager::PREFIX . 'filter-explanation',
'yoastFilterExplanation',
array( 'text' => $this->get_explanation() )
);
}
/**
* Adds a filter link to the views.
*
* @param array $views Array with the views.
*
* @return array Array of views including the added view.
*/
public function add_filter_link( array $views ) {
$views[ 'yoast_' . $this->get_query_val() ] = sprintf(
'%3$s (%4$s)',
esc_url( $this->get_filter_url() ),
( $this->is_filter_active() ) ? ' class="current" aria-current="page"' : '',
$this->get_label(),
$this->get_post_total()
);
return $views;
}
/**
* Returns a text explaining this filter. Null if no explanation is necessary.
*
* @return string|null The explanation or null.
*/
protected function get_explanation() {
return null;
}
/**
* Renders a hidden input to preserve this filter's state when using sub-filters.
*
* @return void
*/
public function render_hidden_input() {
echo '';
}
/**
* Returns an url to edit.php with post_type and this filter as the query arguments.
*
* @return string The url to activate this filter.
*/
protected function get_filter_url() {
$query_args = array(
self::FILTER_QUERY_ARG => $this->get_query_val(),
'post_type' => $this->get_current_post_type(),
);
return add_query_arg( $query_args, 'edit.php' );
}
/**
* Returns true when the filter is active.
*
* @return bool Whether or not the filter is active.
*/
protected function is_filter_active() {
return ( $this->is_supported_post_type( $this->get_current_post_type() )
&& filter_input( INPUT_GET, self::FILTER_QUERY_ARG ) === $this->get_query_val() );
}
/**
* Returns the current post type.
*
* @return string The current post type.
*/
protected function get_current_post_type() {
$filter_options = array(
'options' => array( 'default' => 'post' ),
);
return filter_input( INPUT_GET, 'post_type', FILTER_DEFAULT, $filter_options );
}
/**
* Returns the post types to which this filter should be added.
*
* @return array The post types to which this filter should be added.
*/
protected function get_post_types() {
return WPSEO_Post_Type::get_accessible_post_types();
}
/**
* Checks if the post type is supported.
*
* @param string $post_type Post type to check against.
*
* @return bool True when it is supported.
*/
protected function is_supported_post_type( $post_type ) {
return in_array( $post_type, $this->get_post_types(), true );
}
}