Вывести поле цены в списке товаров в админке с возможностью редактирования без перезагрузки

  • Главная
  • БлогIT
  • Вывести поле цены в списке товаров в админке с возможностью редактирования без перезагрузки

function

// ПОЛЕ ЦЕНЫ СРАЗУ РЕДАЧИТСЯ
// ПОЛЕ ЦЕНЫ СРАЗУ РЕДАЧИТСЯ
// ПОЛЕ ЦЕНЫ СРАЗУ РЕДАЧИТСЯ

// Добавляем кастомную колонку для цены в список товаров
add_filter('manage_edit-products_columns', 'add_price_column', 10, 1);
function add_price_column($columns) {
    $new_columns = array();

    foreach ($columns as $key => $value) {
        $new_columns[$key] = $value;
        if ($key == 'title') { // Вставляем новую колонку после заголовка
            $new_columns['product_price'] = 'Цена';
        }
    }

    return $new_columns;
}

// Заполняем кастомную колонку значениями
add_action('manage_products_posts_custom_column', 'fill_price_column', 10, 2);
function fill_price_column($column, $post_id) {
    if ($column === 'product_price') {
        $price = get_post_meta($post_id, 'цена', true);
        echo '<input type="number" step="0.01" min="0" class="product_price_input" data-id="' . $post_id . '" value="' . esc_attr($price) . '">';
    }
}

// Стили для инпута цены
add_action('admin_enqueue_scripts', 'price_column_styles');
function price_column_styles() {
    echo '
    <style>
        .product_price_input {
            width: 80px;
        }
    </style>';
}

// Сохранение изменений цены с помощью AJAX
add_action('wp_ajax_save_product_price', 'save_product_price');
function save_product_price() {
    if (!current_user_can('edit_posts')) { // Изменено на 'edit_posts'
        wp_die('У вас нет доступа к этой странице.');
    }

    check_ajax_referer('price_column_nonce', '_ajax_nonce');

    $post_id = intval($_POST['post_id']);
    $price = floatval($_POST['price']);
    
    // Обновление метаполя "цена"
    update_post_meta($post_id, 'цена', $price);

    echo $price;
    wp_die();
}

// Подключение скрипта для обработки AJAX
add_action('admin_enqueue_scripts', 'price_column_scripts');
function price_column_scripts() {
    wp_enqueue_script('price-column-ajax', get_template_directory_uri() . '/js/price-column-ajax.js', array('jquery'), null, true);

    wp_localize_script('price-column-ajax', 'priceColumnAjax', array(
        'ajax_url' => admin_url('admin-ajax.php'),
        'nonce' => wp_create_nonce('price_column_nonce')
    ));
}

// ПОЛЕ ЦЕНЫ СРАЗУ РЕДАЧИТСЯ
// ПОЛЕ ЦЕНЫ СРАЗУ РЕДАЧИТСЯ
// ПОЛЕ ЦЕНЫ СРАЗУ РЕДАЧИТСЯ

price-column-ajax.js

jQuery(document).ready(function($) {
    $('.product_price_input').on('change', function() {
        var inputElement = $(this);
        var post_id = inputElement.data('id');
        var price = inputElement.val();

        $.ajax({
            type: 'POST',
            url: priceColumnAjax.ajax_url,
            data: {
                action: 'save_product_price',
                post_id: post_id,
                price: price,
                _ajax_nonce: priceColumnAjax.nonce
            },
            success: function(response) {
                inputElement.addClass('green-active');
            },
            error: function() {
                console.log('Ошибка при обновлении цены');
            }
        });
    });
});

css в function

.green-active {
    outline: 2px solid #97d949;
}
Контакты

Работаем: с ПН по ПТ, с 08:00 до 17:00 (МСК)
Отдыхаем: в СБ и ВС, чтобы быть в тонусе
и реализовывать самые сложные идеи