Подтвердить что ты не робот

Страница VueJS SPA для WP admin не работает

Проект VueJS был создан vue-cli с использованием шаблона Webpack. Когда я создавал для производства, я получаю одну папку static, которая имеет 2 папки и 1 index.html файл. 2 папки: css и js. Там только один файл css. Но есть 3 файла javascript. app.xxxxxxx.js, manifest.xxxxxxxx.js и vendor.xxxxxxx.js.

Я завернул проект VueJS на сервере Node и сервере Apache. Для сервера Node я использовал ExpressJS:

...
app.use('/public', express.static(__dirname + '/public'));
app.use('/static', express.static(__dirname + '/public/static'));
app.use('/js', express.static(__dirname + '/public/static/js'));
app.use('/css', express.static(__dirname + '/public/static/css'));
app.get('/', function(req, res) {
  res.sendFile(path.join(__dirname + '/public/index.html'));
});
...

SPA работает для Node.

Для сервера Apache я просто передал всю разметку HTML из сгенерированного index.html в index.php и убедитесь, что прочитаны каталоги CSS и JS.

Я пытаюсь сделать то же самое с WordPress. Но не повезло.

Что я сделал с WP до сих пор, так это то, что я загрузил все файлы JS и CSS, используя wp_enqueue_script() и wp_enqueue_style(), соответственно. Но я не могу заставить html-разметку работать вместе с CSS и JS файлами. Возможно, это проблема. Что мне не хватает?

Вот как выглядел бы index.html после создания из производства:

<!DOCTYPE html>
<html>
<head>
  <meta charset=utf-8>
  <title>wan_admin3</title>

   <link rel=stylesheet href=https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css>

<link href=/static/css/app.49437cdf2228a91c12a30d39ae35bb58.css rel=stylesheet>
</head>

<body>

<div id=app></div>
<script type=text/javascript src=/static/js/manifest.989a96caedc89ff03309.js</script>
<script type=text/javascript src=/static/js/vendor.86018170deacaae1d066.js</script>
<script type=text/javascript src=/static/js/app.6103fd8f82bcb5c38544.js</script>
</body>
</html>

Что я сделал в WP functions.php

add_action( 'admin_menu', 'register_my_menu_item' );
function register_my_menu_item() {
   $my_plugins_page = add_menu_page(
     'General Page',
     'General Page',
     'manage_options',
     'mt-top-level-handle',
     'my_plugins_page_callback'
   );
   $subadmin_page = add_submenu_page(
     'mt-top-level-handle',
     'submenu-admin',
     'Sub Level Menu',
     'manage_options',
     'submenu_admin_page',
     'admin_sub_page_callback'
   );
  add_action( 'load-' . $subadmin_page, 'do_enqueue' );
}
function do_enqueue() {
  wp_enqueue_style(
    'subadmin_css_sheet',
    get_theme_file_uri( 'some-admin/subadmin/css/app.49437cdf2228a91c12a30d39ae35bb58.css'),
    array(),
    '1.0.0'
  );
  wp_enqueue_script(
    'subadmin_app_script',
    get_theme_file_uri('some-admin/subadmin/js/app.6103fd8f82bcb5c38544.js'),
    array(),
    '1.0.0',
    true
  );
  wp_enqueue_script(
    'subadmin_manifest_script',
    get_theme_file_uri( 'some-admin/subadmin/js/manifest.989a96caedc89ff03309.js'),
    array(),
    '1.0.0',
    true
  );
  wp_enqueue_script(
    'subadmin_vendor_script',
    get_theme_file_uri( 'some-admin/subadmin/js/vendor.86018170deacaae1d066.js'),
    array(),
    '1.0.0',
    true
  );
}
function my_plugins_page_callback() {
?>
   <div>Hello</div>
<?php
}
function admin_sub_page_callback() {
?>
  <div id="app">Subadmin</div>
<?php
}

Элемент меню верхнего уровня и подменю показывают, как они должны быть. Но когда я нажимаю меню Sub Level, он отображает только текст Subadmin, а не VueJS SPA, который работает в других средах.

Subadmin text, показывающий вместо VueJS SPA

Конечно, файлы JS и CSS загружаются, потому что когда вы щелкните правой кнопкой мыши веб-страницу и посмотрите исходный код, затем щелкните ссылки на файлы JS и CSS, появятся коды.

Скриншот ссылки на файл CSS

JS файл  script теги Скриншот

Структура файла CSS и JS внутри twentyseventeen:

Структура CSS и JS файлов внутри двадцать девятого

Для конца HTML внутри admin_sub_page_callback() я просто взял <div id="app"></div> из исходного index.html, который был сгенерирован из проекта VueJS.

4b9b3361

Ответ 1

У меня есть похожие виджеты Vue.js для работы с WP, но только с помощью браузера, а не с webpack.

Я не использовал шаблон браузера vue-cli, хотя он мог работать с этим. Вместо этого я использовал свой собственный package.json. Здесь суть: https://gist.github.com/maurop123/eb0c8e884fefe3e40c110b33beff48db

Это сделает один файл dist/bundle.js для всего приложения vue. Затем я отбросил этот файл туда, где статические файлы js для моей темы wp.

Затем я добавил строку wp_enqueue_script в functions.php, как это...

wp_enqueue_script( MD_THEME_NAME.'-bundle', MD_THEME_URI.'/assets/js/bundle.js', array('jquery'), NULL, true );

Конкретный шаблон аргументов может зависеть от вашей темы. Вы должны попытаться сделать ваш wp_enqueue_script похожим на существующий.

Наконец, я добавил необходимый элемент html, например <div id="vueApp"></div>, где угодно в текущем визуализированном шаблоне.

Надеюсь, что это поможет!