UpdateTotalViewsPostMeta.php
106 lines
| 1 | <?php |
| 2 | |
| 3 | namespace IAWP\ViewsColumn; |
| 4 | |
| 5 | use IAWP\Illuminate_Builder; |
| 6 | use IAWP\Models\Page; |
| 7 | use IAWP\Models\Page_Home; |
| 8 | use IAWP\Models\Page_Post_Type_Archive; |
| 9 | use IAWP\Models\Page_Singular; |
| 10 | use IAWP\Query; |
| 11 | use IAWPSCOPED\Illuminate\Database\Query\JoinClause; |
| 12 | /** @internal */ |
| 13 | class UpdateTotalViewsPostMeta |
| 14 | { |
| 15 | private function update_singular(int $singular_id) : void |
| 16 | { |
| 17 | $views_table = Query::get_table_name(Query::VIEWS); |
| 18 | $resources_table = Query::get_table_name(Query::RESOURCES); |
| 19 | $total_views = Illuminate_Builder::new()->selectRaw('COUNT(*) AS views')->from("{$resources_table} as resources")->join("{$views_table} AS views", function (JoinClause $join) { |
| 20 | $join->on('resources.id', '=', 'views.resource_id'); |
| 21 | })->where('singular_id', '=', $singular_id)->value('views'); |
| 22 | \update_post_meta($singular_id, \IAWP\ViewsColumn\ViewsColumn::$meta_key, $total_views); |
| 23 | } |
| 24 | private function update_home() : void |
| 25 | { |
| 26 | $id = $this->get_home_id(); |
| 27 | if ($id === null) { |
| 28 | return; |
| 29 | } |
| 30 | $views_table = Query::get_table_name(Query::VIEWS); |
| 31 | $resources_table = Query::get_table_name(Query::RESOURCES); |
| 32 | $total_views = Illuminate_Builder::new()->selectRaw('COUNT(*) AS views')->from("{$resources_table} as resources")->join("{$views_table} AS views", function (JoinClause $join) { |
| 33 | $join->on('resources.id', '=', 'views.resource_id'); |
| 34 | })->where('resource', '=', 'home')->value('views'); |
| 35 | \update_post_meta($id, \IAWP\ViewsColumn\ViewsColumn::$meta_key, $total_views); |
| 36 | } |
| 37 | private function get_home_id() : ?int |
| 38 | { |
| 39 | $id = \get_option('page_for_posts'); |
| 40 | if (\is_string($id) && \ctype_digit($id)) { |
| 41 | $id = \intval($id); |
| 42 | } |
| 43 | $blog_page = \get_post($id); |
| 44 | if ($blog_page === null) { |
| 45 | return null; |
| 46 | } |
| 47 | return $id; |
| 48 | } |
| 49 | private function update_shop() : void |
| 50 | { |
| 51 | try { |
| 52 | $id = $this->get_shop_id(); |
| 53 | if ($id === null) { |
| 54 | return; |
| 55 | } |
| 56 | $views_table = Query::get_table_name(Query::VIEWS); |
| 57 | $resources_table = Query::get_table_name(Query::RESOURCES); |
| 58 | $total_views = Illuminate_Builder::new()->selectRaw('COUNT(*) AS views')->from("{$resources_table} as resources")->join("{$views_table} AS views", function (JoinClause $join) { |
| 59 | $join->on('resources.id', '=', 'views.resource_id'); |
| 60 | })->where('resource', '=', 'post_type_archive')->where('post_type', '=', 'product')->value('views'); |
| 61 | \update_post_meta($id, \IAWP\ViewsColumn\ViewsColumn::$meta_key, $total_views); |
| 62 | } catch (\Throwable $e) { |
| 63 | } |
| 64 | } |
| 65 | private function get_shop_id() : ?int |
| 66 | { |
| 67 | if (!\function_exists('IAWPSCOPED\\wc_get_page_id')) { |
| 68 | return null; |
| 69 | } |
| 70 | $id = wc_get_page_id('shop'); |
| 71 | if ($id === -1) { |
| 72 | return null; |
| 73 | } |
| 74 | return $id; |
| 75 | } |
| 76 | public static function update_all() : void |
| 77 | { |
| 78 | $updater = new \IAWP\ViewsColumn\UpdateTotalViewsPostMeta(); |
| 79 | $updater->update_home(); |
| 80 | $updater->update_shop(); |
| 81 | $ids = \get_posts(['post_type' => 'any', 'post_status' => 'any', 'numberposts' => -1, 'fields' => 'ids', 'no_found_rows' => \true]); |
| 82 | foreach ($ids as $id) { |
| 83 | $id = (int) $id; |
| 84 | // Skip these as they're handled separately |
| 85 | if ($updater->get_home_id() === $id || $updater->get_shop_id() === $id) { |
| 86 | continue; |
| 87 | } |
| 88 | $updater->update_singular($id); |
| 89 | } |
| 90 | } |
| 91 | public static function for_page(Page $page) : void |
| 92 | { |
| 93 | $updater = new \IAWP\ViewsColumn\UpdateTotalViewsPostMeta(); |
| 94 | if ($page instanceof Page_Singular) { |
| 95 | $singular_id = $page->get_singular_id(); |
| 96 | if (\is_int($singular_id)) { |
| 97 | $updater->update_singular($singular_id); |
| 98 | } |
| 99 | } elseif ($page instanceof Page_Home) { |
| 100 | $updater->update_home(); |
| 101 | } elseif ($page instanceof Page_Post_Type_Archive && $page->post_type() === 'product') { |
| 102 | $updater->update_shop(); |
| 103 | } |
| 104 | } |
| 105 | } |
| 106 |