*/
namespace RankMath\Admin;
use RankMath\Helper;
use RankMath\Runner;
use RankMath\Traits\Hooker;
use MyThemeShop\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Post_Filters class.
*/
class Post_Filters implements Runner {
use Hooker;
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'admin_init', 'init' );
}
/**
* Intialize.
*/
public function init() {
if ( ! Helper::has_cap( 'general' ) ) {
return;
}
$this->filter( 'pre_get_posts', 'posts_by_seo_filters' );
$this->filter( 'parse_query', 'filter_by_focus_keywords' );
$this->filter( 'restrict_manage_posts', 'add_seo_filter', 11 );
foreach ( Helper::get_allowed_post_types() as $post_type ) {
$this->filter( "views_edit-$post_type", 'add_pillar_content_filter_link' );
}
}
/**
* Filter posts in admin by Rank Math's Filter value.
*
* @param \WP_Query $query The wp_query instance.
*/
public function posts_by_seo_filters( $query ) {
if ( ! $this->can_seo_filters() ) {
return;
}
if ( 'rank_math_seo_score' === $query->get( 'orderby' ) ) {
$query->set( 'orderby', 'meta_value' );
$query->set( 'meta_key', 'rank_math_seo_score' );
$query->set( 'meta_type', 'numeric' );
}
if ( empty( $_GET['pillar_content'] ) && empty( $_GET['seo-filter'] ) ) {
return;
}
$meta_query = [];
// Check for Pillar Content filter.
if ( ! empty( $_GET['pillar_content'] ) ) {
$meta_query[] = [
'key' => 'rank_math_pillar_content',
'value' => 'on',
];
}
$this->set_seo_filters( $meta_query );
$query->set( 'meta_query', $meta_query );
}
/**
* Filter post in admin by Pillar Content.
*
* @param \WP_Query $query The wp_query instance.
*/
public function filter_by_focus_keywords( $query ) {
if ( ! $this->can_fk_filter() ) {
return;
}
$query->set( 'post_status', 'publish' );
if ( $ids = $this->fk_in_title() ) { // phpcs:ignore
$query->set( 'post__in', $ids );
return;
}
$focus_keyword = Param::get( 'focus_keyword', '' );
if ( 1 === absint( $focus_keyword ) ) {
$query->set(
'meta_query',
[
'relation' => 'AND',
[
'key' => 'rank_math_focus_keyword',
'compare' => 'NOT EXISTS',
],
[
'relation' => 'OR',
[
'key' => 'rank_math_robots',
'value' => 'noindex',
'compare' => 'NOT LIKE',
],
[
'key' => 'rank_math_robots',
'compare' => 'NOT EXISTS',
],
],
]
);
return;
}
$query->set( 'post_type', 'any' );
$query->set(
'meta_query',
[
[
'relation' => 'OR',
[
'key' => 'rank_math_focus_keyword',
'value' => $focus_keyword,
'compare' => 'LIKE',
],
[
'key' => 'rank_math_focus_keyword',
'value' => $focus_keyword . ',',
'compare' => 'LIKE',
],
],
]
);
}
/**
* Add columns for SEO title, description and focus keywords.
*/
public function add_seo_filter() {
global $post_type;
if ( 'attachment' === $post_type || ! in_array( $post_type, Helper::get_allowed_post_types(), true ) ) {
return;
}
$options = [
'' => esc_html__( 'All Posts', 'rank-math' ),
'great-seo' => esc_html__( 'SEO Score: Great', 'rank-math' ),
'good-seo' => esc_html__( 'SEO Score: Good', 'rank-math' ),
'bad-seo' => esc_html__( 'SEO Score: Bad', 'rank-math' ),
'empty-fk' => esc_html__( 'Focus Keyword Not Set', 'rank-math' ),
'noindexed' => esc_html__( 'Articles noindexed', 'rank-math' ),
];
$selected = Param::get( 'seo-filter' );
?>
$typenow,
'fields' => 'ids',
'posts_per_page' => -1,
'meta_key' => 'rank_math_pillar_content',
'meta_value' => 'on',
]);
$views['pillar_content'] = sprintf(
'%3$s (%4$s)',
add_query_arg([
'post_type' => $typenow,
'pillar_content' => 1,
]),
$current,
esc_html__( 'Pillar Content', 'rank-math' ),
number_format_i18n( count( $pillars ) )
);
return $views;
}
/**
* Can apply seo filters.
*
* @return bool
*/
private function can_seo_filters() {
$screen = get_current_screen();
if (
is_null( $screen ) ||
'edit' !== $screen->base ||
! in_array( $screen->post_type, Helper::get_allowed_post_types(), true )
) {
return false;
}
return true;
}
/**
* Set SEO filters meta query.
*
* @param array $query Meta query.
*/
private function set_seo_filters( &$query ) {
$filter = Param::get( 'seo-filter' );
if ( false === $filter ) {
return;
}
$hash = [
'empty-fk' => [
'key' => 'rank_math_focus_keyword',
'compare' => 'NOT EXISTS',
],
'bad-seo' => [
'key' => 'rank_math_seo_score',
'value' => 50,
'compare' => '<=',
'type' => 'numeric',
],
'good-seo' => [
'key' => 'rank_math_seo_score',
'value' => [ 51, 80 ],
'compare' => 'BETWEEN',
],
'great-seo' => [
'key' => 'rank_math_seo_score',
'value' => 80,
'compare' => '>',
],
'noindexed' => [
'key' => 'rank_math_robots',
'value' => 'noindex',
'compare' => 'LIKE',
],
];
if ( isset( $hash[ $filter ] ) ) {
$query[] = $hash[ $filter ];
}
}
/**
* Can apply Focus Keyword filter.
*
* @return bool
*/
private function can_fk_filter() {
$screen = get_current_screen();
if ( is_null( $screen ) || 'edit' !== $screen->base || ( ! isset( $_GET['focus_keyword'] ) && ! isset( $_GET['fk_in_title'] ) ) ) {
return false;
}
return true;
}
/**
* Check if Focus Keyword is in title.
*
* @return bool|array
*/
private function fk_in_title() {
global $wpdb;
$fk_in_title = Param::get( 'fk_in_title' );
if ( ! $fk_in_title ) {
return false;
}
$meta_query = new \WP_Meta_Query([
[
'key' => 'rank_math_focus_keyword',
'compare' => 'EXISTS',
],
[
'relation' => 'OR',
[
'key' => 'rank_math_robots',
'value' => 'noindex',
'compare' => 'NOT LIKE',
],
[
'key' => 'rank_math_robots',
'compare' => 'NOT EXISTS',
],
],
]);
$screen = get_current_screen();
$mq_sql = $meta_query->get_sql( 'post', $wpdb->posts, 'ID' );
return $wpdb->get_col( "SELECT {$wpdb->posts}.ID FROM $wpdb->posts {$mq_sql['join']} WHERE 1=1 {$mq_sql['where']} AND {$wpdb->posts}.post_type = '$screen->post_type' AND ({$wpdb->posts}.post_status = 'publish') AND {$wpdb->posts}.post_title NOT REGEXP REPLACE({$wpdb->postmeta}.meta_value, ',', '|')" ); // phpcs:ignore
}
}