php 在woocommerce管理面板中按ean搜索

wljmcqd8  于 5个月前  发布在  PHP
关注(0)|答案(2)|浏览(45)

我在管理员面板中输入按产品ean编号搜索时遇到问题。我的代码是:

function custom_search_by_ean( $query ) {
    global $pagenow, $typenow;

    if ( is_admin() && $pagenow === 'edit.php' && $typenow === 'product' && isset( $_GET['s'] ) && ! empty( $_GET['s'] ) ) {
        $ean = $_GET['s'];

        $meta_query = array(
            'relation' => 'OR',
            array(
                'key' => '_ean',
                'value' => $ean,
                'compare' => 'LIKE'
            )
        );

        $query->set( 'meta_query', $meta_query );
        error_log(print_r($query, true));
    }
}
add_action( 'pre_get_posts', 'custom_search_by_ean' );

字符串
我改变了键,看看它是否能工作。例如,key => '_sku'工作。有人知道问题是什么吗?
我想在WooCommerce中搜索产品的ean,名称,SKU,在edit.php选项卡中的管理面板ID

zaq34kh6

zaq34kh61#

我找到了这个问题的解决方案,我首先提取EAN搜索的产品ID,然后使用'post__in'参数得到结果:

function custom_product_search_by_ID_ean($search_term) {
    global $wpdb;

    $ean = sanitize_text_field($search_term);

    $results = $wpdb->get_results(
        $wpdb->prepare(
            "SELECT p.ID
            FROM {$wpdb->posts} p
            INNER JOIN {$wpdb->postmeta} pm ON p.ID = pm.post_id
            WHERE p.post_type = 'product'
            AND p.post_status IN ('publish', 'private')
            AND pm.meta_key = '_ean'
            AND pm.meta_value LIKE '%%%s%%'",
            $ean
        )
    );

    if ($results) {
        $product_ids = wp_list_pluck($results, 'ID');
        return $product_ids;
    } else {
        return array();
    }
}

add_filter('pre_get_posts', 'custom_search_products_by_ean', 10);
function custom_search_products_by_ean($q) {
    if (is_admin() && $q->is_main_query() && $pagenow === 'edit.php' && $typenow === 'product' && isset($_GET['s']) && !empty($_GET['s'])) {
        $ean_search = custom_product_search_by_ID_ean($_GET['s']);
        if (!empty($ean_search)) {
            $q->set('post__in', $ean_search);
        }
    }
    return $q;
}

字符串

8nuwlpux

8nuwlpux2#

你的代码几乎是正确的,但有几个问题:

  • 'pre_get_posts'操作将针对页面上的每个查询触发,而不仅仅是编辑产品的主查询。您应该检查它是否是主查询以及查询是否针对'product'文章类型。
  • 当通过EAN搜索产品时,您需要以允许部分匹配的方式使用Meta_query,因为EAN通常仅部分输入。

代码的更新版本:

function custom_search_by_ean($query) {
    global $pagenow, $typenow, $wpdb;

    if (is_admin() && $query->is_main_query() && $pagenow === 'edit.php' && $typenow === 'product' && isset($_GET['s']) && !empty($_GET['s'])) {
        $ean = $_GET['s'];
        $ean_meta_key = '_ean';

        $query->query_vars['s'] = '';
        $query->query_where .= $wpdb->prepare(
            " AND ($wpdb->postmeta.meta_key = %s AND $wpdb->postmeta.meta_value LIKE %s)",
            $ean_meta_key,
            '%' . like_escape($ean) . '%'
        );
    }
}
add_action('pre_get_posts', 'custom_search_by_ean');

字符串

**注意:**请确保存储EAN的自定义字段名为'_ean',并且它包含产品的EAN数据。

相关问题