Вопрос или проблема
В моем плагине для настройки некоторых базовых значений с использованием функции 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. Данная ошибка указывает на то, что в момент выполнения функции происходит попытка обращения к свойству объекта, который не был инициализирован. Давайте разберемся, в чем может заключаться причина и как ее устранить.
Причины возникновения ошибки
-
Неинициализированный объект:
Ошибка происходит, когда вы пытаетесь обратиться к свойству объекта, который на самом деле равенnull
или не установлен. Это чаще всего связано с тем, что объект, из которого вы пытаетесь получить значение, не был загружен или инициализирован на момент выполнения. -
Неправильный контекст выполнения:
Ваша функция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 и что ваши поля правильно регистрируются и отрисовываются на соответствующих страницах.
Следуя данным рекомендациям, вы устраните ошибку и сделаете функциональность вашего плагина более стабильной.
Здравствуйте!
Я столкнулся с такой же проблемой и нашёл решение, которое может вам помочь. Проблема заключается в том, что функция
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' );
Надеюсь, это поможет решить вашу проблему!