书接上回,我们使用 Vue3 技术撰写前端,为了与后台进行交互,包括从前端加载的开始获取初始设置数据等,都需要从 PHP 中获取数据,但我们开发的项目打包后,只有 JS 文件,因此,开发的第一件事就是解决 PHP 传值给 JS 的问题。
(资料图片)
为了方便我们的功能实现,我们开发一个简单的插件。简单介绍下软件环境,都是三平台通用的,大家能都用
编辑器:Visual Studio Code
环境:Local
目标
通过 PHP,将所需数据传给 JS 文件,并在 JS 文件中打印出来。
准备环境
VS Code 下载后安装使用即可。Local 下载安装后,可点击左下角“+”按钮,一路默认选择,填写站点名称即可.创建后,如下所示,
左侧列表选择自己创建的站点,
点击 Go to site folder 进入站点文件夹,选择 app → public 即可看到站点根目录文件
点击 WP Admin 即可进入站点后台
我们先在 WordPress 站点的wp-content/plugins
目录下新建文件夹 vue-spa ,我们在这里撰写代码,实现我们的功能。
准备插件信息并启用
现在,我们在 vue-spa 文件夹下添加新文件“”文件,写入以下内容
//<?php/*Plugin Name: Vue - SPA Plugin URI: : 将vue构建的页面嵌入WordPress 中并产生交互Author: MuzeAuthor URI: : */
分别代表:
插件名
插件介绍网址
插件功能介绍
插件作者
插件作者介绍网站
插件版本
现在,我们的插件准备好了,点击 WP Admin 即可进入站点后台,进入插件页面,选择 Vue - SPA 插件启用吧
准备菜单
Dashicons | WordPress 图标
为了验证我们准备的数据,需要一个地方来展示,方便验证,就做个菜单出来。承接上文,添加以下代码
//创建一个菜单function vuespa_create_menu_page(){ add_menu_page( 'VueSpa选项', // 此菜单对应页面上显示的标题 'VueSpa', // 要为此实际菜单项显示的文本 'administrator', // 哪种类型的用户可以看到此菜单 'vuespa_id', // 此菜单项的唯一ID(即段塞) 'vuespa_menu_page_display', // 呈现此页面的菜单时要调用的函数的名称 'dashicons-admin-customizer', //图标 - 默认图标 '', //位置 );} // end vuespa_create_menu_page add_action('admin_menu', 'vuespa_create_menu_page');//菜单回调 - 展示的内容function vuespa_menu_page_display(){?> <!--在默认WordPress“包装”容器中创建标题--> <div class="wrap"> <!--标题--> <h2><?php echo esc_html(get_admin_page_title()); ?></h2> <!--提供Vue挂载点--> <div id="vuespa">此内容将在挂载Vue后被替换</div> </div><?php} // vuespa_menu_page_display
代码的用途我放注释了,大家可以看看,主要作用是,在 WordPress 后台创建一个菜单,并展示一段话。
其中的 class 样式class="wrap"
是 WordPress 自带的,有利于页面的一致性。
其中的图标,可在本节的开始提供的网址中获取,是 WordPress 的自带图标
现在,我们刷新 WordPress 后台,可以找到 VueSpa 菜单,点击打开即可。
若没有此菜单,请检查是否启用了 Vue - SPA 插件
准备JS文件接收数据
为了确定 PHP 传给 JS 的数据是成功的,我们需要在 JS 文件中进行验证。
我们在插件文件夹下新建文件夹 vite 和 dist 文件夹,并新建 和 文件,结构类似这样
vue-spa/vite/dist//vite/dist/
写入以下代码
//vite/dist/("我加载啦 - Npcink")
暂时不写
现在,我们需要在 文件中载入 文件,我们在 文件中添加以下代码
//载入所需 JS 和 CSS 资源function vuespa_load_vues($hook){ //判断当前页面是否是指定页面,是则继续加载 if ('toplevel_page_vuespa_id' != $hook) { return; } //版本号 $ver = '52'; //加载到页面顶部 wp_enqueue_style('vite', plugin_dir_url(__FILE__) . 'vite/dist/', array(), $ver, false); wp_enqueue_script('vite', plugin_dir_url(__FILE__) . 'vite/dist/', array(), $ver, false);}//样式加载到后台add_action('admin_enqueue_scripts', 'vuespa_load_vues');
现在,我们只有打开 VueSpa 菜单才会有弹窗。此时,我们就加载了 JS 文件。
准备数据
我们通过PHP准备数据,在JS文件中通过弹窗显示出来。
我们在 页面底部添加以下代码准备数据
//准备待传输的数据function vuespa_data(){ $person = [ "str" => "Hello, world!", "num" => 25, "city" => [1, 2, 3, 4, 5], ]; return $person;}
为了看到数据是否做好,我们修改下菜单回调函数 vuespa_menu_page_display()
,先用PHP将数据展示看看
//菜单回调 - 展示的内容function vuespa_menu_page_display(){?> <!--在默认WordPress“包装”容器中创建标题--> <div class="wrap"> <!--标题--> <h2><?php echo esc_html(get_admin_page_title()); ?></h2> <!--提供Vue挂载点--> <div id="vuespa">此内容将在挂载Vue后被替换</div> </div><?php//展示准备的数据 echo "<pre>"; print_r(vuespa_data()); echo "</pre>";} // vuespa_menu_page_display
效果如下:
数据展示正常,
传递数据
wp_localize_script() | Function | WordPress Developer Resources
传递数据,我们要用到 wp_localize_script()
函数,修改我们载入JS的函数 vuespa_load_vues()
//载入所需 JS 和 CSS 资源 并传递数据function vuespa_load_vues($hook){ //判断当前页面是否是指定页面,是则继续加载 if ('toplevel_page_vuespa_id' != $hook) { return; } //版本号 $ver = '52'; //加载到页面顶部 wp_enqueue_style('vite', plugin_dir_url(__FILE__) . 'vite/dist/', array(), $ver, false); wp_enqueue_script('vite', plugin_dir_url(__FILE__) . 'vite/dist/', array(), $ver, false); $pf_api_translation_array = array( 'route' => esc_url_raw(rest_url()), //路由 'nonce' => wp_create_nonce('wp_rest'), //验证标记 'data' => vuespa_data(), //自定义数据 ); wp_localize_script('vite', 'dataLocal', $pf_api_translation_array); //传给vite项目}//样式加载到后台add_action('admin_enqueue_scripts', 'vuespa_load_vues');
再修改我们的 文件,将拿到的数据打印出来
//vite/dist/(dataLocal);
在WordPress 中,点击VueSpa菜单,使用浏览器的开发者工具,即可在控制台中看到传递的数据
其中,各个数据的用途可见注释
'route' => esc_url_raw(rest_url()), //路由 'nonce' => wp_create_nonce('wp_rest'), //验证标记 'data' => vuespa_data(), //自定义数据
nonce: "82711b7680" route: "http://localhost:10004/wp-json/"
我们通过传来的路由,知道要发出 POST 请求的网址
我们通过传来的验证标记,在发出 POST 请求时进行身份验证
我们通过传来的data数据,在 JS 文件中进行进一步的操作
补充
本节完整代码
<?php/*Plugin Name: Vue - SPA Plugin URI: : 将vue构建的页面嵌入WordPress 中并产生交互Author: MuzeAuthor URI: : *///创建一个菜单function vuespa_create_menu_page(){ add_menu_page( 'VueSpa选项', // 此菜单对应页面上显示的标题 'VueSpa', // 要为此实际菜单项显示的文本 'administrator', // 哪种类型的用户可以看到此菜单 'vuespa_id', // 此菜单项的唯一ID(即段塞) 'vuespa_menu_page_display', // 呈现此页面的菜单时要调用的函数的名称 'dashicons-admin-customizer', //图标 - 默认图标 '', //位置 );} // end vuespa_create_menu_page add_action('admin_menu', 'vuespa_create_menu_page');//菜单回调 - 展示的内容function vuespa_menu_page_display(){?> <!--在默认WordPress“包装”容器中创建标题--> <div class="wrap"> <!--标题--> <h2><?php echo esc_html(get_admin_page_title()); ?></h2> <!--提供Vue挂载点--> <div id="vuespa">此内容将在挂载Vue后被替换</div> </div><?php //展示准备的数据 echo "<pre>"; print_r(vuespa_data()); echo "</pre>";} // vuespa_menu_page_display//载入所需 JS 和 CSS 资源 并传递数据function vuespa_load_vues($hook){ //判断当前页面是否是指定页面,是则继续加载 if ('toplevel_page_vuespa_id' != $hook) { return; } //版本号 $ver = '52'; //加载到页面顶部 wp_enqueue_style('vite', plugin_dir_url(__FILE__) . 'vite/dist/', array(), $ver, false); wp_enqueue_script('vite', plugin_dir_url(__FILE__) . 'vite/dist/', array(), $ver, false); $pf_api_translation_array = array( 'route' => esc_url_raw(rest_url()), //路由 'nonce' => wp_create_nonce('wp_rest'), //验证标记 'data' => vuespa_data(), //自定义数据 ); wp_localize_script('vite', 'dataLocal', $pf_api_translation_array); //传给vite项目}//样式加载到后台add_action('admin_enqueue_scripts', 'vuespa_load_vues');//准备待传输的数据function vuespa_data(){ $person = [ "str" => "Hello, world! - Npcink", "num" => 25, "city" => [1, 2, 3, 4, 5], ]; return $person;}
获取hook变量
若您想知道当前页面的hook变量,可在 页面底部添加以下代码获取
function wpdocs_myselective_css_or_js($hook){ echo '<h1 style="color: crimson;text-align: center;">' . esc_html($hook) . '</h1>';}//获取当前页面hookadd_action('admin_enqueue_scripts', 'wpdocs_myselective_css_or_js');
最新文章
后续文章持续撰写中,点个关注,获取平台最新文章推送。
技术有限,还望诸位协助勘误,于评论区指出,
常一文多发,最新勘定和增补文章于下方链接给出