Views_Column.php
81 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP\Custom_WordPress_Columns; |
| 4 | |
| 5 | use IAWP\Capability_Manager; |
| 6 | use IAWP\Utils\Number_Formatter; |
| 7 | /** @internal */ |
| 8 | class Views_Column |
| 9 | { |
| 10 | public static $meta_key = 'iawp_total_views'; |
| 11 | public static function initialize() : void |
| 12 | { |
| 13 | if (\get_option('iawp_disable_views_column', 0) === '1') { |
| 14 | return; |
| 15 | } |
| 16 | \add_action('init', [self::class, 'register_custom_post_meta']); |
| 17 | \add_filter('manage_posts_columns', [self::class, 'set_column_header'], 10, 2); |
| 18 | \add_action('manage_posts_custom_column', [self::class, 'echo_cell_content'], 10, 2); |
| 19 | \add_action('pre_get_posts', [self::class, 'configure_sorting']); |
| 20 | \add_filter('manage_pages_columns', [self::class, 'set_column_header']); |
| 21 | \add_action('manage_pages_custom_column', [self::class, 'echo_cell_content'], 10, 2); |
| 22 | \add_action('pre_get_pages', [self::class, 'configure_sorting']); |
| 23 | } |
| 24 | public static function register_custom_post_meta() : void |
| 25 | { |
| 26 | foreach (self::post_type_slugs() as $post_type_slug) { |
| 27 | \register_post_meta($post_type_slug, self::$meta_key, ['type' => 'integer', 'single' => \true, 'default' => 0, 'show_in_rest' => \true]); |
| 28 | \add_filter("manage_edit-{$post_type_slug}_sortable_columns", [self::class, 'enable_sorting']); |
| 29 | } |
| 30 | } |
| 31 | public static function set_column_header(array $columns, ?string $post_type = null) : array |
| 32 | { |
| 33 | // manage_pages_columns doesn't set the $post_type argument, so checking is_null() works for it |
| 34 | if (\is_null($post_type) || \in_array($post_type, self::post_type_slugs())) { |
| 35 | $columns[self::$meta_key] = \__('Views', 'independent-analytics') . ' <span class="iawp-hidden-label"><span class="hide">(</span>Independent Analytics<span class="hide">)</span></span>'; |
| 36 | } |
| 37 | return $columns; |
| 38 | } |
| 39 | public static function echo_cell_content($column_id, $post_id) : void |
| 40 | { |
| 41 | // Do nothing for columns other than the views column |
| 42 | if ($column_id !== self::$meta_key) { |
| 43 | return; |
| 44 | } |
| 45 | $author_id = \intval(\get_post_field('post_author', $post_id)); |
| 46 | $is_your_post = \get_current_user_id() === $author_id; |
| 47 | if (Capability_Manager::can_view_all_analytics() || $is_your_post) { |
| 48 | $total_views = \intval(\get_post_meta($post_id, self::$meta_key, \true)); |
| 49 | echo Number_Formatter::decimal($total_views); |
| 50 | } else { |
| 51 | echo '-'; |
| 52 | } |
| 53 | } |
| 54 | public static function enable_sorting(array $columns) : array |
| 55 | { |
| 56 | $columns[self::$meta_key] = [self::$meta_key, 'DESC']; |
| 57 | return $columns; |
| 58 | } |
| 59 | public static function configure_sorting($query) : void |
| 60 | { |
| 61 | // Limit to admin menus |
| 62 | if (!\is_admin() || !$query->is_main_query() || \wp_doing_ajax() || \wp_doing_cron()) { |
| 63 | return; |
| 64 | } |
| 65 | $order_by = $query->get('orderby'); |
| 66 | if ($order_by === self::$meta_key) { |
| 67 | $meta_query = ['relation' => 'OR', ['key' => self::$meta_key, 'compare' => 'NOT EXISTS'], ['key' => self::$meta_key]]; |
| 68 | $query->set('meta_query', $meta_query); |
| 69 | $query->set('orderby', 'meta_value_num'); |
| 70 | } |
| 71 | } |
| 72 | private static function post_type_slugs() : array |
| 73 | { |
| 74 | $built_in_post_type_slugs = ['post', 'page']; |
| 75 | $post_type_slugs = \get_post_types(['public' => \true, '_builtin' => \false]); |
| 76 | $slugs = \array_merge($built_in_post_type_slugs, $post_type_slugs); |
| 77 | $disallowed = ['elementor_library', 'e-landing-page']; |
| 78 | return \array_diff($slugs, $disallowed); |
| 79 | } |
| 80 | } |
| 81 |