久久精品国产99国产精品免费看_中文成人在线_日本在线播放视频_精品国产一区二区三区在线观看

第三節:Vue3 開發WordPress設置選項 – 從篩選功能研究前后臺數據交互

本節從WordPress 中拿到用戶列表數據,并通過Vue3渲染在頁面上,我們還修改了保存選項的接口,以便保存數組類型的數據

承接上文,我們制作了一個簡單的,帶有兩個輸入框和一個保存按鈕的設置選項,現在,他已經能實現了最基礎的填寫信息并保存到 WordPress 后臺,供PHP調用選項值的功能。

現在,我們更進一步,為其添加人員篩選功能,我們制作一個下列框,從中通過用戶名進行選擇,并將選擇好的用戶 ID 通過數組提供給后端使用。大概流程如下

第三節:Vue3 開發WordPress設置選項 - 從篩選功能研究前后臺數據交互

最終效果如下

第三節:Vue3 開發WordPress設置選項 - 從篩選功能研究前后臺數據交互

準備用戶數據

一般的網站用戶量較大,大部分都是“訂閱者”,為了減少傳輸數據壓力,我們在獲取用戶數據時將其排除掉
為了將拿到數據方便給 JS 使用,降低 JS 使用數據難度,我們將其整理成如下結構

第三節:Vue3 開發WordPress設置選項 - 從篩選功能研究前后臺數據交互

vue-spa.php 文件底部添加以下代碼

//整理并提供用戶信息
function vuespa_get_user_meat()
{
    //獲取所有角色
    $editable_roles = wp_roles()->roles;
    $roles = array_keys($editable_roles);
    //獲取除了'subscriber'(訂閱者)角色之外的所有角色的用戶數據
    $subscriber_key = array_search('subscriber', $roles, true);
    if (false !== $subscriber_key) {
        $roles = array_slice($roles, 0, $subscriber_key);
    }

    $users = get_users(array('role__in' => $roles));

    //轉為關聯數組
    $user_data = array_map(function ($user) {
        return [
            'id'   => $user->ID,
            'name' => $user->display_name,
        ];
    }, $users);

    return $user_data;
}

您可以參考此方法,做出分類篩選、文章篩選、標簽篩選等篩選功能,只需按結構提供數據即可。

傳遞用戶數據

我們通過 PHP 將數據傳給 JS ,以供使用,我們修改 vue-spa.php 文件中的 vuespa_data() 函數,改為以下內容

function vuespa_data()
{
    $person = [
        "str" => "Hello, world! - Npcink",
        "num" => 25,
        "city" => [1, 2, 3, 4, 5],
        "user" => vuespa_get_user_meat(),
    ];
    return $person;
}

刷新菜單頁面,我們就能看到如上圖的效果。

JS 準備頁面

JS 中拿到傳來的數據,需要將其渲染至頁面上,修改index.js為以下內容

//vite/dist/index.js
console.log(dataLocal.data.user);
const App = {
  setup() {


    //存儲傳來的值
    const siteData = dataLocal.data;

    //存儲選項值
    const datas = Vue.reactive({
      dataOne: "",
      dataTwo: "",
      dataName: [],
    });

//獲取數據
    const vuespa_get_option = () => {
      axios
        .post(dataLocal.route + "pf/v1/get_option", datas, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
            "Content-Type": "application/json",
          },
        })
        .then((response) => {
          const data = response.data;
          datas.dataOne = data.dataOne;
          datas.dataTwo = data.dataTwo;
          datas.dataName = data.dataName;
        })
        .catch((error) => {
          window.alert("連接服務器失敗或后臺讀取出錯!數據讀取失敗");
          console.log(error);
        });
    };
    //省略部分代碼



    return { datas, siteData, vuespa_update_option };
  },
  template: `
  文本框1:<input type="text" v-model="datas.dataOne"><br/>
  文本框2:<input type="text" v-model="datas.dataTwo"><hr/>

  用戶選擇:<select v-model="datas.dataName" multiple>
  <option v-for="option in siteData.user" :key="option.id" :value="option.id">
      {{ option.name }}
  </option>
</select>
<p>你選擇了:{{ datas.dataName }}</p><br/>
按住command(control)按鍵即可進行多選<hr/>
    <button class="button button-primary" @click="vuespa_update_option">保存</button>`,
};

