Intereting Posts
Как исправить старые внедренные iframes с помощью WP-CLI search-replace Загрузка PDF с помощью Media Uploader Регистрация только в виде виджета – это особый тип пользовательских сообщений «Meta_value_num» не работает, когда значение обернуто в теги html Можно ли добавлять классы в список элементов в wp_nav_menu ()? Ход меню WordPress. Получите текст родительского элемента внутри функции end_lvl. Включите раздел на веб-сайт, который разработан в PHP-симфонии, хотя веб-сайт разработан с помощью шаблона add_rewrite_endpoint возвращает 404 Статическая страница Wonderflux Скрыть визуальный редактор страницы, если выбран какой-либо шаблон? Что я должен наложить на index.php? Как заблокировать контент? Изменение размера изображений в пакетном режиме Исключить плагины на главном сайте при многоуровневой установке? Рекомендации: пользовательское меню боковой панели темы – жесткий код или виджет?

get_term_meta возвращает false в виджет

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

Теперь, когда я открываю магазин (-> открытие единственного Term), функция get_term_meta( term_id, 'vendor_data', true ) работает просто отлично и дает мне ассоциативный массив со всеми моими значениями, хранящимися в таблице termmeta для моего meta_key 'vendor_data' ,

Но когда я нахожусь в своем get_term_data( id, 'vendor_data', true) , и я get_term_data( id, 'vendor_data', true) список магазинов, и я вызываю get_term_data( id, 'vendor_data', true) результат является false (я предоставляю функции тем же аргументам, что и на странице магазина). Если, с другой стороны, я вызываю get_term_data( id, '', true) я получаю результат, который я вставил ниже. Почему это? Как я могу решить эту проблему, так как это также влияет на виджет, который поставляется с исходным плагином поставщика продуктов (который не работает из-за этой проблемы).

Здесь var_dump(get_term_data( id, '', true )) :

 array(1) { ["vendor_data"]=> array(1) { [0]=> string(369) "a:11:{s:5:"notes";s:0:"";s:4:"logo";s:5:"76052";s:7:"profile";s:63:"Description.";s:5:"email";s:16:"shop@xxx.de";s:6:"admins";s:3:"103";s:10:"commission";i:0;s:15:"commission_type";s:5:"fixed";s:6:"paypal";s:0:"";s:20:"per_product_shipping";s:3:"yes";s:15:"enable_bookings";s:2:"no";s:14:"instant_payout";s:2:"no";}" } } 

С фильтром var_dump( get_term_data( id, 'vendor_data', true )) :

 bool(false) 

Значение meta_value для ключевого vendor_data внутри wp_termmeta :

 a:11:{s:5:"notes";s:0:"";s:4:"logo";s:5:"76052";s:7:"profile";s:63:"Description.";s:5:"email";s:16:"shop@xxx.de";s:6:"admins";s:3:"103";s:10:"commission";i:0;s:15:"commission_type";s:5:"fixed";s:6:"paypal";s:0:"";s:20:"per_product_shipping";s:3:"yes";s:15:"enable_bookings";s:2:"no";s:14:"instant_payout";s:2:"no";} 

РЕДАКТИРОВАТЬ:

Я сузил проблему до функции get_metadata в которой в конце функции выполняются следующие проверки:

 if ( ! $meta_key ) { return $meta_cache; } if ( isset($meta_cache[$meta_key]) ) { if ( $single ) return maybe_unserialize( $meta_cache[$meta_key][0] ); else return array_map('maybe_unserialize', $meta_cache[$meta_key]); } 

Это объясняет: если 'vendor_data' как meta_key остается пустым, возвращается 2d-массив, как указано выше. Если он установлен, а $ single – true (который равен $ single, это третий параметр), он возвращает maybe_unserialize(..) . Я проверил это, просто вернув $meta_cache[$meta_key][0] без функции unserialize, и результатом является точная текстовая строка, которая сохраняется в базе данных. Это означает, что функция maybe_unserialize возвращает false. Но это функция:

 function maybe_unserialize( $original ) { if ( is_serialized( $original ) ) // don't attempt to unserialize data that wasn't serialized going in return @unserialize( $original ); return $original; 

}

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

Пожалуйста, помогите мне: что здесь происходит?

Нашел вопрос. Как-то моя сериализованная строка была повреждена, пытаясь отредактировать данные в WP Backend, она выбросила ошибку и данные были сброшены. Unserialize теперь работает нормально, и все в порядке. Я не знаю, может ли это помочь любому, кто может быть в подобной ситуации, поэтому я не удаляю это прямо сейчас. Если мода считает, что это нужно удалить, не стесняйтесь удалить его или сообщить мне, и я удалю его самостоятельно.