Проблема с пользовательским плагином – Уведомление: Попытка получить свойство не объекта в

Вопрос или проблема

В моем плагине для настройки некоторых базовых значений с использованием функции woocommerce, которая создает выпадающее поле, но по какой-то причине она генерирует эту ошибку: “Уведомление: Попытка получить свойство не объекта в /var/www/html/wp-content/plugins/woocommerce/includes/admin/wc-meta-box-functions.php на строке 192”

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

function spinna360_nof($noi) {

woocommerce_wp_select( 
    array(
        'id'        => '_select_noi',
        'label'     => __( 'Выберите количество изображений: ', 'spinna360' ),
        'selected'  => true,
        'value'     =>  $noi,
        'options'   => [
            '24'        => __( '24', 'spinna360' ),
            '36'        => __( '36', 'spinna360' ),
            '48'        => __( '48', 'spinna360' )
            ]
        )
    );
}

Почему? Какова проблема?

Попробуйте использовать global $post; в начале вашей функции

Обратите внимание, что вам нужно запустить на конкретном хуке, чтобы это работало. см. этот пост: https://www.ibenic.com/how-to-add-woocommerce-custom-product-fields/

function spinna360_nof() {
$noy=array(
    'id'        => '_select_noi',
    'label'     => __( 'Выберите количество изображений: ', 'spinna360' ),
    'selected'  => true,
    'options'   => [
        '24'        => __( '24', 'spinna360' ),
        '36'        => __( '36', 'spinna360' ),
        '48'        => __( '48', 'spinna360' )
        ]
);
woocommerce_wp_select($noy);   
}
add_action( 'woocommerce_product_data_panels', 'spinna360_nof');

Ответ или решение

Проблема, с которой вы столкнулись, связана с ошибкой "Notice: Trying to get property of non-object", возникающей в вашем пользовательском плагине для WooCommerce. Данная ошибка указывает на то, что в момент выполнения функции происходит попытка обращения к свойству объекта, который не был инициализирован. Давайте разберемся, в чем может заключаться причина и как ее устранить.

Причины возникновения ошибки

  1. Неинициализированный объект:
    Ошибка происходит, когда вы пытаетесь обратиться к свойству объекта, который на самом деле равен null или не установлен. Это чаще всего связано с тем, что объект, из которого вы пытаетесь получить значение, не был загружен или инициализирован на момент выполнения.

  2. Неправильный контекст выполнения:
    Ваша функция spinna360_nof может вызываться в контексте, где необходимый объект не доступен. Если вы не используете глобальную переменную $post, вы рискуете получить объект, равный null.

Решения

1. Добавление глобального объекта $post

В самом начале вашей функции вы можете объявить глобальную переменную $post, что позволит вам безопасно получать доступ к текущему объекту. Это важно, так как WooCommerce ожидает наличия данного объекта для работы с полями.

function spinna360_nof() {
    global $post; // Регистрация глобальной переменной

    // Убедитесь, что объект существует, прежде чем пытаться получить его свойства
    if (!$post) {
        return; // Если объекта нет - просто выйти из функции
    }

    $noi = get_post_meta($post->ID, '_select_noi', true); // Получаем сохраненное значение

    $noy = array(
        'id'        => '_select_noi',
        'label'     => __( 'Выберите количество изображений: ', 'spinna360' ),
        'selected'  => $noi, // Используем полученное значение
        'options'   => [
            '24' => __( '24', 'spinna360' ),
            '36' => __( '36', 'spinna360' ),
            '48' => __( '48', 'spinna360' ),
        ]
    );
    woocommerce_wp_select($noy);
}
add_action('woocommerce_product_data_panels', 'spinna360_nof');

2. Проверка наличия данных

Перед тем как обращаться к свойствам объекта, убедитесь в том, что сущности и данные присутствуют:

$noi = get_post_meta($post->ID, '_select_noi', true);
if (empty($noi)) {
    $noi = '24'; // Установить значение по умолчанию, если нет сохраненных данных
}

Итог

Ваша ошибка возникает из-за попытки доступа к свойству неинициализированного объекта. Использование глобального объекта $post и соответствующие проверки на наличие данных помогут исправить ситуацию и избежать предупреждений. Убедитесь, что вы корректно используете хуки в WooCommerce и что ваши поля правильно регистрируются и отрисовываются на соответствующих страницах.

Следуя данным рекомендациям, вы устраните ошибку и сделаете функциональность вашего плагина более стабильной.

Оцените материал
Добавить комментарий

Капча загружается...

  1. Гость

    Здравствуйте!

    Я столкнулся с такой же проблемой и нашёл решение, которое может вам помочь. Проблема заключается в том, что функция woocommerce_wp_select() ожидает, что объект $post будет доступен в глобальной области видимости. Если этого не происходит, возникает ошибка «Notice: Trying to get property of non-object».

    Чтобы исправить это, добавьте глобальную переменную $post в начало вашей функции:

    function spinna360_nof() {
    global $post;

    if ( ! is_object( $post ) ) {
    return;
    }

    $noi = get_post_meta( $post->ID, '_select_noi', true );

    woocommerce_wp_select( array(
    'id' => '_select_noi',
    'label' => __( 'Выберите количество изображений: ', 'spinna360' ),
    'value' => $noi ? $noi : '24',
    'options' => array(
    '24' => __( '24', 'spinna360' ),
    '36' => __( '36', 'spinna360' ),
    '48' => __( '48', 'spinna360' ),
    ),
    ) );
    }
    add_action( 'woocommerce_product_options_general_product_data', 'spinna360_nof' );

    Также добавьте функцию для сохранения значения при сохранении продукта:

    function spinna360_save_nof( $post_id ) {
    $noi = isset( $_POST['_select_noi'] ) ? sanitize_text_field( $_POST['_select_noi'] ) : '24';
    update_post_meta( $post_id, '_select_noi', $noi );
    }
    add_action( 'woocommerce_process_product_meta', 'spinna360_save_nof' );

    Надеюсь, это поможет решить вашу проблему!

    Ответить