如何为WordPress WooCommerce编写接收标签数组的产品展示自定义函数
问题描述
需求为WooCommerce开发一个自定义函数,该函数接收产品标签数组作为参数,输出匹配的产品。已完成多选表单及辅助函数编写,需要实现核心的产品查询与展示功能。
用户提供的表单代码:
<form id="form3" method="POST" action=""> <h4>Concerns</h4> <div class="container-form"> <input type="checkbox" name="concern1" checked="checked" <?php if (isset($concern1) && $concern1=="dryness") echo "checked";?> value="dryness"><div class="checkmark">Dryness</div> </div> <div class="container-form"> <input type="checkbox" name="concern2" <?php if (isset($concern2) && $concern2=="dullness") echo "checked";?> value="male"><div class="checkmark">Male</div> <br> </div> <div class="container-form"> <input type="checkbox" name="concern3" <?php if (isset($concern3) && $concern3=="other") echo "checked";?> value="other"><div class="checkmark">Other</div> <br> </div> <input type="submit" name="submit" class="submit" value="Submit"/> </form>
用户提供的辅助函数:
<?php function pre_r($array){ echo '<pre>'; print_r($array); echo '</pre>'; } ?>
解决方案
第一步:修正表单的name属性
原表单中每个复选框使用独立的concern1/concern2命名,无法直接获取选中标签的数组,需统一改为数组形式的name="concerns[]",同时修正重复的checked属性与逻辑:
<form id="form3" method="POST" action=""> <h4>Concerns</h4> <div class="container-form"> <input type="checkbox" name="concerns[]" <?php if (isset($_POST['concerns']) && in_array('dryness', $_POST['concerns'])) echo "checked";?> value="dryness"><div class="checkmark">Dryness</div> </div> <div class="container-form"> <input type="checkbox" name="concerns[]" <?php if (isset($_POST['concerns']) && in_array('male', $_POST['concerns'])) echo "checked";?> value="male"><div class="checkmark">Male</div> <br> </div> <div class="container-form"> <input type="checkbox" name="concerns[]" <?php if (isset($_POST['concerns']) && in_array('other', $_POST['concerns'])) echo "checked";?> value="other"><div class="checkmark">Other</div> <br> </div> <input type="submit" name="submit" class="submit" value="Submit"/> </form>
第二步:编写自定义产品查询与展示函数
使用WooCommerce官方推荐的wc_get_products函数实现产品查询,同时处理表单提交逻辑:
<?php // 保留原辅助函数 function pre_r($array){ echo '<pre>'; print_r($array); echo '</pre>'; } // 核心自定义函数:接收标签数组,输出匹配产品 function display_products_by_tags($tag_slugs) { // 参数验证 if (!is_array($tag_slugs) || empty($tag_slugs)) { echo '<p>请选择至少一个产品标签</p>'; return; } // WooCommerce产品查询参数 $args = array( 'status' => 'publish', // 仅展示已发布产品 'tag' => $tag_slugs, // 根据标签slug查询 'limit' => -1, // 展示所有匹配产品,可按需修改数量 ); // 获取产品列表 $products = wc_get_products($args); // 输出产品 if (!empty($products)) { echo '<div class="products-grid">'; foreach ($products as $product) { // 可根据主题需求自定义产品展示结构 echo '<div class="product-item">'; echo '<a href="' . esc_url($product->get_permalink()) . '">'; echo $product->get_image(); // 产品缩略图 echo '<h3>' . esc_html($product->get_name()) . '</h3>'; echo '</a>'; echo '<p class="price">' . $product->get_price_html() . '</p>'; echo '<a href="' . esc_url($product->add_to_cart_url()) . '" class="add-to-cart-btn">' . __('Add to Cart', 'woocommerce') . '</a>'; echo '</div>'; } echo '</div>'; } else { echo '<p>未找到匹配的产品</p>'; } } // 处理表单提交逻辑 if (isset($_POST['submit']) && isset($_POST['concerns'])) { // 安全过滤用户输入 $selected_tags = array_map('sanitize_text_field', $_POST['concerns']); // 调用函数展示产品 display_products_by_tags($selected_tags); } ?>
可选扩展:标签交集查询
如果需要查询同时包含所有选中标签的产品(默认是包含任意一个标签即可),可修改查询参数为:
$args = array( 'status' => 'publish', 'tax_query' => array( array( 'taxonomy' => 'product_tag', 'field' => 'slug', 'terms' => $tag_slugs, 'operator' => 'AND', // 交集查询 ), ), 'limit' => -1, );
内容的提问来源于stack exchange,提问作者AidenPierce024
相关产品推荐
相关产品推荐

