woocommerce 学习

controller

  • 页面加载例子

    function woocommerce_account_orders( $current_page ) {
      $current_page = empty( $current_page ) ? 1 : absint( $current_page );
      $customer_orders = wc_get_orders( apply_filters( 'woocommerce_my_account_my_orders_query', array( 'customer' => get_current_user_id(), 'page' => $current_page, 'paginate' => true ) ) );
    
      wc_get_template(
        'myaccount/orders.php',
        array(
          'current_page' => absint( $current_page ),
          'customer_orders' => $customer_orders,
          'has_orders' => 0 < $customer_orders->total,
        )
      );
    }
    
  • wc_get_template 传入 array 参数,可以被业面直接使用。

支付处理

  • 处理 ipn 响应
class WC_Gateway_Paypal_IPN_Handler extends WC_Gateway_Paypal_Response
  • 更新 order metadata 状态
update_post_meta( $order->id, 'Payment type', $transaction_result['payment_type'] );
  • 发送邮件方法
$mailer = WC()->mailer();
$message = $mailer->wrap_message( $subject, $message );
$mailer->send( ! empty( $new_order_settings['recipient'] ) ? $new_order_settings['recipient'] : get_option( 'admin_email' ), strip_tags( $subject ), $message );
  • 订单成功 hook
function wc_paying_customer( $order_id ) {
  $order = wc_get_order( $order_id );

  if ( $order->user_id > 0 && 'refund' !== $order->order_type ) {
    update_user_meta( $order->user_id, 'paying_customer', 1 );

    $old_spent = absint( get_user_meta( $order->user_id, '_money_spent', true ) );
    update_user_meta( $order->user_id, '_money_spent', $old_spent + $order->order_total );
  }
  if ( $order->user_id > 0 && 'simple' === $order->order_type ) {
    $old_count = absint( get_user_meta( $order->user_id, '_order_count', true ) );
    update_user_meta( $order->user_id, '_order_count', $old_count + 1 );
  }
}
add_action( 'woocommerce_order_status_completed', 'wc_paying_customer' );
  • 查找商品

商品的本质是一个 post,wc 通过 product_factory 把 post 转换成 product。 post 中保存了 product id 和 classname,通过反射创建了 product 对象。

$query_args = array(
  'fields'      => 'ids',
  'post_type'   => 'product',
  'post_status' => 'publish',
  'meta_query'  => array(),
);
$query = new WP_Query( $query_args );
$products = array();
foreach ( $query->posts as $product_id ) {
  $products[] = wc_get_product($product_id);
}

常用开发技术

  • Qt :桌面开发工具
    • C++
    • sqlite:数据库设计和优化
    • webengine:网页相关处理
  • WordPress :快速建站首选工具
    • PHP
    • CSS:前端修改
    • Javascript
    • WooCommerce:利用 WordPress 快速搭建商务平台
    • Plugin
    • Theme
  • Java :后台性能优化备选方案
    • J2EE
    • Spring
    • SrpingMVC
    • Hibernate
  • Android
  • ios
  • Server :服务器搭建
    • ubuntu
    • nginx
    • tomcat
    • linode
    • namecheap

Java 学习日志 1

  • 在 IDEA 中调试 spring mvc,Tomcat 总是提示找不到资源。从 stackoverflow 上查到,将 JDK 从 1.8 改成 1.7,问题解决。
  • 点 Form 提交按钮,对应的接收函数没有被断住在 IDEA 里设置部署路径不是根目录,而 jsp 中跳转路径的部署目录是根目录。
  • 点 Form 提交按钮,总是返回请求非法。因为 Form 表单中某个类型与接收函数参数的类型不一致。添加 log4j 打印 spring 异常后,显示无法从 java.util.Date 自动转换成 java.sql.Date。把代码中 import java.sql.Date 都换成 import java.util.Date 后,问题解决。这是 IDEA 自动添加导入导致的问题。成

MAC 系统初体验

使用的是 macbook air 11,没有 retina 屏,少了很多乐趣,只能体验一下系统。不想花太多时间深度使用,只安装了一些常用软件,做了简单体验。

屏幕是 16:9 的,不是 retina 屏幕,完全没有优势。高度少了一大截,还不如手头正在用的 Thinkpad X200 16:10 屏幕。

输入法不习惯,虽然有 MAC 版本的 QQ 五笔,但设置跟 WIN 上完全不一样。没有分号快捷输入;默认经常是中文输入状态;无法通过 shift 选择二三字。

  • 清歌输入法支持分号模式。

Alfred 没有传说中那么神奇,大概因为没有深度发掘它的功能吧。

Docker 放在屏幕下方太占空间,拖到左边,并且设置成自动隐藏。原来在 WIN 下经常安装软件模拟 Docker,到了 MAC 下,反而不想用了。

键盘不习惯,布局跟美式 101 相差太多。键盘手感也不好。没有小红点不习惯。触控板绝对是亮点。用了一段时间,熟悉触控操作和快捷键后,主要操作没有什么问题,基本上手。

百度云盘跟 WIN 下完全不一样,同步方式比较像 WIN 下的快盘。使用倒没有什么问题。

MAC 版本的迅雷是个渣渣,同一个网络,竟然比 WIN 下版本下载慢很多。

Emacs 一如既往地好用。自带 emacs 是 22.1 版本,太老了。从 emacsformacosx.com 下载安装 25.0 版本,用 git 下载 spacemacs 配置,很快就能正常使用。字体要要调整,英文用 Manaco,中文用 STHeiti,渲染效果一般,不比 WIN 下强多少,跟 Ubuntu 比较相似。

  • 修改命令行下 emacs 默认版本:
alias emacs="/Applications/Emacs.app/Contents/MacOS/Emacs"
  • 安装 seil,设置 capslock 键为 constrol
  • 交换 option 和 command 键
(setq mac-command-modifier 'meta)
(setq mac-option-modifier 'super)
  • 设置字体
(setq fj/en-font "Monaco"
      fj/en-font-size 13
      fj/cn-font "STHeiti-15")

VPN 的安装折腾了一会,主要有两点要注意:

  • 网络配置是有优点级的,需要把 VPN 连接放到最前面。
  • MTU 大小设置成 1280.

重量和大小基本满意,再大再重就没什么意思了,最好能代替 ipad 的日常使用。这个本子如果边框窄点,屏幕大点,加上触控功能,就完美多了。CPU 正常使用没有问题,估计编译大程序会比较吃力。