*/ protected static array $list = []; public static function instance(): Bar { if (self::$instance === null) self::$instance = new self(); return self::$instance; } public function init(): void { add_action('wp_footer', [$this, 'menus'], 1); } public function menus(): void { if (is_admin()) return; if (function_exists('is_admin_bar_showing') && !is_admin_bar_showing()) return; if (!$this->canRenderForCurrentUser()) return; if (!count(self::$list)) return; $items = ''; foreach (array_unique(self::$list, SORT_REGULAR) as $item) { if (is_string($item)) { $items .= $item; continue; } $items .= $this->postItem((int) $item); } if ($items === '') return; $profile = Profile::getInstance(); $this->enqueueAdminBarScript($profile); $root_url = current_user_can(Capabilities::ACCESS_ADMIN) ? admin_url('admin.php?page=daytidy') : '#'; $menu = implode('', [ '', ]); echo ''; } private function enqueueAdminBarScript(Profile $profile): void { wp_enqueue_script( 'daytidy-admin-bar', Assets::url('dist/js/admin-bar.min.js'), ['jquery'], $profile->version(), true ); } public function add(int $id): void { if ($id <= 0) return; self::$list[] = $id; } public function menu(string $url, string $title, string $unique = ''): void { if (trim($url) === '' || trim($title) === '') return; self::$list[] = implode('', [ '
  • ' . esc_html($title) . '
  • ', ]); } private function postItem(int $id): string { if (!current_user_can(Capabilities::ACCESS_ADMIN)) return ''; $post = get_post($id); if (!$post instanceof WP_Post) return ''; $url = get_edit_post_link($id, 'raw'); if (!is_string($url) || trim($url) === '') return ''; return implode('', [ '
  • ', '', '', '' . esc_html($this->postTitle($post)) . '', '' . esc_html($this->postTypeLabel($post)) . '', '
  • ', ]); } private function postTitle(WP_Post $post): string { $title = get_the_title($post); if (is_string($title) && trim($title) !== '') return $title; // translators: Placeholder values. return sprintf(esc_html__('#%d', 'daytidy'), $post->ID); } private function postTypeLabel(WP_Post $post): string { if ($post->post_type === View::PT) return esc_html__('View', 'daytidy'); if ($post->post_type === Offering::PT) return esc_html__('Offering', 'daytidy'); $object = get_post_type_object($post->post_type); return $object && isset($object->labels->singular_name) ? (string) $object->labels->singular_name : esc_html__('Item', 'daytidy'); } private function canRenderForCurrentUser(): bool { return current_user_can(Capabilities::ACCESS_ADMIN) || Capabilities::canAccessFrontendDashboard(); } }