Vue.createApp(App).mount("#vuespa");

為了方便大家看出不同,我省略了部分未修改的代碼,其詳細內容,可見上一節。
主要內容如下

  • 新建變量 siteData 存儲傳來的數據
  • 新建數組變量 dataName 存儲選中數組
  • 在獲取數據中,通過 datas.dataName = data.dataName;拿到默認值

修改保存接口

原有的保存接口無法識別數組,若您此時修改選中的值并點擊保存按鈕,刷新頁面后會丟失選中的值。

修改 interface.php 文章的保存選項功能函數 update_option_by_RestAPI() 為以下內容

//保存Option
function update_option_by_RestAPI($data)
{
    //判斷是否是管理員
    if (current_user_can('manage_options')) {
        //轉為JSON對象 - 重點,這里沒有true,是轉為對象
        $dataArray = json_decode($data->get_body());
        //存儲結果
        $result = new stdClass();

        //循環保存選項
        foreach ($dataArray as $option_name => $value) {

            //判斷,是否為對象
            if (is_object($value)) {
                //是非空數組,循環保存值
                foreach ($value as $arr => $data) {
                    //更新值    
                    update_option($arr, $data);
                }
            } else {
                //不是對象,則表示只有一個選項需要保存。
                update_option($option_name, $value);
            }
            $result->$option_name = $value;
        }

        //返回成功信息
        return new WP_REST_Response(array(
            'success' => true,
            'message' => "已保存!"
        ), 200);
    } else {
        //返回失敗信息
        return new WP_Error('save_error', '保存失敗!', array('status' => 500));
    }
}

此函數的功能可見注釋,現在,刷新頁面,在下列列表中進行篩選,然后點擊保存按鈕,刷新頁面,可看到值是正常保存的,

使用

此時,您可以使用 get_option 在PHP中拿到選項中的值,正如上一節中提到的。

echo get_option('dataName');

注意,這會展示數組ID

總結

這一節我們添加了下拉列表多選功能,并沒有解決上一節提到的問題,不要急,我發現目前展示功能類型很方便,我準備在展示完所有常見功能類型后,再去解決上一節提到的問題。

文件代碼

vue-spa.php

<?php
/*
Plugin Name: Vue - SPA 
Plugin URI: http://m.kartiktrivedi.com
Description: 將vue構建的頁面嵌入WordPress 中并產生交互
Author: Muze
Author URI: http://m.kartiktrivedi.com
Version: 1.0.0
*/


//接口
require_once plugin_dir_path(__FILE__) . 'interface.php';
//創建一個菜單
function vuespa_create_menu_page()
{
    add_menu_page(
        'VueSpa選項',                   // 此菜單對應頁面上顯示的標題
        'VueSpa',                      // 要為此實際菜單項顯示的文本
        'administrator',               // 哪種類型的用戶可以看到此菜單
        'vuespa_id',                   //  此菜單項的唯一ID(即段塞)
        'vuespa_menu_page_display',    // 呈現此頁面的菜單時要調用的函數的名稱
        'dashicons-admin-customizer',  //圖標 - 默認圖標
        '500.1',                       //位置
    );
} // 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后被替換{{data}}</div>
    </div>



<?php

    //展示準備的數據
    echo "<pre>";
    print_r(vuespa_data());
    echo "</pre>";

    echo "<h3>調用選項值</h3>";
    echo get_option('dataOne');
    echo "<br/>";
    echo get_option('dataTwo');
} // vuespa_menu_page_display



