capability(); add_menu_page( __('3D Print Showcase', '3d-print-showcase'), __('3D Print Showcase', '3d-print-showcase'), $capability, $parent, [$this, 'info_page'], $this->menu_icon(), 58 ); // Keep the WordPress administration menu focused on the three primary pages. add_submenu_page($parent, __('Info', '3d-print-showcase'), __('Info', '3d-print-showcase'), $capability, $parent, [$this, 'info_page']); add_submenu_page($parent, __('Settings', '3d-print-showcase'), __('Settings', '3d-print-showcase'), $capability, 'ds82-3dps-settings', [$this, 'settings_page']); add_submenu_page($parent, __('User 3D Viewer', '3d-print-showcase'), __('User 3D Viewer', '3d-print-showcase'), $capability, 'ds82-3dps-user-viewer', [$this, 'user_viewer_page']); // Register detail pages as hidden admin pages. They remain available through // the internal Settings navigation without extending the left admin menu. add_submenu_page(null, __('Materials', '3d-print-showcase'), __('Materials', '3d-print-showcase'), $capability, 'ds82-3dps-materials', [$this, 'materials_page']); add_submenu_page(null, __('Shortcode Builder', '3d-print-showcase'), __('Shortcode Builder', '3d-print-showcase'), $capability, 'ds82-3dps-shortcode-builder', [$this, 'shortcode_builder_page']); add_submenu_page(null, __('Addons', '3d-print-showcase'), __('Addons', '3d-print-showcase'), $capability, 'ds82-3dps-integrations', [$this, 'integrations_page']); add_submenu_page(null, __('Diagnostics', '3d-print-showcase'), __('Diagnostics', '3d-print-showcase'), $capability, 'ds82-3dps-diagnostics', [$this, 'diagnostics_page']); add_submenu_page(null, __('Tools', '3d-print-showcase'), __('Tools', '3d-print-showcase'), $capability, 'ds82-3dps-tools', [$this, 'tools_page']); add_submenu_page(null, __('Documentation', '3d-print-showcase'), __('Documentation', '3d-print-showcase'), $capability, 'ds82-3dps-documentation', [$this, 'documentation_page']); } private function menu_icon(): string { // WordPress allocates a 20 × 20 px menu icon box. The artwork is inset // to approximately 16 × 16 px so it visually matches native Dashicons. $svg = ''; return 'data:image/svg+xml;base64,' . base64_encode($svg); } public function assets(string $hook): void { $page = sanitize_key((string) filter_input(INPUT_GET, 'page', FILTER_UNSAFE_RAW)); if (!str_starts_with($page, 'ds82-3dps')) { return; } wp_enqueue_style('ds82-3dps-admin', DS82_3DPS_URL . 'assets/css/admin.css', [], DS82_3DPS_VERSION); // Keep the primary 3D Print Showcase navigation identical on every // core/add-on administration page. Add-ons may have their own local // sub-navigation, but the primary navigation always comes from the // main plugin's canonical tab registry. wp_enqueue_script('ds82-3dps-admin-navigation', DS82_3DPS_URL . 'assets/js/admin/navigation.js', [], DS82_3DPS_VERSION, true); $canonicalTabs = []; foreach ($this->tabs() as $slug => $label) { $canonicalTabs[] = [ 'slug' => (string) $slug, 'label' => (string) $label, 'url' => admin_url('admin.php?page=' . $slug), ]; } wp_localize_script('ds82-3dps-admin-navigation', 'DS823DPSAdminNavigation', [ 'tabs' => $canonicalTabs, 'currentPage' => $page, ]); if ('ds82-3dps-materials' === $page) { wp_enqueue_script('ds82-3dps-material-admin', DS82_3DPS_URL . 'assets/js/admin/materials.js', [], DS82_3DPS_VERSION, true); } } public function info_page(): void { $this->guard_page(); $installedVersion = DS82_3DPS_VERSION; $remoteVersion = $this->available_plugin_version(); $versionStatus = 'unknown'; if (is_string($remoteVersion) && '' !== $remoteVersion) { $versionStatus = version_compare($installedVersion, $remoteVersion, '>=') ? 'current' : 'update'; } $this->header(__('Info', '3d-print-showcase')); ?>
' . esc_html__('The changelog is empty.', '3d-print-showcase') . '
'; } $html = ''; $listOpen = false; foreach (preg_split('/\R/', $contents) ?: [] as $line) { $line = trim($line); if ('' === $line) { if ($listOpen) { $html .= ''; $listOpen = false; } continue; } if (str_starts_with($line, '# ')) { if ($listOpen) { $html .= ''; $listOpen = false; } $html .= '' . esc_html($line) . '
'; } if ($listOpen) { $html .= ''; } return '| px | |
[ds82_3d_print_showcase model_id="123"]
[ds82_3d_print_showcase model_url="https://example.com/model.stl"]
[ds82_3d_print_showcase model_id="123" height="650" material="internal:az1" fallback_url="https://example.com/fallback.jpg" auto_rotate="true"]
model_id | model_id="123" | |
model_url | model_url="https://example.com/model.3mf" | |
height | height="600" | |
material | material="internal:az1" | |
fallback_url | fallback_url="https://example.com/model.jpg" | |
auto_rotate | auto_rotate="true" |
STL, 3MF, GLB, GLTF
notice_text($notice)); ?>