$queryStr .= 'AND do_visible = true '; // 表示状態
$queryStr .= 'AND do_language_id = ? ';
$queryStr .= 'AND do_set_id = ? ';
- $queryStr .= 'ORDER BY do_index ';
+ $queryStr .= 'ORDER BY do_index ';
$retValue = $this->selectRecords($queryStr, array($langId, $setId), $rows);
return $retValue;
}
* @param function $callback コールバック関数
* @return なし
*/
- function getActiveDelivMethod($langId, $setId, $callback)
+/* function getActiveDelivMethod($langId, $setId, $callback)
{
$queryStr = 'SELECT * FROM delivery_method_def ';
$queryStr .= 'WHERE do_deleted = false ';
$queryStr .= 'AND do_set_id = ? ';
$queryStr .= 'ORDER BY do_index ';
$this->selectLoop($queryStr, array($langId, $setId), $callback);
+ }*/
+ /**
+ * 実行可能な支払方法を取得
+ *
+ * @param string $langId 言語
+ * @param int $setId セットID
+ * @param array $rows 取得レコード
+ * @return bool 1行以上取得 = true, 取得なし= false
+ */
+ function getActivePayMethodRows($langId, $setId, &$rows)
+ {
+ $queryStr = 'SELECT * FROM pay_method_def LEFT JOIN _iwidgets ON po_iwidget_id = iw_id AND iw_deleted = false ';
+ $queryStr .= 'WHERE po_deleted = false ';
+ $queryStr .= 'AND po_visible = true '; // 表示状態
+ $queryStr .= 'AND po_language_id = ? ';
+ $queryStr .= 'AND po_set_id = ? ';
+ $queryStr .= 'ORDER BY po_index ';
+ $retValue = $this->selectRecords($queryStr, array($langId, $setId), $rows);
+ return $retValue;
}
/**
* 商品情報を取得
--- /dev/null
+<?php
+
+if ( ! defined( 'ABSPATH' ) ) {
+ exit; // Exit if accessed directly
+}
+
+/**
+ * Cash on Delivery Gateway.
+ *
+ * Provides a Cash on Delivery Payment Gateway.
+ *
+ * @class WC_Gateway_COD
+ * @extends WC_Payment_Gateway
+ * @version 2.1.0
+ * @package WooCommerce/Classes/Payment
+ * @author WooThemes
+ */
+class WCPaymentGateway extends WC_Payment_Gateway {
+
+ /**
+ * Constructor for the gateway.
+ */
+ public function __construct() {
+ // Setup general properties
+ $this->setup_properties();
+
+ // Load the settings
+ $this->init_form_fields();
+ $this->init_settings();
+
+ // Get settings
+ $this->title = $this->get_option( 'title' );
+ $this->description = $this->get_option( 'description' );
+ $this->instructions = $this->get_option( 'instructions' );
+ $this->enable_for_methods = $this->get_option( 'enable_for_methods', array() );
+ $this->enable_for_virtual = $this->get_option( 'enable_for_virtual', 'yes' ) === 'yes' ? true : false;
+
+ add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
+ add_action( 'woocommerce_thankyou_' . $this->id, array( $this, 'thankyou_page' ) );
+ add_filter( 'woocommerce_payment_complete_order_status', array( $this, 'change_payment_complete_order_status' ), 10, 3 );
+
+ // Customer Emails
+ add_action( 'woocommerce_email_before_order_table', array( $this, 'email_instructions' ), 10, 3 );
+ }
+
+ /**
+ * Setup general properties for the gateway.
+ */
+ protected function setup_properties() {
+ $this->id = 'cod';
+ $this->icon = apply_filters( 'woocommerce_cod_icon', '' );
+ $this->method_title = __( 'Cash on delivery', 'woocommerce' );
+ $this->method_description = __( 'Have your customers pay with cash (or by other means) upon delivery.', 'woocommerce' );
+ $this->has_fields = false;
+ }
+
+ /**
+ * Initialise Gateway Settings Form Fields.
+ */
+ public function init_form_fields() {
+ $shipping_methods = array();
+
+ foreach ( WC()->shipping()->load_shipping_methods() as $method ) {
+ $shipping_methods[ $method->id ] = $method->get_method_title();
+ }
+
+ $this->form_fields = array(
+ 'enabled' => array(
+ 'title' => __( 'Enable/Disable', 'woocommerce' ),
+ 'label' => __( 'Enable cash on delivery', 'woocommerce' ),
+ 'type' => 'checkbox',
+ 'description' => '',
+ 'default' => 'no',
+ ),
+ 'title' => array(
+ 'title' => __( 'Title', 'woocommerce' ),
+ 'type' => 'text',
+ 'description' => __( 'Payment method description that the customer will see on your checkout.', 'woocommerce' ),
+ 'default' => __( 'Cash on delivery', 'woocommerce' ),
+ 'desc_tip' => true,
+ ),
+ 'description' => array(
+ 'title' => __( 'Description', 'woocommerce' ),
+ 'type' => 'textarea',
+ 'description' => __( 'Payment method description that the customer will see on your website.', 'woocommerce' ),
+ 'default' => __( 'Pay with cash upon delivery.', 'woocommerce' ),
+ 'desc_tip' => true,
+ ),
+ 'instructions' => array(
+ 'title' => __( 'Instructions', 'woocommerce' ),
+ 'type' => 'textarea',
+ 'description' => __( 'Instructions that will be added to the thank you page.', 'woocommerce' ),
+ 'default' => __( 'Pay with cash upon delivery.', 'woocommerce' ),
+ 'desc_tip' => true,
+ ),
+ 'enable_for_methods' => array(
+ 'title' => __( 'Enable for shipping methods', 'woocommerce' ),
+ 'type' => 'multiselect',
+ 'class' => 'wc-enhanced-select',
+ 'css' => 'width: 400px;',
+ 'default' => '',
+ 'description' => __( 'If COD is only available for certain methods, set it up here. Leave blank to enable for all methods.', 'woocommerce' ),
+ 'options' => $shipping_methods,
+ 'desc_tip' => true,
+ 'custom_attributes' => array(
+ 'data-placeholder' => __( 'Select shipping methods', 'woocommerce' ),
+ ),
+ ),
+ 'enable_for_virtual' => array(
+ 'title' => __( 'Accept for virtual orders', 'woocommerce' ),
+ 'label' => __( 'Accept COD if the order is virtual', 'woocommerce' ),
+ 'type' => 'checkbox',
+ 'default' => 'yes',
+ ),
+ );
+ }
+
+ /**
+ * Check If The Gateway Is Available For Use.
+ *
+ * @return bool
+ */
+ public function is_available() {
+ $order = null;
+ $needs_shipping = false;
+
+ // Test if shipping is needed first
+ if ( WC()->cart && WC()->cart->needs_shipping() ) {
+ $needs_shipping = true;
+ } elseif ( is_page( wc_get_page_id( 'checkout' ) ) && 0 < get_query_var( 'order-pay' ) ) {
+ $order_id = absint( get_query_var( 'order-pay' ) );
+ $order = wc_get_order( $order_id );
+
+ // Test if order needs shipping.
+ if ( 0 < sizeof( $order->get_items() ) ) {
+ foreach ( $order->get_items() as $item ) {
+ $_product = $item->get_product();
+ if ( $_product && $_product->needs_shipping() ) {
+ $needs_shipping = true;
+ break;
+ }
+ }
+ }
+ }
+
+ $needs_shipping = apply_filters( 'woocommerce_cart_needs_shipping', $needs_shipping );
+
+ // Virtual order, with virtual disabled
+ if ( ! $this->enable_for_virtual && ! $needs_shipping ) {
+ return false;
+ }
+
+ // Check methods
+ if ( ! empty( $this->enable_for_methods ) && $needs_shipping ) {
+
+ // Only apply if all packages are being shipped via chosen methods, or order is virtual
+ $chosen_shipping_methods_session = WC()->session->get( 'chosen_shipping_methods' );
+
+ if ( isset( $chosen_shipping_methods_session ) ) {
+ $chosen_shipping_methods = array_unique( $chosen_shipping_methods_session );
+ } else {
+ $chosen_shipping_methods = array();
+ }
+
+ $check_method = false;
+
+ if ( is_object( $order ) ) {
+ if ( $order->get_shipping_method() ) {
+ $check_method = $order->get_shipping_method();
+ }
+ } elseif ( empty( $chosen_shipping_methods ) || sizeof( $chosen_shipping_methods ) > 1 ) {
+ $check_method = false;
+ } elseif ( sizeof( $chosen_shipping_methods ) == 1 ) {
+ $check_method = $chosen_shipping_methods[0];
+ }
+
+ if ( ! $check_method ) {
+ return false;
+ }
+
+ if ( strstr( $check_method, ':' ) ) {
+ $check_method = current( explode( ':', $check_method ) );
+ }
+
+ $found = false;
+
+ foreach ( $this->enable_for_methods as $method_id ) {
+ if ( $check_method === $method_id ) {
+ $found = true;
+ break;
+ }
+ }
+
+ if ( ! $found ) {
+ return false;
+ }
+ }
+
+ return parent::is_available();
+ }
+
+
+ /**
+ * Process the payment and return the result.
+ *
+ * @param int $order_id
+ * @return array
+ */
+ public function process_payment( $order_id ) {
+ $order = wc_get_order( $order_id );
+
+ // Mark as processing or on-hold (payment won't be taken until delivery)
+ $order->update_status( apply_filters( 'woocommerce_cod_process_payment_order_status', $order->has_downloadable_item() ? 'on-hold' : 'processing', $order ), __( 'Payment to be made upon delivery.', 'woocommerce' ) );
+
+ // Reduce stock levels
+ wc_reduce_stock_levels( $order_id );
+
+ // Remove cart
+ WC()->cart->empty_cart();
+
+ // Return thankyou redirect
+ return array(
+ 'result' => 'success',
+ 'redirect' => $this->get_return_url( $order ),
+ );
+ }
+
+ /**
+ * Output for the order received page.
+ */
+ public function thankyou_page() {
+ if ( $this->instructions ) {
+ echo wpautop( wptexturize( $this->instructions ) );
+ }
+ }
+
+ /**
+ * Change payment complete order status to completed for COD orders.
+ *
+ * @since 3.1.0
+ * @param string $status
+ * @param int $order_id
+ * @param WC_Order $order
+ * @return string
+ */
+ public function change_payment_complete_order_status( $status, $order_id = 0, $order = false ) {
+ if ( $order && 'cod' === $order->get_payment_method() ) {
+ $status = 'completed';
+ }
+ return $status;
+ }
+
+ /**
+ * Add content to the WC emails.
+ *
+ * @access public
+ * @param WC_Order $order
+ * @param bool $sent_to_admin
+ * @param bool $plain_text
+ */
+ public function email_instructions( $order, $sent_to_admin, $plain_text = false ) {
+ if ( $this->instructions && ! $sent_to_admin && $this->id === $order->get_payment_method() ) {
+ echo wpautop( wptexturize( $this->instructions ) ) . PHP_EOL;
+ }
+ }
+}