//載入所需 JS 和 CSS 資源 并傳遞數據
function vuespa_load_vues($hook)
{
    //判斷當前頁面是否是指定頁面,是則繼續加載
    if ('toplevel_page_vuespa_id' != $hook) {
        return;
    }
    //版本號
    $ver = '53';
    //加載到頁面頂部
    wp_enqueue_style('vite', plugin_dir_url(__FILE__) . 'vite/dist/index.css', array(), $ver, false);
    //加載到頁面底部
    wp_enqueue_script('vue', 'https://unpkg.com/vue@3/dist/vue.global.js', array(), $ver, true);
    wp_enqueue_script('axios', 'https://unpkg.com/axios/dist/axios.min.js', array(), $ver, true);
    wp_enqueue_script('vite', plugin_dir_url(__FILE__) . 'vite/dist/index.js', array(), $ver, true);

    $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],
        "user" => vuespa_get_user_meat(),
    ];
    return $person;
}


//整理并提供用戶信息
function vuespa_get_user_meat()
{
    //獲取所有角色
    $editable_roles = wp_roles()->roles;
    $roles = array_keys($editable_roles);
    //獲取除了'subscriber'(訂閱者)角色之外的所有角色的用戶數據
    $subscriber_key = array_search('subscriber', $roles, true);
    if (false !== $subscriber_key) {
        $roles = array_slice($roles, 0, $subscriber_key);
    }

    $users = get_users(array('role__in' => $roles));

    //轉為關聯數組
    $user_data = array_map(function ($user) {
        return [
            'id'   => $user->ID,
            'name' => $user->display_name,
        ];
    }, $users);

    return $user_data;
}

interface.php

<?php
//interface.php
//接口文件
function vuespa_create_api()
{
    register_rest_route('pf/v1', '/get_option/', array( // 完整命名空間為:/wp-json/pf/v1/
        'methods' => 'POST',
        'callback' => 'get_option_by_RestAPI',
    ));
    register_rest_route('pf/v1', '/update_option/', array( // 完整命名空間為:/wp-json/pf/v1/
        'methods' => 'POST',
        'callback' => 'update_option_by_RestAPI',
        'permission_callback' => function () {
            return current_user_can('manage_options'); // 只有管理員才有權限修改
        },
    ));
}
add_action('rest_api_init', 'vuespa_create_api');


//讀取Option
//僅支持一對一的數據請求
function get_option_by_RestAPI($data)
{
    //將傳遞數據轉成數組類型
    $dataArray = json_decode($data->get_body(), true);
    //新建數組
    $return = array();
    //循環獲取對應選項ID的值,并將其存儲在對應關聯數組中,若拿不到值,則為空
    foreach ($dataArray as $option_name => $value) {
        $return[$option_name] = get_option($option_name) ? get_option($option_name) : "";
    }
    return $return;
}


//保存Option
function update_option_by_RestAPI($data)
{

    //判斷是否是管理員
    if (current_user_can('manage_options')) {
        //轉為JSON對象 - 重點,這里沒有true,是轉為對象
        $dataArray = json_decode($data->get_body());
        //存儲結果
        $result = new stdClass();

        //循環保存選項
        foreach ($dataArray as $option_name => $value) {

            //判斷,是否為對象
            if (is_object($value)) {
                //是非空數組,循環保存值
                foreach ($value as $arr => $data) {
                    //更新值    
                    update_option($arr, $data);
                }
            } else {
                //不是對象,則表示只有一個選項需要保存。
                update_option($option_name, $value);
            }
            $result->$option_name = $value;
        }

        //返回成功信息
        return new WP_REST_Response(array(
            'success' => true,
            'message' => "已保存!"
        ), 200);
    } else {
        //返回失敗信息
        return new WP_Error('save_error', '保存失敗!', array('status' => 500));
    }
}

index.js

