久久精品国产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");

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

    国模大胆一区二区三区| 午夜精品久久| 国产精品视频免费一区| 午夜欧美电影在线观看| 亚洲国产高清自拍| 国产模特精品视频久久久久| 午夜精品影院| ●精品国产综合乱码久久久久| 欧美阿v一级看视频| 亚洲午夜精品久久久久久app| 国内外成人在线| 夜夜嗨一区二区三区| 国产亚洲综合性久久久影院| 欧美日本国产一区| 久久人人爽人人爽| 亚洲永久在线| 亚洲图片在线| 亚洲毛片在线看| 欧美成人福利视频| 国产一区二区三区久久久| 亚洲国产高清一区| 国产无遮挡一区二区三区毛片日本| 日韩一级精品| 亚洲国产精品999| 国产综合色精品一区二区三区| 国产精品h在线观看| 欧美顶级艳妇交换群宴| 美女久久网站| 久久亚洲综合色一区二区三区| 欧美一区二区视频在线观看2020| 亚洲视频成人| 妖精视频成人观看www| 欧美日韩国产不卡在线看| 久久一二三国产| 久久伊伊香蕉| 久久手机免费观看| 亚洲激情网站| 亚洲精品社区| 亚洲欧洲一区二区天堂久久| 亚洲伦理中文字幕| 亚洲女同在线| 久久成人免费| 免费日韩av| 你懂的一区二区| 欧美日韩一区二区三区四区在线观看 | 欧美性大战久久久久久久蜜臀| 欧美日在线观看| 欧美日韩精品一区二区| 欧美午夜免费影院| 国产伦精品一区二区三区| 国产欧美69| 欧美成人伊人久久综合网| 亚洲免费在线播放| 久久av一区| 免费在线成人av| 欧美日韩视频在线观看一区二区三区 | 欧美日韩午夜在线视频| 国产精品激情偷乱一区二区∴| 国产精品国产三级欧美二区 | 国产精品日韩欧美| 狠狠色狠狠色综合日日五| 激情亚洲网站| 亚洲狼人精品一区二区三区| 亚洲影院免费| 在线日韩欧美视频| 在线视频日本亚洲性| 欧美一区二区三区在| 欧美国产亚洲另类动漫| 国产欧美精品va在线观看| 韩国成人精品a∨在线观看| 日韩一区二区精品葵司在线| 欧美一区二区三区四区在线观看| 欧美精品色综合| 黑人巨大精品欧美一区二区小视频| 亚洲日本成人| 久久国产精彩视频| 欧美三级在线| 91久久香蕉国产日韩欧美9色| 亚洲男女毛片无遮挡| 欧美激情第三页| 国产一二三精品| 欧美日韩国产精品成人| 你懂的亚洲视频| 国产精品一区二区你懂得| 91久久精品一区二区三区| 亚洲一区高清| 国产精品久久久一区麻豆最新章节| 日韩视频不卡| 欧美国产乱视频| 亚洲韩国青草视频| 亚洲全部视频| 美女任你摸久久| 尤物九九久久国产精品的分类| 午夜日韩视频| 久久综合导航| 黄色av一区| 久久久99国产精品免费| 久久亚洲高清| 国产欧美一区二区精品性 | 国产精品日日摸夜夜摸av| 国产乱码精品一区二区三区av| 亚洲午夜精品国产| 国产精品免费一区豆花| 午夜精品亚洲| 国精品一区二区| 欧美成人免费大片| 亚洲欧洲免费视频| 欧美日韩国产色综合一二三四| 欧美亚韩一区| 国产农村妇女精品一区二区| 亚洲一区视频| 狂野欧美激情性xxxx| 国产精品有限公司| 久久精品91久久久久久再现| 伊人夜夜躁av伊人久久| 久久精品综合| 国产在线欧美日韩| 蜜臀99久久精品久久久久久软件 | 香蕉av福利精品导航| 国产无一区二区| 久久久女女女女999久久| 韩国一区电影| 欧美日韩精品二区第二页| 中文精品视频| 国产亚洲毛片| 欧美阿v一级看视频| 亚洲一区国产精品| 国产在线欧美| 一区二区三区鲁丝不卡| 另类天堂av| 一区二区黄色| 国产伦精品一区二区| 模特精品裸拍一区| 亚洲欧美视频在线观看| 欧美日韩精品久久久| 亚洲一区二区三区四区五区黄 | 久久国产精品久久w女人spa| 亚洲国产精品嫩草影院| 欧美视频在线看| 久久久亚洲国产天美传媒修理工 | 欧美精品情趣视频| 久久不见久久见免费视频1| 亚洲人成人一区二区三区| 欧美午夜精品久久久久久浪潮| 欧美伊人久久大香线蕉综合69| 精品动漫3d一区二区三区免费版 | 亚洲日韩视频| 国产在线观看91精品一区| 欧美午夜片在线免费观看| 久久久久se| 午夜久久电影网| 中文欧美在线视频| 亚洲人精品午夜| 一区二区在线不卡| 国产亚洲欧美日韩精品| 国产精品区一区二区三| 亚洲一区二区高清| 亚洲巨乳在线| 亚洲人成网站在线播| 国产美女搞久久| 国产精品久久久久久久久| 亚洲欧美一区二区三区久久| 亚洲国产精品久久久久秋霞影院 | 国产一区二区黄| 国产精品一区二区三区久久久 | 欧美视频一区在线观看| 欧美激情一区二区三区高清视频| 狂野欧美一区| 噜噜噜在线观看免费视频日韩| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲人成高清| 亚洲激情社区| 最近中文字幕日韩精品| 最新成人在线| 日韩一级在线| 亚洲精品视频在线看| 亚洲黄色尤物视频| 亚洲精品三级| 亚洲一区二区动漫| 小黄鸭视频精品导航| 久久女同互慰一区二区三区| 玖玖综合伊人| 欧美伦理影院| 亚洲欧美日韩国产| 午夜精品在线看| 久久激情五月丁香伊人| 久久男人资源视频| 欧美成人在线免费视频| 欧美日韩在线播放一区| 国产精品国产自产拍高清av王其 | 亚洲一区精品电影| 午夜久久电影网| 久久青草久久| 欧美女人交a| 国产精品视频xxxx| 狠狠色狠狠色综合日日tαg| 又紧又大又爽精品一区二区| 亚洲精品久久久一区二区三区| 一区二区三区精品视频| 久久国产免费|