Подтвердить что ты не робот

Продукты WooCommerce отображают сообщение "Нет в наличии", когда их нет в наличии

У вас возникла проблема с веб-сайтом клиента, где продукты отображаются случайным образом

"Этот продукт в настоящее время отсутствует на складе и недоступен".

Дело в том, что у нас нет отслеживания инвентаря, все продукты должны быть в наличии все время.

Когда я перехожу в администратор WordPress и нажимаю кнопку обновления для продукта (ничего не меняя), а затем сообщение исчезает, и кнопка "Добавить в корзину" отображается так, как должна. К сожалению, проблема повторится в этих пунктах в будущем, и, чтобы исправить это, я должен снова обновить продукт (также нажатие обновления в настройках WooCommerce временно решает проблему).

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

Детали сайта:

  • Использование WordPress 3.9.1
  • WooCommerce 2.1.12
  • PHP 5.3.10 (также проверено локально с 5.5.10)

Что я пробовал

  • Удаление всех плагинов, но WooCommerce
  • Изменение тем (пробовал все стандартные темы WordPress и несколько тем WooThemes безрезультатно)
  • Обновлен WooCommerce (он был v 2.1.5)
  • Вручную добавлено в wp_postmeta, добавив мета-ключ _manage_stock и установите его на no (как это наблюдается в некоторых работающих продуктах)
  • Вставляется вручную в wp_postmeta, добавляя мета-ключ "_stock" и устанавливая его на 0 (как это наблюдается в некоторых рабочих продуктах, которые мы имеем)
  • По сравнению с postmeta продукта до и после нажатия кнопки обновления, чтобы наблюдать, что что-то изменилось, что вызовет проблему... ничего
  • Кэширование не включено
  • Используется XDebug для отслеживания переменной $available_variations в variable.php и class-wc-ajax.php и class-wc-product-variable.php.

При отладке я заметил, что в продуктах, в которых работала переменная $available_variations, содержала 2 массива, заполненных информацией о продукте, однако на продуктах, которые этого не сделали, это был пустой массив (что приводит к тому, что сообщение об отсутствии отображается как обслуживается variable.php). Нажав кнопку обновления, а затем отслеживая переменную, информация отображается правильно.

Честно говоря, сейчас я в недоумении. Я думаю, что проблема находится где-то в любом из классов, но я не могу сказать.

У кого-нибудь еще были проблемы с этим? В любом случае, я не должен постоянно обновлять продукты для этого клиента.

Ссылка на продукт, который отсутствует на складе (начиная с публикации) http://highlandsministriesonline.org/product/basement-tapes/resentment-in-the-church-135/

Ссылка на продукт, который отображается правильно http://highlandsministriesonline.org/product/basement-tapes/bt0111-church-at-corinth-i/

Журнал ошибок Я добавил журнал ошибок в класс вариации продукта. Вот результат:

Для продуктов с сообщением "нет на складе" в журнале ничего не отображается.

Пример продукта, который функционирует правильно:

