我正在尝试更新一些旧代码以在 Wordpress 插件中使用。
它正在做的是接受客户订单并检查他们之前是否已经购买过该 Woocommerce 产品。如果有,它将获得最后购买日期。它实际上工作正常,但查询已过时。我想更新它以使用 Wordpress 4.5。
我目前收到警告消息(3 次):
wpdb::prepare() 的查询参数必须有一个占位符
$orders = get_posts( array(
'meta_key' => '_customer_user',
'meta_value' => get_current_user_id(),
'post_type' => 'shop_order',
'post_status' => array( 'wc-processing', 'wc-completed' )
) );
$orders_id=wp_list_pluck( $orders, 'ID' ); //List of all order IDs
$product_id = $post->ID; // Get current product ID
$order_list='('.join(',', $orders_id).')';
global $wpdb;
$query_select_order_items = "SELECT order_item_id as id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id IN {$order_list}";
$query_select_product_ids = "SELECT meta_value as product_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key=%s AND order_item_id IN ( $query_select_order_items )";
$query_single_order_ids = "SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key=%s AND meta_value=$product_id";
$products = $wpdb->get_col( $wpdb->prepare ( $query_select_product_ids,'_product_id' ) );
$order_item_id = $wpdb->get_col( $wpdb->prepare ( $query_single_order_ids, '_product_id' ) );
$hg_abb_li1 = $wpdb->get_col( $wpdb->prepare ( $query_select_order_items, '_product_id' ) );
$hg_abb_list1 = '('.join(',', $hg_abb_li1).')';
$hg_abb_list2 = '('.join(',', $order_item_id).')';
$query_select_hgabb_items = "SELECT order_id FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id IN {$hg_abb_list1} AND order_item_id IN {$hg_abb_list2}";
$hg_abb_orderid = $wpdb->get_col( $wpdb->prepare ( $query_select_hgabb_items, '_order_item_id' ) );
$hg_abb_dateorderid = end($hg_abb_orderid);
$query_select_hgabb_date = "SELECT post_date FROM {$wpdb->prefix}posts WHERE ID = {$hg_abb_dateorderid}";
$l_order_date=$wpdb->get_col( $wpdb->prepare ( $query_select_hgabb_date, '_order_date' ) );
$last_order_date = (($l_order_date[0]));
编辑:那么它应该是这样的吗?
$products = $wpdb->get_col( $wpdb->prepare ( "SELECT meta_value as product_id FROM ".$wpdb->prefix."woocommerce_order_itemmeta WHERE meta_key='_product_id' AND order_item_id IN ( SELECT order_item_id as id FROM ".$wpdb->prefix."woocommerce_order_items WHERE order_id IN (%s) )",$order_list ) );
和
$hg_abb_orderid = $wpdb->get_col( $wpdb->prepare ( 'SELECT order_id FROM '.$wpdb->prefix.'woocommerce_order_items WHERE order_item_id IN %s AND order_item_id IN %s', $hg_abb_list1, $hg_abb_list2 ) );
%s(字符串?)是否仍可用于数组,还是行不通?
最佳答案
当您使用$wpdb->prepare
时,您必须将变量传递给查询。例如
$min_id = 5
$status = 'active'
$wpdb->prepare(
"SELECT id FROM wp_posts WHERE id > %d AND `post_status` = %s", $min_id, $status
)
关于php - wpdb::prepare() 的查询参数必须有一个占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583916/