「Wordpress 外挂开发」代客下单最终章,观察经手人

加入 Autocomplete

原本是打算做email与公司的匹配,不过觉得在这个的逻辑上打转,基本上是在写JS,这一点我就只写出输出客人该拿到的资料filter代替js的输出,而autocomplete可以藉由jquery Autocomplete来达到。

我们设定filter可以对应撰写来做list的资料取得,并且将我们的料locaization到我们的script之中,就可以获得,而我们也在users之中,将不必要的资讯给拿掉,只留我们需要的Id,company name与 email。


add_filter('go_ranger_retreive_shop_client','go_ranger_shop_client_list',10);

function go_ranger_shop_client_list(){
  if(false === current_user_can('god-mode')) return array();
  $users = get_users();
  $result = array();
  foreach($users as $user){
    $_temp = array(
      'id' => $user->id,
      'email' => $user->user_email,
      'company' => $user->company,
    );
    array_push($result,$_temp);
  }
  return $result;
}

enququ script

而我们对应的的list,只需要将我们的资料藉由wp_localize_script做引入即可,而如果资料是动态的,可以藉由ajax的功能来做到动态autocomplete,而我们也设定了gr_do_script_init将全部外挂需要注册的script都统一由这个action来达成。

add_action('init','go_ranger_script_init');

function go_ranger_script_init(){
  do_action('gr_do_script_init');
}

add_action('gr_do_script_init','gr_do_regist_script_init' , 10 , 0);

function gr_do_regist_script_init(){
    wp_register_script(
        'go-ranger-autcomplete',                
        plugin_dir_url( __FILE__ ) . '/assets/autcomplete.min.js',  
        array(),                                
        '4.11.2',                                
        true                                  
  );
}

add_filter('woocommerce_after_checkout_billing_form','before_go_ranger_bill_fileds',10,1);

function before_go_ranger_bill_fileds($user){
    wp_enqueue_script( 'go-ranger-autcomplete' );
    $users = apply_filters('go_ranger_shop_client_list');
    wp_localize_script( 'go-ranger-autcomplete', 'user_name', $users );

}

替你的客人下订单

那我们重头戏,就是将autocomplete後的选择,在选择之後写入,而我们最先就是将输入的选择写进我们的metakey之中,而我们在点击後,可以直接将项目的值设定成ID,则可以较容易做sanitize并且做好处理。


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',
      );
  $fields['shop_for_whom'] = array(
				'label'		=> '顾客名称',
				'required'	=> true,
				'class'		=> array( 'form-row-wide' ),
				'clear'		=> true,
				'priority'	=> 150,
				'type'		=> 'autocomplete',
      );
      
}

add_filter( 'woocommerce_checkout_customer_id', 'go_ranger_set_user_id' );

function go_ranger_set_user_id( $user_id ) {
  if ( page_role_permission() ) {
    if ( 'yes' === $_POST['billing_god_mode'] && isset($_POST['shop_for_whom']) ) {
      if(user_id_exists($_POST['shop_for_whom'])) return $_POST['shop_for_who,']
      else return 0;
    }
  }
  return $user_id;
}

function user_id_exists($user_id){
    if(false === is_integer($user_id)) return false;
    $user = get_userdata( $user_id ); 
    if (false === $user) return false;
    return true;
}

正确显示在後台的订单之中

而我们成功将资料传入後,我们的後台还是会显示原本的资讯,所以我们需要一点更动才能来完整我们的程序码,而我们需要有个注记是这一笔订单是由哪个使用者完成的,所以我们先将woocommerce_checkout_update_order_meta来处理当钱页面的post,也可以取得我们的order_ud,加入我们的处理meta,在woocommcer三代之後,meta_data有做更新,一率都要做save,不然他并不会改变。

  add_action( 'woocommerce_checkout_update_order_meta', 'go_ranger_add_proccess_man', 10, 2 );
  
	function go_ranger_add_proccess_man( $order_id, $data ) {
		if ( page_role_permission() ) {
			if ( 'yes' == $_POST['billing_god_mode'] ) {
        $order = wc_get_order( $order_id );
        $order->update_meta_data( 'go_ranger_procees_man', get_current_user_id() );
        $order->save();
			}
		}
	}