//vite/dist/index.js
console.log(dataLocal.data.user);
const App = {
  setup() {
    

    //存儲傳來的值
    const siteData = dataLocal.data;

    //存儲選項值
    const datas = Vue.reactive({
      dataOne: "",
      dataTwo: "",
      dataName: [],
    });

    //獲取數據
    const vuespa_get_option = () => {
      axios
        .post(dataLocal.route + "pf/v1/get_option", datas, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
            "Content-Type": "application/json",
          },
        })
        .then((response) => {
          const data = response.data;
          datas.dataOne = data.dataOne;
          datas.dataTwo = data.dataTwo;
          datas.dataName = data.dataName;
        })
        .catch((error) => {
          window.alert("連接服務器失敗或后臺讀取出錯!數據讀取失敗");
          console.log(error);
        });
    };

    //保存數據
    const vuespa_update_option = () => {
      axios
        .post(dataLocal.route + "pf/v1/update_option", datas, {
          headers: {
            "X-WP-Nonce": dataLocal.nonce,
          },
        })
        .then((response) => {
          alert("保存成功");
        })
        .catch((error) => {
          alert("保存失敗");
          console.log(error);
        });
    };

    //頁面初始加載
    Vue.onMounted(() => {
      console.log("簡簡單單");
      vuespa_get_option();
    });

    return { datas, siteData, vuespa_update_option };
  },
  template: `
  文本框1:<input type="text" v-model="datas.dataOne"><br/>
  文本框2:<input type="text" v-model="datas.dataTwo"><hr/>
  
  用戶選擇:<select v-model="datas.dataName" multiple>
  <option v-for="option in siteData.user" :key="option.id" :value="option.id">
      {{ option.name }}
  </option>
</select>
<p>你選擇了:{{ datas.dataName }}</p><br/>
按住command(control)按鍵即可進行多選<hr/>
    <button class="button button-primary" @click="vuespa_update_option">保存</button>`,
};

