*/
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();
}
}