Columns
2 years ago
Groups
2 years ago
Table.php
2 years ago
Table_Campaigns.php
2 years ago
Table_Devices.php
2 years ago
Table_Geo.php
2 years ago
Table_Pages.php
2 years ago
Table_Referrers.php
2 years ago
Table_Pages.php
79 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP_SCOPED\IAWP\Tables; |
| 4 | |
| 5 | use IAWP_SCOPED\IAWP\Rows\Pages; |
| 6 | use IAWP_SCOPED\IAWP\Statistics\Page_Statistics; |
| 7 | use IAWP_SCOPED\IAWP\Tables\Columns\Column; |
| 8 | use IAWP_SCOPED\IAWP\Tables\Groups\Group; |
| 9 | use IAWP_SCOPED\IAWP\Tables\Groups\Groups; |
| 10 | /** @internal */ |
| 11 | class Table_Pages extends Table |
| 12 | { |
| 13 | protected function table_name() : string |
| 14 | { |
| 15 | return 'views'; |
| 16 | } |
| 17 | protected function groups() : Groups |
| 18 | { |
| 19 | $groups = []; |
| 20 | $groups[] = new Group('page', \__('Page', 'independent-analytics'), Pages::class, Page_Statistics::class); |
| 21 | return new Groups($groups); |
| 22 | } |
| 23 | protected function local_columns() : array |
| 24 | { |
| 25 | return [new Column(['id' => 'title', 'label' => \esc_html__('Title', 'independent-analytics'), 'visible' => \true, 'type' => 'string', 'database_column' => 'cached_title']), new Column(['id' => 'visitors', 'label' => \esc_html__('Visitors', 'independent-analytics'), 'visible' => \true, 'type' => 'int']), new Column(['id' => 'views', 'label' => \esc_html__('Views', 'independent-analytics'), 'visible' => \true, 'type' => 'int']), new Column(['id' => 'sessions', 'label' => \esc_html__('Sessions', 'independent-analytics'), 'visible' => \false, 'type' => 'int']), new Column(['id' => 'average_view_duration', 'label' => \esc_html__('View Duration', 'independent-analytics'), 'visible' => \true, 'type' => 'int', 'filter_placeholder' => 'Seconds']), new Column(['id' => 'bounce_rate', 'label' => \esc_html__('Bounce Rate', 'independent-analytics'), 'visible' => \true, 'type' => 'int']), new Column(['id' => 'visitors_growth', 'label' => \esc_html__('Visitors Growth', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'exportable' => \false]), new Column(['id' => 'views_growth', 'label' => \esc_html__('Views Growth', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'exportable' => \false]), new Column(['id' => 'entrances', 'label' => \esc_html__('Entrances', 'independent-analytics'), 'visible' => \false, 'type' => 'int']), new Column(['id' => 'exits', 'label' => \esc_html__('Exits', 'independent-analytics'), 'visible' => \false, 'type' => 'int']), new Column(['id' => 'exit_percent', 'label' => \esc_html__('Exit Rate', 'independent-analytics'), 'visible' => \false, 'type' => 'int']), new Column(['id' => 'url', 'label' => \esc_html__('URL', 'independent-analytics'), 'visible' => \true, 'type' => 'string', 'database_column' => 'cached_url']), new Column(['id' => 'author', 'label' => \esc_html__('Author', 'independent-analytics'), 'visible' => \false, 'type' => 'select', 'options' => $this->author_options(), 'database_column' => 'cached_author_id', 'is_nullable' => \true]), new Column(['id' => 'type', 'label' => \esc_html__('Page Type', 'independent-analytics'), 'visible' => \true, 'type' => 'select', 'options' => $this->type_options(), 'database_column' => 'cached_type', 'is_nullable' => \true]), new Column(['id' => 'date', 'label' => \esc_html__('Publish Date', 'independent-analytics'), 'visible' => \false, 'type' => 'date', 'database_column' => 'cached_date', 'is_nullable' => \true]), new Column(['id' => 'category', 'label' => \esc_html__('Post Category', 'independent-analytics'), 'visible' => \false, 'type' => 'select', 'options' => $this->category_options(), 'database_column' => 'cached_category', 'is_nullable' => \true]), new Column(['id' => 'comments', 'label' => \esc_html__('Comments', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'is_nullable' => \true]), new Column(['id' => 'wc_orders', 'label' => \esc_html__('Orders', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'requires_woocommerce' => \true]), new Column(['id' => 'wc_gross_sales', 'label' => \esc_html__('Gross Sales', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'requires_woocommerce' => \true]), new Column(['id' => 'wc_refunds', 'label' => \esc_html__('Refunds', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'requires_woocommerce' => \true]), new Column(['id' => 'wc_refunded_amount', 'label' => \esc_html__('Refunded Amount', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'requires_woocommerce' => \true]), new Column(['id' => 'wc_net_sales', 'label' => \esc_html__('Net Sales', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'requires_woocommerce' => \true]), new Column(['id' => 'wc_conversion_rate', 'label' => \esc_html__('Conversion Rate', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'requires_woocommerce' => \true]), new Column(['id' => 'wc_earnings_per_visitor', 'label' => \esc_html__('Earnings Per Visitor', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'requires_woocommerce' => \true]), new Column(['id' => 'wc_average_order_volume', 'label' => \esc_html__('Average Order Volume', 'independent-analytics'), 'visible' => \false, 'type' => 'int', 'requires_woocommerce' => \true])]; |
| 26 | } |
| 27 | private function author_options() : array |
| 28 | { |
| 29 | return \array_map(function ($author) { |
| 30 | return [$author->ID, $author->display_name]; |
| 31 | }, $this->get_authors()); |
| 32 | } |
| 33 | private function get_authors() : array |
| 34 | { |
| 35 | $roles_that_can_edit_posts = []; |
| 36 | foreach (\wp_roles()->roles as $role_name => $role_obj) { |
| 37 | if ($role_obj['capabilities']['edit_posts'] ?? \false) { |
| 38 | $roles_that_can_edit_posts[] = $role_name; |
| 39 | } |
| 40 | } |
| 41 | return \get_users(['role__in' => $roles_that_can_edit_posts]); |
| 42 | } |
| 43 | private function type_options() : array |
| 44 | { |
| 45 | $options = []; |
| 46 | $options[] = ['post', \esc_html__('Post', 'independent-analytics')]; |
| 47 | $options[] = ['page', \esc_html__('Page', 'independent-analytics')]; |
| 48 | $options[] = ['attachment', \esc_html__('Attachment', 'independent-analytics')]; |
| 49 | foreach (\get_post_types(['public' => \true, '_builtin' => \false]) as $custom_type) { |
| 50 | $options[] = [$custom_type, \get_post_type_object($custom_type)->labels->singular_name]; |
| 51 | } |
| 52 | $options[] = ['category', \esc_html__('Category', 'independent-analytics')]; |
| 53 | $options[] = ['post_tag', \esc_html__('Tag', 'independent-analytics')]; |
| 54 | foreach (\get_taxonomies(['public' => \true, '_builtin' => \false]) as $taxonomy) { |
| 55 | $label = \get_taxonomy_labels(\get_taxonomy($taxonomy))->singular_name; |
| 56 | /** |
| 57 | * WooCommerce category and tag taxonomies have the same singular name as WordPress |
| 58 | * category and tag taxonomies, so use the name here instead |
| 59 | */ |
| 60 | if (\in_array($taxonomy, ['product_cat', 'product_tag'])) { |
| 61 | $label = \get_taxonomy_labels(\get_taxonomy($taxonomy))->name; |
| 62 | } |
| 63 | $options[] = [$taxonomy, \ucwords($label)]; |
| 64 | } |
| 65 | $options[] = ['blog-archive', \esc_html__('Blog Home', 'independent-analytics')]; |
| 66 | $options[] = ['author-archive', \esc_html__('Author Archive', 'independent-analytics')]; |
| 67 | $options[] = ['date-archive', \esc_html__('Date Archive', 'independent-analytics')]; |
| 68 | $options[] = ['search-archive', \esc_html__('Search Results', 'independent-analytics')]; |
| 69 | $options[] = ['not-found', \esc_html__('404', 'independent-analytics')]; |
| 70 | return $options; |
| 71 | } |
| 72 | private function category_options() : array |
| 73 | { |
| 74 | return \array_map(function ($category) { |
| 75 | return [$category->term_id, $category->name]; |
| 76 | }, \get_categories()); |
| 77 | } |
| 78 | } |
| 79 |