У меня проблема с сохранением фильтров, которые должны отображаться на странице категории.
У меня следующий код:
<?php
add_action('init', function () {
register_meta('term', 'category_filters', 'sanitize_category_filters');
});
function sanitize_category_filters($category_filters)
{
return wp_kses_post($category_filters);
}
function product_cat_add_category_filters_meta()
{
wp_nonce_field(basename(__FILE__), 'product_cat_category_filters_nonce');
$product_cat_category_filters = array();
$attrs = wc_get_attribute_taxonomies(); ?>
<div class="form-field">
<label for="wpm-product-cat-category_filters">Filters</label>
<?php if ($attrs) : ?>
<select multiple="multiple" name="wpm-product-cat-category_filters[]" id="wpm-product-cat-category_filters"
style="min-width: 100%; min-height: 12rem;">
<?php foreach ($attrs as $key => $value) : ?>
<option <?= $product_cat_category_filters && in_array($value->attribute_name, $product_cat_category_filters) ? 'selected' : ''; ?>
value="<?= $value->attribute_name ?>"><?= $value->attribute_label ?></option>
<?php endforeach; ?>
</select>
<?php endif; ?>
<p class="description">Choose filters for category</p>
</div>
<?php }
add_action('product_cat_add_form_fields', 'product_cat_add_category_filters_meta');
// Add category_filters field to edit category page
function product_cat_edit_category_filters_meta($term)
{
$product_cat_category_filters = array();
$product_cat_category_filters = get_term_meta($term->term_id, 'category_filters', true);
if (!$product_cat_category_filters) $product_cat_category_filters = '';
$attrs = wc_get_attribute_taxonomies();
$settings = array('textarea_name' => 'wpm-product-cat-category_filters'); ?>
<tr class="form-field">
<th scope="row" valign="top"><label for="wpm-product-cat-category_filters">Filters</label></th>
<td>
<?php wp_nonce_field(basename(__FILE__), 'product_cat_category_filters_nonce'); ?>
<?php if ($attrs) : ?>
<select multiple="multiple" name="wpm-product-cat-category_filters[]"
id="wpm-product-cat-category_filters" style="min-width: 100%; min-height: 12rem;">
<?php foreach ($attrs as $key => $value) : ?>
<option <?= $product_cat_category_filters && in_array($value->attribute_name, $product_cat_category_filters) ? 'selected' : ''; ?>
value="<?= $value->attribute_name ?>"><?= $value->attribute_label ?></option>
<?php endforeach; ?>
</select>
<?php endif; ?>
<p class="description">Choose filters for category</p>
</td>
</tr>
<?php }
add_action('product_cat_edit_form_fields', 'product_cat_edit_category_filters_meta');
function product_cat_category_filters_meta_save($term_id)
{
if (!isset($_POST['product_cat_category_filters_nonce']) || !wp_verify_nonce($_POST['product_cat_category_filters_nonce'], basename(__FILE__))) {
return;
}
$old_category_filters = get_term_meta($term_id, 'category_filters', true);
$new_category_filters = isset($_POST['wpm-product-cat-category_filters']) ? $_POST['wpm-product-cat-category_filters'] : '';
if ($old_category_filters && '' === $new_category_filters) {
delete_term_meta($term_id, 'category_filters');
} else if ($old_category_filters !== $new_category_filters) {
update_term_meta(
$term_id,
'category_filters',
sanitize_details($new_category_filters)
);
return update_metadata('term', $term_id, 'category_filters', sanitize_details($new_category_filters));
}
}
add_action('create_product_cat', 'product_cat_category_filters_meta_save');
add_action('edit_product_cat', 'product_cat_category_filters_meta_save');
У меня есть несколько фильтров в магазине woocommerce.
Для категории продукта я хочу выбрать, какие фильтры атрибутов я хочу показать. У меня есть код ниже для этого. Мультиселект отобразится на странице редактирования категории продукта, но когда я выберу один или несколько параметров, они не сохранятся в базе данных.
Что делать?