dir = trailingslashit($dir); $this->url = trailingslashit($url); } /** @return array{js: string, css: string[]}|null */ public function entry(): ?array { $file = $this->dir . 'build/manifest.json'; if (!is_readable($file)) { return null; } $manifest = json_decode((string) file_get_contents($file), true); if (!is_array($manifest)) { return null; } $js = null; $css = []; foreach ($manifest as $chunk) { if (!empty($chunk['isEntry']) && !empty($chunk['file'])) { $js = $chunk['file']; $css = array_merge($css, $chunk['css'] ?? []); } elseif (!empty($chunk['file']) && substr((string) $chunk['file'], -4) === '.css') { $css[] = $chunk['file']; // the one stylesheet of a classic-script build (cssCodeSplit off) } } if ($js === null) { return null; } return [ 'js' => $this->url . 'build/' . $js, 'css' => array_map(fn ($file) => $this->url . 'build/' . $file, $css), ]; } public function enqueue(): void { $entry = $this->entry(); if ($entry === null) { return; } wp_enqueue_script(self::HANDLE, $entry['js'], ['react', 'react-dom', 'wp-i18n'], RELAY_VERSION, true); // WordPress' own React foreach ($entry['css'] as $i => $css) { wp_enqueue_style(self::HANDLE . '-' . $i, $css, [], RELAY_VERSION); } wp_add_inline_script(self::HANDLE, 'window.relayBoot = ' . wp_json_encode($this->boot_data()) . ';', 'before'); wp_set_script_translations(self::HANDLE, 'siterelay', $this->dir . 'languages'); } public function boot_data(): array { $user = wp_get_current_user(); return [ 'restUrl' => esc_url_raw(rest_url('relay/v1/')), 'nonce' => wp_create_nonce('wp_rest'), 'version' => RELAY_VERSION, 'adminUrl' => is_multisite() ? network_admin_url() : admin_url(), 'loginUrl' => wp_login_url(Menu::url()), 'siteName' => SiteInfo::plain_name(is_multisite() ? (string) get_network()->site_name : get_bloginfo('name')), 'homeUrl' => is_multisite() ? network_home_url() : home_url(), 'network' => is_multisite() ? ['subdomain' => is_subdomain_install()] : null, 'user' => ['name' => $user->display_name], ]; } }