WC_Product_Variation Object
(
    [variation_id] => 1310
    [parent] => WC_Product_Variable Object
        (
            [children] => Array
                (
                    [0] => 1311
                    [1] => 1310
                )

            [total_stock] => 
            [id] => 1308
            [post] => WP_Post Object
                (
                    [ID] => 1308
                    [post_author] => 1
                    [post_date] => 2012-04-03 14:29:42
                    [post_date_gmt] => 2012-04-03 18:29:42
                    [post_content] => This audio presentation on homeschooling is a Basement Tape conversation on homeschooling.
<h2>What are The Basement Tapes?</h2>
<em>The Basement Tapes</em> are conversations between Dr. R.C. Sproul Jr., Rev. Laurence Windham, their friends and special guests, on subjects related to the "good life," a simple, separate, and deliberate life, lived out for the glory of God and for the building of His Kingdom.

You might even say that the Basement Tapes serve to help us develop a Christian worldview. Started in 2002, we now have over #140 conversations on all areas of life that we are seeking to think biblically about so that we might take dominion over them for the King and His kingdom.

<strong>Format: Available in both CD and MP3</strong>

<strong>Length: Sixty minutes</strong>
                    [post_title] => Basement Tape #109: Homeschooling Redux
                    [post_excerpt] => It been 108 weeks since we last talked about the subject of homeschooling our children. Our tykes have grown into teenagers. What have we learned in the past nine years? What has changed? What remains the same is that homeschooling means discipleship; passing down your most important convictions to your children and teaching them our holy religion.
                    [post_status] => publish
                    [comment_status] => open
                    [ping_status] => closed
                    [post_password] => 
                    [post_name] => bt0109-homeschooling-reducks
                    [to_ping] => 
                    [pinged] => 
                    [post_modified] => 2014-07-07 11:08:46
                    [post_modified_gmt] => 2014-07-07 15:08:46
                    [post_content_filtered] => 
                    [post_parent] => 0
                    [guid] => http://50.57.190.158/?post_type=product&#038;p=1308
                    [menu_order] => 0
                    [post_type] => product
                    [post_mime_type] => 
                    [comment_count] => 0
                    [filter] => raw
                )

            [product_type] => variable
        )

    [variation_data] => Array
        (
            [attribute_pa_audio-options] => mp3-download
        )

    [variation_has_length] => 
    [variation_has_width] => 
    [variation_has_height] => 
    [variation_has_weight] => 
    [variation_has_stock] => 
    [variation_has_sku] => 1
    [variation_shipping_class] => 
    [variation_shipping_class_id] => 
    [variation_has_tax_class] => 
    [variation_has_downloadable_files] => 1
    [id] => 1308
    [post] => WP_Post Object
        (
            [ID] => 1308
            [post_author] => 1
            [post_date] => 2012-04-03 14:29:42
            [post_date_gmt] => 2012-04-03 18:29:42
            [post_content] => This audio presentation on homeschooling is a Basement Tape conversation on homeschooling.
<h2>What are The Basement Tapes?</h2>
<em>The Basement Tapes</em> are conversations between Dr. R.C. Sproul Jr., Rev. Laurence Windham, their friends and special guests, on subjects related to the "good life," a simple, separate, and deliberate life, lived out for the glory of God and for the building of His Kingdom.

You might even say that the Basement Tapes serve to help us develop a Christian worldview. Started in 2002, we now have over #140 conversations on all areas of life that we are seeking to think biblically about so that we might take dominion over them for the King and His kingdom.

<strong>Format: Available in both CD and MP3</strong>

<strong>Length: Sixty minutes</strong>
            [post_title] => Basement Tape #109: Homeschooling Redux
            [post_excerpt] => It been 108 weeks since we last talked about the subject of homeschooling our children. Our tykes have grown into teenagers. What have we learned in the past nine years? What has changed? What remains the same is that homeschooling means discipleship; passing down your most important convictions to your children and teaching them our holy religion.
            [post_status] => publish
            [comment_status] => open
            [ping_status] => closed
            [post_password] => 
            [post_name] => bt0109-homeschooling-reducks
            [to_ping] => 
            [pinged] => 
            [post_modified] => 2014-07-07 11:08:46
            [post_modified_gmt] => 2014-07-07 15:08:46
            [post_content_filtered] => 
            [post_parent] => 0
            [guid] => http://50.57.190.158/?post_type=product&#038;p=1308
            [menu_order] => 0
            [post_type] => product
            [post_mime_type] => 
            [comment_count] => 0
            [filter] => raw
        )

    [product_type] => variation
    [product_custom_fields] => Array
        (
            [_sku] => Array
                (
                    [0] => BT0109MP3
                )

            [_price] => Array
                (
                    [0] => 3
                )

            [_sale_price] => Array
                (
                    [0] => 
                )

            [_weight] => Array
                (
                    [0] => 
                )

            [_length] => Array
                (
                    [0] => 
                )

            [_width] => Array
                (
                    [0] => 
                )

            [_height] => Array
                (
                    [0] => 
                )

            [_stock] => Array
                (
                    [0] => 
                )

            [_thumbnail_id] => Array
                (
                    [0] => 0
                )

            [_virtual] => Array
                (
                    [0] => yes
                )

            [_downloadable] => Array
                (
                    [0] => yes
                )

            [_download_limit] => Array
                (
                    [0] => 
                )

            [_downloadable_files] => Array
                (
                    [0] => a:1:{s:32:"a0a87d43e69ed9de646ba479c252c9fb";a:2:{s:4:"name";s:29:"109-Homeschooling-Reducks.mp3";s:4:"file";s:113:"http://highlandsministriesonline.org/wp-content/uploads/woocommerce_uploads/2012/04/109-Homeschooling-Reducks.mp3";}}
                )

            [_regular_price] => Array
                (
                    [0] => 3
                )

            [_sale_price_dates_from] => Array
                (
                    [0] => 
                )

            [_sale_price_dates_to] => Array
                (
                    [0] => 
                )

            [_download_expiry] => Array
                (
                    [0] => 
                )

            [attribute_pa_audio-options] => Array
                (
                    [0] => mp3-download
                )

        )

    [sku] => BT0109MP3
    [downloadable_files] => a:1:{s:32:"a0a87d43e69ed9de646ba479c252c9fb";a:2:{s:4:"name";s:29:"109-Homeschooling-Reducks.mp3";s:4:"file";s:113:"http://highlandsministriesonline.org/wp-content/uploads/woocommerce_uploads/2012/04/109-Homeschooling-Reducks.mp3";}}
    [downloadable] => yes
    [virtual] => yes
    [sale_price_dates_from] => 
    [sale_price_dates_to] => 
    [price] => 3
    [regular_price] => 3
    [sale_price] => 
    [total_stock] => 0
    [dimensions] => 
)

