Хобрук: Ваш путь к мастерству в программировании

Woocommerce — Как проверить тип продукта в плагине

Я новичок в wordpress/woocommerce и только начал играть с созданием собственного плагина.

До сих пор я добавил свои пользовательские настройки woocommerce через API.

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

Мне удалось отобразить его, используя следующий код:

add_action( 'woocommerce_product_options_general_product_data', array( $this, 'cuzd_general_fields' ) );
add_action( 'woocommerce_process_product_meta', array( $this, 'cuzd_general_fields_save') );

Однако теперь мне нужно проверить, является ли тип продукта простым или вариативным. Я пробовал следующее:

$product = new WC_Product( get_the_ID() );
        if( $product->is_type( 'simple' ) ) {
          //
}

Однако я получаю сообщение об ошибке:

 Fatal error: Class 'WC_Product' not found in ....

У меня хорошее предчувствие, что я пытаюсь инициировать класс Product до его вызова. У меня, скорее всего, неверный формат плагина класса. Любые материалы для чтения с хорошими инструкциями / передовой практикой будут оценены.

В противном случае, если вышеуказанное является простым решением, сообщите мне.


Ответы:


1

Самое раннее, что вы можете ожидать получить доступ к любым классам Woo, это хук woocommerce_loaded, который теперь срабатывает в хуке plugins_loaded. Если вы сохраняете на хуке woocommerce_process_product_meta, то любой обратный вызов будет правильно загружать все классы. Если вы тестируете за пределами этого обратного вызова (и вообще не привязаны к какому-либо хуку.... не все классы могут быть загружены должным образом.

Кроме того, если вы попытаетесь вызвать get_the_ID() до того, как будет настроен объект WP_Post, вы не получите правильное значение.

Более полная процедура cuzd_general_fields_save будет выглядеть так:

/**
 * Save meta box data.
 *
 * @param int     $post_id WP post id.
 */
public function cuzd_general_fields_save( $post_id ) {

    $_product = wc_get_product( $post_id );

    if( $_product->is_type( 'simple' ) ) {
    // do stuff for simple products
    } else {
    // do stuff for everything else
    }

    $_product->save();

}

Обновление для Woo 3.0 будет заключаться в использовании woocommerce_admin_process_product_object, поэтому вам больше не нужно создавать экземпляр объекта продукта или запускать save(), поскольку Woo будет обрабатывать это в ядре.

add_action( 'woocommerce_admin_process_product_object', array( $this, 'cuzd_general_fields_save') );

и обратный вызов затем будет изменен на:

/**
 * Save meta box data.
 *
 * @param obj $_product WC_Product.
 */
public function cuzd_general_fields_save( $_product ) {

    if( $_product->is_type( 'simple' ) ) {
    // do stuff for simple products
    } else {
    // do stuff for everything else
    }

}
01.01.2015
  • Для меня, по крайней мере, тип вариативного продукта является вариативным, а не вариативным. Возможно, он изменился с момента первоначального ответа, но я думаю, что это стоит отметить для дальнейшего использования. 17.05.2017
  • @Tuure Переменная и вариация существуют. Переменная типа продукта означает, что это родительский продукт, который содержит несколько дочерних продуктов-вариантов. Варианты не отображаются как отдельные продукты в списке продуктов, а на самом деле являются отдельными сообщениями о продуктах. 20.05.2017
  • Благодарю за разъяснение! 22.05.2017
  • Но если класс не найден, почему проблема с аргументом? Вы уверены, что это правильный ответ? 02.05.2020
  • Я люблю ТАК, 5 лет Вопросы и ответы помогли мне, Ура 04.05.2020

  • 2

    Вот один из способов проверить тип продукта без создания экземпляра продукта:

    $product_type = get_the_terms( $product_id,'product_type')[0]->slug;
    
    24.05.2020
  • Голосование за повышение охвата. Я искал именно то, что нужно. 24.12.2020

  • 3

    Самый простой способ — просто проверить значение опубликованного select. Затем вы можете:

    $product_type = $_POST['product-type'];
    
    if ( $product_type == 'simple' ) {
     // do what you want
    }
    
    24.09.2020
    Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

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

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..