加入处理男子的问题後,我们就来将我们後台可以显示我们的经手人的资讯来做显示

add_action( 'woocommerce_admin_order_data_after_order_details', 'gr_add_prcoess_man_admin' );
function gr_add_prcoess_man_admin( $order ) {
  $procees_man_id = $order->get_meta( 'go_ranger_procees_man' )
  if ( isset($procees_man_id)) {
    $user = get_user_by( 'ID', $procees_man_id );
    ?>
    <p class="flex f-1">
      <label>此单为代客下单</label>
    </p>
    <?php 
    if(isset($user)){
      echo '此单由'.$user->display_name.'所负责。';
    }}
  }
}

如此,我们又可以省49元去买这个小外挂了XD

後记

三十天内,共写了四个小外挂,之後还是会在公司的其他地方继续更新,感谢公司Formosa Screens让我可以在上班的一些时间准备铁人赛的东西,还拿了一些小side project改成文章来讲解。

Wordpress的外挂相信很有竞争力,世界23%的占有率,是个非常可观的数字,相对应大型的外挂会有相对应的扩充,而我觉得很可惜的是很多台湾的传统产业(澳洲传产也是不e化),是非常适合走wordpress的路线来经营线上化,而不是唯一的电子化只有使用line而已。

之前跟客户的it聊过天,他们讶异说计算库存这些东西,与零售业者不依样,传产的IT因为没办法做到精准(可以,但是你不能想像做砖头的是好几个产线的机械手臂吧),只能用估算值加上offset来做到,而在耗材管理是可以与印表机服务器这些连接,看看1998年netflix的成立初秋,网路下单印表机就可以啪嗒啪嗒的印了,怎麽我订个一吨的六边铝挤型还得要email个好几封来做确认,流程都需要被简化的(尤其是那些窗口像是鬼打墙完全无法沟通),不过我们都知道问题不是出在这些上,是出在经营者的想法之中,我们能做的就是尽力推广,等到他们发现周围的人都开始使用,他们或许会考虑花个几千块做个简单的线上系统试试。

之前某个客户,买下了约300坪的小工厂,砸钱不手软,花了十万要来做耗材的管理这电子化,不过现在还没听到完成了多少,传产在迈向下一代需要的事情,还是得先把MVP做好,再来谈你要多炫炮的功能,不然什麽都没有,我从2018年就听到了,现在还是没有听到他们上线,帮这一家公司加油。

对了,明天终於可以不用每天操文章了,爽啦!

reference

woocommerce_form_field()
Shop as a Customer for WooCommerce
shop as a customer for woo - docs
cxthemes - Shop as Customer for WooCommerce Documentation
creativelittledots/woocommerce-shop-as-customer-discount


<<:  Day 29 - 从大学肄业,联成电脑,到 Microsoft MVP 得奖,从零开始的软件工程师

>>:  [第29天]30天搞懂Python-HTTP POST

Day 27 自订路由

我们平常建立的路由都是MaterialPageRoute,但当我们需要改变风格或是转场效果时,就需要...

Day30 深入解析Elasticsearch Query DSL Match query Part3

Hello大家, 今天就是铁人赛的最後一天了, 所有友参加的大大们今天就是大家都完成的一天, 恭喜大...

Bridge 桥接器模式

今天的桥接器模式,和昨天的转接器模式一样,都是非常常见的模式,可能我们不自觉当中都会使用到。话不多说...

[Day3]-if叙述

if…else叙述,基本格式为: if(条件): 条件成立时执行 else: 条件不成立时执行 i...

Day 03-Terraform State 之你的 Local State 不是我的 State

Terraform State 之你的 Local State 不是我的 State State 是...