Потенциальные следующие шаги. Моя следующая мысль, если я не могу решить эту проблему, - написать script, который будет проходить и обновлять каждый продукт на веб-сайте по ночам (поскольку временное исправление кажется для работы по крайней мере 24 наших). Хотя, если я смогу сэкономить некоторое время, я бы предпочел, чтобы кто-то еще не смог решить эту проблему навсегда.

Обновление от 23 октября 2010 года

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

4b9b3361

Ответ 1

У меня была такая же проблема, и я думаю, что понял это. Я использовал набор CSV Import/Export для экспорта всех моих вариантов. Вы заметите, что для запаса установлено значение 0, когда оно должно иметь значение null.

У вас есть два варианта:

  • Перейдите в каждый отдельный продукт, перейдите на вкладку "Варианты" и раскройте все варианты - снимите флажок "управлять запасом": enter image description here
  • Вы можете выполнить поиск и замену в базе данных, заменяя значение 0 на null.

Ответ 2

Это 2017, и я все еще вижу точную проблему OP в хранилище:

  • WordPress 4.8.1
  • WooCommerce 3.1.2
  • PHP 5.6
  • тонны плагинов и сумасшедшая тема

У меня нет времени, чтобы по-настоящему исправить ошибку - что бы это ни было - но я сделал обходной путь.

Проблема в том, что $product отсутствует все связанное с изменением. Идентификаторов вариаций, атрибутов или цен нет. Мое обходное решение устраняет $product, прежде чем оно будет использоваться в шаблонах.

Шаг 1. Скопируйте шаблон price.php в свою тему. Перейдите к шаблону цены WooCommerce в /wp-content/plugins/woocommerce/templates/single-product/price.php. Скопируйте это в свою тему в /wp-content/themes/my-theme/woocommerce/single-product/price.php. Если у вас уже есть этот файл, у вас уже есть пользовательский шаблон price.php, и вы можете пропустить этот шаг.

