Как я могу сохранить настраиваемое поле атрибута в Woocommerce? - PullRequest
0 голосов
/ 11 сентября 2018

Старый

Я пытаюсь создать настраиваемое поле в атрибутах продукта в Woocommerce.Это можно выбрать, если атрибут выделен или нет.Например:

https://i.stack.imgur.com/Ge76B.png

Я хочу сделать так, чтобы поле, указанное в бэкэнде в качестве выделенного, определенным образом отображалось в веб-интерфейсе.

Пока мне удалось добавить поле, но мне не удалось выяснить, как его сохранить.Вот что у меня есть:

add_action('woocommerce_after_product_attribute_settings','wcb_add_product_attribute_is_highlighted', 10, 2);
add_filter( 'woocommerce_admin_meta_boxes_prepare_attribute', 'wcb_admin_meta_boxes_prepare_attribute', 10, 3);

function get_attribute_highlighted($id, $i) {
    return get_post_meta( 1, "attribute_".$id."_highlighted_".$i, true);
}

function wcb_add_product_attribute_is_highlighted($attribute, $i=0) {
    $value = get_attribute_highlighted($attribute->get_id(), $i); ?>
    <tr>
        <td>
            <div class="enable_variation show_if_canopytour show_if_variable_canopytour">
                <label><input type="checkbox" class="checkbox" <?php checked( $value, true ); ?> name="attribute_highlighted[<?php echo esc_attr( $i ); ?>]" value="1" /> <?php esc_html_e( 'Highlight attribute', $this->wcb ); ?></label>
            </div>
        </td>
    </tr>
<?php
}

function wcb_admin_meta_boxes_prepare_attribute($attribute, $data, $i=0) {
    // updated
    if(array_key_exists("attribute_highlighted", $data) && is_array($data["attribute_highlighted"])) {
        update_post_meta( 1, "attribute_".$attribute->get_id()."_highlighted_".$i, wc_string_to_bool($data["attribute_highlighted"][$i]) );
    }
}

Я пробовал фильтр woocommerce_admin_meta_boxes_prepare_attribute с использованием методов offsetSet и offsetGet класса WC_Product_Attribute, но не могу понять, как он работает.Я не смог заставить его сохранить свое пользовательское значение.

Любая помощь будет приветствоваться, спасибо.


Обновление

Я изменил фильтр woocommerce_admin_meta_boxes_prepare_attribute с помощьюwp_ajax_woocommerce_save_attributes действие и, кажется, работает.Теперь у меня проблема в том, что он не обновляется после сохранения в первый раз.

Я объясняю текущую проблему: у меня есть флажок, который при нажатии активируется, я сохраняю и при перезагрузке состояние сохраняется.Если теперь я хочу деактивировать его, после сохранения состояния оно не сохраняется как отключенное, оно возвращается как активированное.

Это обновленный код:

add_action('woocommerce_after_product_attribute_settings', 'wcb_add_product_attribute_is_highlighted', 10, 2);
add_action('wp_ajax_woocommerce_save_attributes', 'wcb_ajax_woocommerce_save_attributes', 10);

function get_attribute_highlighted($id, $i) {
    global $post;
    $id = sanitize_title($id);
    $id = strtolower($id);
    $val = get_post_meta( $post->ID, "attribute_".$id."_highlighted_".$i, true);
    return !empty($val) ? $val : false;
}

function wcb_add_product_attribute_is_highlighted($attribute, $i=0) {
    $value = get_attribute_highlighted($attribute->get_name(), $i); ?>
        <tr>
            <td>
                <div class="enable_highlighted show_if_canopytour show_if_variable_canopytour">
                    <label><input type="checkbox" class="checkbox" <?php checked( $value, true ); ?> name="attribute_highlighted[<?php echo esc_attr( $i ); ?>]" value="1" /> <?php esc_html_e( 'Highlight attribute', $this->wcb ); ?></label>
                </div>
            </td>
        </tr>
    <?php
}

function wcb_ajax_woocommerce_save_attributes() {
    check_ajax_referer( 'save-attributes', 'security' );
    parse_str( $_POST['data'], $data );
    $post_id = absint( $_POST['post_id'] );
    if(array_key_exists("attribute_highlighted", $data) && is_array($data["attribute_highlighted"])) {
        foreach($data["attribute_highlighted"] as $i => $val) {
            $attr_name = sanitize_title($data["attribute_names"][$i]);
            $attr_name = strtolower($attr_name);
            update_post_meta( $post_id, "attribute_".$attr_name."_highlighted_".$i, wc_string_to_bool($val) );
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

идеальный код, но измените хук

add_action('wp_ajax_woocommerce_save_attributes', 'wcb_ajax_woocommerce_save_attributes', 10);

на

add_action('wp_ajax_woocommerce_save_attributes', 'wcb_ajax_woocommerce_save_attributes', 0);
0 голосов
/ 13 сентября 2018

Я нашел решение своей проблемы.Я делюсь кодом на случай, если кому-то пригодится.С уважением!

add_action('woocommerce_after_product_attribute_settings', 'wcb_add_product_attribute_is_highlighted', 10, 2);
add_action('wp_ajax_woocommerce_save_attributes', 'wcb_ajax_woocommerce_save_attributes', 10);

function get_attribute_highlighted($id, $i) {
    global $post;
    $id = sanitize_title($id);
    $id = strtolower($id);
    $val = get_post_meta( $post->ID, "attribute_".$id."_highlighted_".$i, true);
    return !empty($val) ? $val : false;
}

function wcb_add_product_attribute_is_highlighted($attribute, $i=0) {
    $value = get_attribute_highlighted($attribute->get_name(), $i); ?>
        <tr>
            <td>
                <div class="enable_highlighted">
                    <label><input type="hidden" name="attribute_highlighted[<?php echo esc_attr( $i ); ?>]" value="0" /><input type="checkbox" class="checkbox" <?php checked( $value, true ); ?> name="attribute_highlighted[<?php echo esc_attr( $i ); ?>]" value="1" /> <?php esc_html_e( 'Highlight attribute', $this->wcb ); ?></label>
                </div>
            </td>
        </tr>
    <?php
}

function wcb_ajax_woocommerce_save_attributes() {
    check_ajax_referer( 'save-attributes', 'security' );
    parse_str( $_POST['data'], $data );
    $post_id = absint( $_POST['post_id'] );
    if(array_key_exists("attribute_highlighted", $data) && is_array($data["attribute_highlighted"])) {
        foreach($data["attribute_highlighted"] as $i => $val) {
            $attr_name = sanitize_title($data["attribute_names"][$i]);
            $attr_name = strtolower($attr_name);
            update_post_meta( $post_id, "attribute_".$attr_name."_highlighted_".$i, wc_string_to_bool($val) );
        }
    }
}

В конце концов, единственное, что я должен был добавить в свой код, это скрытый ввод с тем же именем, что и у флажка, но со значением 0: <input type="hidden" name="attribute_highlighted[<?php echo esc_attr( $i ); ?>]" value="0" />

* 1006.* Здесь изображение результата (https://i.stack.imgur.com/VscT1.jpg). При нажатии на кнопку сохранить значение флажка сохраняется. Значение сохраняется в post_meta сообщения, которое вы изменяете. Это полезно, если вы хотите выделитьконкретный атрибут в интерфейсе.

Я ценю помощь @LoicTheAztec:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...