Продукты Woocommerce, показывающие сообщение «Нет на складе», когда на самом деле нет на складе

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

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

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

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

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

Информация о сайте:

  • Использование WordPress 3.9.1
  • WooCommerce 2.1.12
  • PHP 5.3.10 (также попытался локально w / 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. RC 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's 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&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. RC 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's 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&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] => ) 

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

Дополнение от 23.10.2011

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

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

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

  1. Перейдите в каждый отдельный продукт, откройте вкладку «Варианты» и раскройте все варианты – снимите флажок «управлять запасом»: введите описание изображения здесь
  2. Вы можете сделать find-and-replace в базе данных, заменяя значение 0 для null.

Это 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's 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.

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

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

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

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

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

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

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

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