iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 29
0
自我挑戰組

Wordpress 外掛開發系列 第 29

「Wordpress 外掛開發」替你的上帝下訂單,上帝模式撰寫

  • 分享至 

  • xImage
  •  

我們最後一個主題,也是基於woocommerce,要製作出可以在bill的部分製作出可以代替別人製做清單,而這個的好處是如果你有相對應得invoice或者是其餘複雜的訂單生產,你是可以藉由所謂的特殊訂單,來支援我們下的特殊訂單,而這個訂單也是可以在meta之中加入特別的輸入,來與你的後續整合系統一起整理,而我們的後續wc_order再來做更新與載入來操作未來可能整合系統的必要資料。


btw,顧客就是上帝,上帝模式就是顧客模式

檢查是否可以運作

你可以在很多的外掛中看見,有些外掛是基於一個個體衍生出來的擴充套件,而我們能做到的是去取得是否有這個外掛與他是否已經被啟動了,如果沒有就可以直接return值了,避免出現奇怪錯誤,而如果我們沒有偵測到,則可以在後台顯示為偵測到woocommerce被啟動或安裝,來提醒開發環境出的錯誤。


add_action('init','go_ranger_check_woo');

function go_ranger_check_woo(){
  if(in_array( 'woocommerce/woocommerce.php',  get_option( 'active_plugins'))) go_ranger_do_init();
  else wp_notice('danger','[go_ranger_check_woo] 你沒安裝或啟動wooCommerce');
}

權限判斷與頁面判斷

而我們如果只有admin可以使用的話,我們還需要增加,不過外掛的邏輯操作,可以由系統創造新的caps來做控管,我們姑且稱caps叫做god_mode,而我們得使用者,如果他們的caps有符合可以使用,則可以載入外掛的內容進行操作,反之則就不顯示,也不出現任何的提醒事項。


function page_role_permission(){
  if(false === is_checkout()) return false;
  if(false === current_user_can('god_mode')) return false;
  return true;
}

function go_ranger_do_init(){
  if(false === page_role_permission()) return;
}

加入我們的新表格

而取代原本的woocommerce 帳單的位置,我們需要動用到woocommerce_billing_fields來做新增刪除,而他的原始fields來做操作,這個filter與其餘操作的fileds依樣,基本上原生的wordpress在輸出表格或是選單,一並都是陣列來做操作,只要填對key並且確定相對應的filter回傳後,是會將整張陣列印出,就可以直接來做設定。


add_filter('woocommerce_after_checkout_billing_form','go_ranger_bill_fileds',9999,1);

function go_ranger_bill_fileds(){
  if(false === page_role_permission()) return;
  $fields['billing_god_mode'] = array(
				'label'		=> '上帝模式?',
				'required'	=> true,
				'class'		=> array( 'form-row-wide' ),
				'clear'		=> true,
				'priority'	=> 150,
				'type'		=> 'select',
				'options'	=> array(
					'yes'	=> '好',
					'no'	=> '先不用',
				),
				'default'	=> 'yes',
      );
      
}

本來預計是使用woocommerce_before_checkout_billing_form來增加我們是否開啟上帝模式,但是發現上面這個filter可以整進一整個form,可以省三四十行程式碼,立馬砍掉放上去!

接收回傳

那我們在最後,針對checkout的hook做加入新的filter,並且修改成是遊客的下單就大功告成!而明天預計會把user中的會員加入到這個hook之中,並且輸入名稱(或是公司名稱)的autocomplete的介面,讓上帝模式更加順手,而這就可以進行做woocommerce_checkout_customer_id的,來將他設定成guest,而我們這邊的使用也可以變成user_id來當作我們設定轉換之對象,而之後如果有轉換的會員,我們則需要使用woocommerce_checkout_update_order_meta來將我們的user_ID更新到我們的meta之中。

add_filter( 'woocommerce_checkout_customer_id', 'go_ranger_set_user_id' );
function go_ranger_set_user_id( $user_id ) {
  if ( page_role_permission() ) {
    if ( isset( $_POST['billing_god_mode'] ) && 'yes' === $_POST['billing_god_mode'] ) {
      return 0;
    }
  }
  return $user_id;
}

簡單的設定,我們就能做出捉刀下單的功能,而我們明天是30天的最後一天,明天有幾個功能做完,來完整我們整個外掛,明天的外掛,不過目前在做autocomplete遇到一點奇怪的bug,所以今天的篇幅比較短一點,不過我們依照我們的邏輯,如果email有存在的話,則可以在資料庫中找回我們的使用者ID,我看線上的替人下單的功能外掛,是有做到幫人創建一個新的帳號,不過我覺得是不主張有這個功能,所以就不去想該怎麼做了。

而我覺得在這個裡頭,除了上述說道用公司名稱來做搜尋之外的主要功能,我們也可以將admin的付費直接轉到銀行轉賬的選項,這邊會操作到woocommerce_available_payment_gateways來做,今晚蘋果發表,就配著新的iphone 12影片,繼續好好努力吧!希望mac OS可以把 daisy chain給支援,不然我的電腦都要差兩條線真的不是讓人很爽qq

reference

Woocommerce: ATTRIBUTE FILTERS DO NOT APPEAR
WooCommerce Visual Hook Guide: Checkout Page


上一篇
「Wordpress 外掛開發」多重roles延伸版本,你還需要自定義roles
下一篇
「Wordpress 外掛開發」代客下單最終章,觀察經手人
系列文
Wordpress 外掛開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言