Vue.createApp(App).mount("#vuespa");
??
Npcink上的部份代碼及教程來源于互聯網,僅供網友學習交流,若您喜歡本文可附上原文鏈接隨意轉載。
無意侵害您的權益,請發送郵件至 1355471563#qq.com 或點擊右側 私信:Muze 反饋,我們將盡快處理。
?
購物車
優惠劵
搜索
久久精品国产99国产精品免费看_中文成人在线_日本在线播放视频_精品国产一区二区三区在线观看

    9000px;">

      日韩福利小视频| 国产肉体xxxx裸体784大胆| 精品人妻无码一区二区三区蜜桃一| 亚洲第一香蕉网| 精品人妻一区二区三区四区不卡| 中文字幕永久免费视频| 欧美三级 欧美一级| 91狠狠综合久久久久久| 午夜免费看毛片| 日本猛少妇色xxxxx免费网站| 国产sm主人调教女m视频| 亚洲黄色a级片| 亚洲18在线看污www麻豆| 日韩在线不卡av| 欧美激情国内自拍| 久久久久久av无码免费看大片 | 人妻精品久久久久中文| 亚洲综合自拍网| 日韩精品成人在线| 肉色超薄丝袜脚交69xx图片| 精品视频久久久久| 精品人妻无码一区二区性色 | 青青操在线视频观看| 中国美女黄色一级片| 亚洲无码精品一区二区三区| 69国产精品视频免费观看| 丰满熟女一区二区三区| 欧美 日韩 精品| 亚洲国产av一区二区| 成人羞羞国产免费图片| 免费一级suv好看的国产网站| 午夜一区二区三区四区| www.久久国产| 欧美在线视频第一页| 亚洲欧美精品久久| 国产亚洲视频一区| 我不卡一区二区| 国产sm主人调教女m视频| 欧美三级一区二区三区| 亚洲欧洲日韩综合| 久久精品视频在线观看免费| 一区二区三区免费观看视频| 五月婷婷色丁香| 国产浮力第一页| 色综合五月婷婷| 国产成人在线免费观看视频| 日韩美女一级片| 国产伦精品一区二区三区免.费| 日韩aaaaa| 国产精品久久久久久亚洲色| 日韩一级片免费在线观看| 97人妻天天摸天天爽天天| 人妻人人澡人人添人人爽| 99久久免费国产精精品| 青春草免费视频| av黄色免费网站| 日本一区二区三区精品| 欧美精品一二三四区| 日韩av.com| 99精品中文字幕| 久草视频在线免费| 在线观看亚洲欧美| 国产麻豆剧传媒精品国产| 久草中文在线视频| 亚洲国产综合一区| 精品毛片一区二区三区| 亚洲av片在线观看| 黄色精品视频在线观看| 特级西西444www大精品视频免费看| 91网站免费视频| 免费在线观看黄网站| 亚洲专区在线播放| 国产夫妻自拍av| 日本网站在线免费观看| 国产黄色片在线| 亚洲国产精品成人久久蜜臀| 一区二区久久精品| 99热在线观看免费精品| 色av性av丰满av| 亚洲av无码片一区二区三区| 国产白丝一区二区三区| www.毛片com| av女人的天堂| 黄色永久免费网站| 精品一区二三区| 美女的奶胸大爽爽大片| 一级做a爰片久久毛片| 麻豆精品国产免费| 最新中文字幕日本| 久久精品视频免费在线观看| 精品人妻久久久久一区二区三区| 中文字幕日韩国产| 日本黄色特级片| 久久久国产精品成人免费| 国产黄色的视频| 日韩熟女一区二区| 精品一区二区三区四| 国产精品久久久久久亚洲色| 2018国产精品| 一级黄色大片免费观看| 无码人妻精品一区二| 少妇久久久久久被弄高潮| 日韩免费视频网站| 日韩成人免费在线视频| 日韩a级片在线观看| 天天摸天天干天天操| 人妻激情偷乱频一区二区三区| 久久99久久99精品免费看小说 | 人妻一区二区视频| 久久精品这里有| 久久人妻免费视频| 欧美一级免费片| 日韩中文字幕高清| 日韩人妻无码一区二区三区99 | 久久久国产免费| 国产伦子伦对白视频| 岛国毛片在线观看| 好男人www在线视频| 欧美精品欧美极品欧美激情| 天天干视频在线| 中文字幕在线观看精品| 成 人 黄 色 片 在线播放| 国产精品伦理一区| 免费一级特黄录像| 情侣偷拍对白清晰饥渴难耐| 成年人三级黄色片| 久久丫精品国产亚洲av不卡| 日本人dh亚洲人ⅹxx| 老鸭窝一区二区| 日韩免费成人av| 69久久久久久| 最近中文字幕免费| 亚洲图片在线视频| 日韩a级片在线观看| 国产区精品在线| 精品伦精品一区二区三区视频密桃 | 国产裸体永久免费无遮挡| 国产免费一区二区三区免费视频| 精品国产乱码一区二区| 免费人成年激情视频在线观看| 人妻少妇一区二区三区| 中文字幕在线综合| 欧美高清精品一区二区| 最近国语视频在线观看免费播放 | 亚洲综合中文网| 久久久久性色av无码一区二区| 在线观看国产黄| 久艹视频在线观看| 亚洲综合网av| 日本欧美一区二区三区不卡视频| 992tv人人草| 手机在线中文字幕| 欧美福利在线视频| 国产无遮挡猛进猛出免费软件| 思思久久精品视频| 黄色国产在线视频| va视频在线观看| 中文字幕在线视频第一页| 欧美一级视频在线| 黄色国产在线视频| www.色偷偷.com| 亚洲av无码一区二区乱子伦| 美女又爽又黄视频毛茸茸| www.亚洲欧美| 亚洲精品久久久久久久久久| 中文字幕第88页| 一级黄色大毛片| 亚洲欧美高清在线| 天天干视频在线| 亚洲免费av一区| 手机看片久久久| 视频免费1区二区三区| 国产精品高潮呻吟久久久| 中文字幕日韩综合| 日韩国产第一页| 五月天色婷婷丁香| 国产黄色小视频在线观看| 日韩中文字幕观看| 国产激情av在线| 中文在线a天堂| 久久久久久久久久一区二区三区| 中文字幕乱码在线| 内射后入在线观看一区| av在线资源观看| 三级性生活视频| 欧美一级特黄高清视频 | 最近中文字幕免费在线观看| 亚洲精品男人天堂| 国产jk精品白丝av在线观看| 亚洲熟妇一区二区三区| 亚洲视频在线观看一区二区三区 | 国产一区二区三区四区视频| 亚洲五月天综合| 亚洲一区二区三区网站| 中文无码av一区二区三区| 99久久一区二区| 97人人澡人人爽人人模亚洲| 亚洲精品国产精品乱码不卡| 中文人妻一区二区三区| 一区二区不卡视频在线观看|