geminilabs

[site-reviews] Add ListTable filters for categories and assigned posts

May 4th, 2021
671
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * @return bool
  3.  */
  4. function glsr_check_listtable_filter_permissions(\WP_Query $query) {
  5.     global $pagenow;
  6.     return glsr()->isAdmin()
  7.         && $query->is_main_query()
  8.         && $query->get('post_type') === glsr()->post_type
  9.         && 'edit.php' === $pagenow;
  10. }
  11.  
  12. /**
  13.  * @param array $args
  14.  * @return string|void
  15.  */
  16. function glsr_get_assigned_listtable_filter($args = []) {
  17.     $args = shortcode_atts([
  18.         'id' => '',
  19.         'label' => '',
  20.         'options' => [],
  21.         'placeholder' => '',
  22.     ], $args);
  23.     if (4 === count(array_filter($args))) {
  24.         $label = glsr('Modules\Html\Builder')->label([
  25.             'class' => 'screen-reader-text',
  26.             'for' => $args['id'],
  27.             'text' => $args['label'],
  28.         ]);
  29.         $filter = glsr('Modules\Html\Builder')->select([
  30.             'name' => $args['id'],
  31.             'options' => $args['options'],
  32.             'placeholder' => $args['placeholder'],
  33.             'style' => 'max-width:150px;',
  34.             'value' => filter_input(INPUT_GET, $args['id'], FILTER_SANITIZE_NUMBER_INT),
  35.         ]);
  36.         return $label.$filter;
  37.     }
  38. }
  39.  
  40. /**
  41.  * @return string|void
  42.  */
  43. function glsr_get_assigned_posts_listtable_filter() {
  44.     global $wpdb;
  45.     $table = glsr('Database\Query')->table('assigned_posts');
  46.     $postIds = $wpdb->get_col("SELECT DISTINCT post_id FROM {$table}");
  47.     if (!empty($postIds)) {
  48.         $posts = get_posts([
  49.             'order' => 'ASC',
  50.             'orderby' => 'post_title',
  51.             'post_type' => 'any',
  52.             'posts_per_page' => -1,
  53.             'post__in' => $postIds,
  54.         ]);
  55.         $options = wp_list_pluck($posts, 'post_title', 'ID');
  56.         return glsr_get_assigned_listtable_filter([
  57.             'id' => 'assigned_post_id',
  58.             'label' => _x('Filter by assigned post', 'admin-text', 'site-reviews'),
  59.             'options' => $options,
  60.             'placeholder' => _x('All assigned posts', 'admin-text', 'site-reviews'),
  61.         ]);
  62.     }
  63. }
  64.  
  65. /**
  66.  * @return string|void
  67.  */
  68. function glsr_get_assigned_terms_listtable_filter() {
  69.     $options = get_terms([
  70.         'count' => false,
  71.         'fields' => 'id=>name',
  72.         'hide_empty' => false,
  73.         'taxonomy' => glsr()->taxonomy,
  74.     ]);
  75.     if (!empty($options)) {
  76.         return glsr_get_assigned_listtable_filter([
  77.             'id' => 'assigned_term_id',
  78.             'label' => _x('Filter by category', 'admin-text', 'site-reviews'),
  79.             'options' => $options,
  80.             'placeholder' => _x('All categories', 'admin-text', 'site-reviews'),
  81.         ]);
  82.     }
  83. }
  84.  
  85. /**
  86.  * @return void
  87.  * @action restrict_manage_posts
  88.  */
  89. add_action('admin_init', function () {
  90.     if (!function_exists('glsr')) {
  91.         return;
  92.     }
  93.     add_filter('restrict_manage_posts', function ($postType) {
  94.         if ($postType === glsr()->post_type) {
  95.             echo glsr_get_assigned_terms_listtable_filter();
  96.             echo glsr_get_assigned_posts_listtable_filter();
  97.         }
  98.     });
  99.     add_action('pre_get_posts', function (\WP_Query $query) {
  100.         if (!glsr_check_listtable_filter_permissions($query)) {
  101.             return;
  102.         }
  103.         if ($termId = filter_input(INPUT_GET, 'assigned_term_id', FILTER_SANITIZE_NUMBER_INT)) {
  104.             $query->set('tax_query', [[
  105.                 'taxonomy' => glsr()->taxonomy,
  106.                 'terms' => $termId,
  107.             ]]);
  108.         }
  109.     });
  110.     add_filter('posts_clauses', function (array $clauses, \WP_Query $query) {
  111.         if ($postId = filter_input(INPUT_GET, 'assigned_post_id', FILTER_SANITIZE_NUMBER_INT)) {
  112.             global $wpdb;
  113.             $ratingTable = glsr('Database\Query')->table('ratings');
  114.             $assignedPostsTable = glsr('Database\Query')->table('assigned_posts');
  115.             $postIds = $wpdb->get_col("
  116.                SELECT DISTINCT r.review_id
  117.                FROM {$ratingTable} r
  118.                INNER JOIN {$assignedPostsTable} apt ON apt.rating_id = r.ID
  119.                WHERE apt.post_id = '{$postId}'
  120.            ");
  121.             $clauses['where'] .= sprintf(" AND {$wpdb->posts}.ID IN (%s) ", implode(',', $postIds));
  122.         }
  123.         return $clauses;
  124.     }, 10, 2);
  125. });
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×