【问题标题】:How to override a function in Woocommerce WC_Order_Data_Store_CPT Class如何覆盖 Woocommerce WC_Order_Data_Store_CPT 类中的函数
【发布时间】:2019-03-18 17:58:29
【问题描述】:

我想覆盖位于 includes/data-stores/class-wc-order-data-store-cpt.php 的 Woocommerce WC_Order_Data_Store_CPT 类中的函数 search_orders()

这是我需要重写的函数源代码:

/**
 * Search order data for a term and return ids.
 *
 * @param  string $term
 * @return array of ids
 */
public function search_orders( $term ) {
    global $wpdb;

    /**
     * Searches on meta data can be slow - this lets you choose what fields to search.
     * 3.0.0 added _billing_address and _shipping_address meta which contains all address data to make this faster.
     * This however won't work on older orders unless updated, so search a few others (expand this using the filter if needed).
     * @var array
     */

    $term = preg_replace('/[^0-9.]+/', '', $term); //  <===  <===  <=== HERE

    $search_fields = array_map( 'wc_clean', apply_filters( 'woocommerce_shop_order_search_fields', array(
        '_billing_address_index',
        '_shipping_address_index',
        '_billing_last_name',
        '_billing_email',
    ) ) );
    $order_ids = array();

    if ( is_numeric( $term ) ) {
        $order_ids[] = absint( $term );
    }

    if ( ! empty( $search_fields ) ) {
        $order_ids = array_unique( array_merge(
            $order_ids,
            $wpdb->get_col(
                $wpdb->prepare( "SELECT DISTINCT p1.post_id FROM {$wpdb->postmeta} p1 WHERE p1.meta_value LIKE '%%%s%%'", $wpdb->esc_like( wc_clean( $term ) ) ) . " AND p1.meta_key IN ('" . implode( "','", array_map( 'esc_sql', $search_fields ) ) . "')"
            ),
            $wpdb->get_col(
                $wpdb->prepare( "
                    SELECT order_id
                    FROM {$wpdb->prefix}woocommerce_order_items as order_items
                    WHERE order_item_name LIKE '%%%s%%'
                    ",
                    $wpdb->esc_like( wc_clean( $term ) )
                )
            )
        ) );
    }

    return apply_filters( 'woocommerce_shop_order_search_results', $order_ids, $term, $search_fields );
}

我只是想添加这个添加函数的开头

$term = preg_replace('/[^0-9.]+/', '', $term);

欢迎任何帮助。

【问题讨论】:

    标签: php wordpress class woocommerce overriding


    【解决方案1】:

    您可以使用位于end of the function 的可用woocommerce_shop_order_search_results 过滤器挂钩,这将允许覆盖该方法:

    add_filter( 'woocommerce_shop_order_search_results', 'custom_shop_order_search_results_filter', 10, 3 );
    function custom_shop_order_search_results_filter( $order_ids, $term, $search_fields ) {
        global $wpdb;
    
        $term      = preg_replace('/[^0-9.]+/', '', $term); //  <===  <===  <===  Your change
    
        $order_ids = array();
    
        if ( is_numeric( $term ) ) {
            $order_ids[] = absint( $term );
        }
    
        if ( ! empty( $search_fields ) ) {
            $order_ids = array_unique(
                array_merge(
                    $order_ids,
                    $wpdb->get_col(
                        $wpdb->prepare(
                            "SELECT DISTINCT p1.post_id FROM {$wpdb->postmeta} p1 WHERE p1.meta_value LIKE %s AND p1.meta_key IN ('" . implode( "','", array_map( 'esc_sql', $search_fields ) ) . "')", // @codingStandardsIgnoreLine
                            '%' . $wpdb->esc_like( wc_clean( $term ) ) . '%'
                        )
                    ),
                    $wpdb->get_col(
                        $wpdb->prepare(
                            "SELECT order_id
                            FROM {$wpdb->prefix}woocommerce_order_items as order_items
                            WHERE order_item_name LIKE %s",
                            '%' . $wpdb->esc_like( wc_clean( $term ) ) . '%'
                        )
                    )
                )
            );
        }
        return $order_ids
    }
    

    代码进入您的活动子主题(或活动主题)的 function.php 文件中。经过测试,它应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2018-02-16
      • 1970-01-01
      • 2020-04-10
      • 2018-12-21
      • 2018-12-23
      相关资源
      最近更新 更多