Документация о том, как работают пользовательские шаблоны WooCommerce: https://docs.woocommerce.com/document/template-structure/

Шаг 2. Отредактируйте этот price.php, который вы только что разместили в своей теме. Ниже global $product; вставьте это:

if ( $product->is_type( 'variable' ) ) {
  // this is a variable product, so let ensure $product is set up correctly

  // force the product to sync with its variations
  $product->sync( $product->id );
  // update $product with the synced product
  $pf = new WC_Product_Factory();
  $product = $pf->get_product( $product->id );
  // update utility variables used in the variable.php template
  $available_variations = $product->get_available_variations();
  $attributes = $product->get_variation_attributes();
}

У меня были некоторые проблемы с кешированием, которые заставляли его выглядеть так, как будто он не работал вначале. Чтобы проверить, работает ли он, вы можете сбросить

echo '<pre style="display: none;">';
print_r( $product );
echo '</pre>';

вверху и внизу if. Теперь вы можете просмотреть страницу, и чуть выше цены будут две скрытые <pre> содержащие $product до и после фиксации.

Это работает с помощью функции sync(), чтобы заставить продукт захватить всю отсутствующую информацию о вариации, а затем обновляет переменные для использования в шаблонах. Я считаю, что цена является самой ранней из любых данных вариаций, которые используются в шаблонах, но этот фрагмент может быть легко поднят выше в цепочке шаблонов, если это необходимо.

Изменить: Данное исправление работает только для WooCommerce 3.x. Я создал исправление для WC 2.x, но он настолько огромный и грубый, что я не буду публиковать его. Если у вас все еще есть магазин 2.x, вам нужно изучить какой-то пересмотр, который позволит вам попасть на 3.x.

Ответ 3

Я получил эту же проблему с продуктом, который я недавно создал. Но для меня ответ был более простым.

Мне нужно было ввести "обычную цену" для каждого варианта.
https://wordpress.org/support/topic/this-product-is-currently-out-of-stock-and-unavailable-4/

Я создал свои атрибуты ранее.

В разделе "Вариации" для моего продукта я должен был убедиться, что выбран "Добавить вариант". Затем я нажал кнопку "Перейти".

Мне нужно было создать вариант для каждого из вариантов, которые мог иметь атрибут.

Поэтому для моих параметров цвета мне пришлось сделать три разных варианта (по одному для каждого варианта).
Затем мне нужно было щелкнуть синий текст "Развернуть" и убедиться, что у каждого варианта есть обычная цена.

Тогда это сработало. enter image description here

(Это тоже было полезно: https://docs.woocommerce.com/document/variable-product/)

Ответ 4

Попробуйте удалить продукт и создать тот же продукт, и попробуйте, чтобы у меня была такая же проблема, и это сработало для меня. даже попробуйте переустановить WooCommerce 2.1.12

Ответ 5

Это может быть проблема продукта. Попробуйте удалить и повторно добавить продукт или переустановить.

Ответ 6

У меня такая же проблема, и я думаю, что нашел причину. Это связано со статической функцией sync_stock_status класса WC_Product_Variable.

Вы можете исправить переменную состояние запаса продукта, которая выполняется в ваших функциях .php: add_action('wp',function(){ $productId = 639; WC_Product_Variable::sync_stock_status(639); });

Конечно, это нехорошее решение, поскольку оно фиксирует только один продукт за определенный момент.

Таким образом, проблема, похоже, запускает эту функцию в нужный момент.

Интересное, что я видел через код, и я узнал, что быстрое редактирование сохраняет вызывает эту функцию и исправляет продукт также!

Другое интересное: кажется, что команда woocommerce, возможно, исправила это навсегда, потому что я обнаружил через эту фиксацию, что они вызывают эту функцию сейчас, когда продукт обновляется.