Вопрос: Условно скрыть или показать вариант woocommerce продукта в шрифте по настраиваемому полю

Я добавил пользовательское поле (флажок) для вариантов продукта со следующим кодом:

/*** Create new fields for variations**/function variation_settings_fields( $loop, $variation_data, $variation ) {woocommerce_wp_checkbox( array(     'id'            => '_wholesale_checkbox[' . $variation->ID . ']',     'label'         => 'Visa endast för företagskunder',     'description'   => '',    'value'         => get_post_meta( $variation->ID, '_wholesale_checkbox', true ),     ));}/** * Save new fields for variations **/function save_variation_settings_fields( $post_id ) {//Checkbox$checkbox = isset( $_POST['_wholesale_checkbox'][ $post_id ] ) ? 'yes' : 'no';update_post_meta( $post_id, '_wholesale_checkbox', $checkbox );}add_action( 'woocommerce_variation_options', 'variation_settings_fields', 10, 3 );add_action( 'woocommerce_save_product_variation', 'save_variation_settings_fields', 10, 2 );

Он добавляет флажок по желанию, как видно на скриншоте.

Теперь я хочу условно скрыть или показать вариант продукта во внешнем интерфейсе на основе этого поля. Проблема в том, что у меня есть какой-то собственный список вариантов (не моя работа), и я не мог понять, как заполучить поле _wholesale_checkbox, чтобы пропустить вариант (для которого установлен флажок) в цикле, который выводит список. См. Код для вывода списка пользовательских вариантов ниже:

/** * Convert WooCommerce variation dropdown to radio buttons. * * @param string $html Original dropdown html. * @param array  $args Arguments. */function ac_variation_radio_buttons( $html, $args ) {$options   = $args['options'];$product   = $args['product'];$attribute = $args['attribute'];$name      = $args['name'] ? $args['name'] : 'attribute_' . sanitize_title( $attribute );$id        = $args['id'] ? $args['id'] : sanitize_title( $attribute );if ( empty( $options ) && ! empty( $product ) && ! empty( $attribute ) ) {    $attributes = $product->get_variation_attributes();    $options    = $attributes[ $attribute ];}//Output original dropdown element.echo $html;/* Create custom radio input list */$html = '<section for="' . esc_attr( $id ) . '" class="ac_variation_list_block">';if ( ! empty( $options ) ) {    if ( $product && taxonomy_exists( $attribute ) ) {        //Get terms if this is a taxonomy - ordered. We need the names too.        $terms = wc_get_product_terms( $product->get_id(), $attribute, [            'fields' => 'all',        ] );        //var_dump($options);        foreach ( $terms as $term ) {            /*            if (**CUSTOM_FIELD is checked** )) {                continue;            }            */           if ( in_array( $term->slug, $options, true ) ) {                $html .= '<section class="ac_variation_option">';                $html .= '<input id="' . esc_attr( $term->slug ) . '_v" type="radio" name="' . esc_attr( $name ) . '_g" value="' . esc_attr( $term->slug ) . '" ' . checked( sanitize_title( $args['selected'] ), $term->slug, false ) . '/>';                $html .= '<label for="' . esc_attr( $term->slug ) . '_v"><span></span>' . esc_html( apply_filters( 'woocommerce_variation_option_name', $term->name ) ) . '</label>';                $html .= '</section>';            }        }    }}$html .= '</section>';echo $html;}add_filter( 'woocommerce_dropdown_variation_attribute_options_html', 'ac_variation_radio_buttons', 10, 2 );

Ответы и комментарии:

В конечном итоге я решил эту проблему, манипулируя массивом $ options. См. Полный код ниже, чтобы условно скрыть вариант продукта с помощью настраиваемого поля и отобразить варианты в виде переключателей. Решение отмечено комментариями
/ **
* Преобразуйте выпадающий список вариантов WooCommerce в переключатели.
*
* @param string $ html Исходный выпадающий html.
* @param array $ args Аргументы.
* /
function ac_variation_radio_buttons ($ html, $ args) {
$ options = $ args ['options'];
$ product = $ args ['product'];
$ attribute = $ args ['attribute'];
$ name = $ args ['name']? $ args ['name']: 'attribute_'. sanitize_title ($ атрибут);
$ id = $ args ['id']? $ args ['id']: sanitize_title ($ attribute);

if (empty ($ options) &&! empty ($ product) &&! empty ($ attribute)) {
    $ attribute = $ product-> get_variation_attributes ();
    $ options = $ attribute [$ attribute];
}

// Вывод исходного выпадающего элемента.
echo $ html;

/ **** ДОБАВЛЕННЫЙ КОД ***** /
// Удалить оптовые товары для постоянных пользователей
if ($ product-> is_type ('variable')) {
    $ user = wp_get_current_user ();
    if (! in_array ('fretagskund', $ user-> role)) {
        foreach ($ product-> get_children () как $ child_id) {
            $ var = wc_get_product ($ child_id);

            if (! $ Вариация ||! $ Вариант-> Существует ()) {
                Продолжить;
            }

            if (get_post_meta ($ var-> get_id (), '_wholesale_checkbox', true) === "yes") {
                $ attribute_name = get_post_meta ($ var-> get_id (), 'attribute_pa_storlek', true);

                if (in_array ($ attribute_name, $ options, true)) {
                    $ options = array_diff ($ options, array ($ attribute_name));
                }

            }

        }
    }
}

/ * Создать собственный список радиовходов * /
$ html = '';

if (! empty ($ options)) {
    if ($ product && taxonomy_exists ($ attribute)) {
        // Получить условия, если это таксономия - заказано. Нам тоже нужны имена.
        $ term = wc_get_product_terms ($ product-> get_id (), $ attribute, [
            'fields' => 'all',
        ]);

        foreach ($ term как $ term) {
            if (in_array ($ term-> slug, $ options, true)) {
                $ html. = '';
                $ html. = ' slug, false). '/>';
                $ html. = ' span>'. esc_html (apply_filters ('woocommerce_variation_option_name', $ term-> name)). Метка> ';
                $ html. = ' section>';
            }
        }
    }
}

$ html. = ' section>';

echo $ html;
}


add_filter ('woocommerce_dropdown_variation_attribute_options_html', 'ac_variation_radio_buttons', 10, 2);
Создан 30-08-2018 01:07 Out of Orbit101