Intereting Posts
Получить родительский URL-адрес страницы, если он находится на дочерних страницах Сделать липкий пост при сохранении как проверить, активна ли данная страница «Автоматически добавлять новые страницы верхнего уровня». По умолчанию Изображения, не работающие с использованием Рекомендуемые сообщения Отображение месяца на английском языке, но требуется на шведском языке? Санитировать название слизня Как проверять почтовый метафайл / расширение (файл файла видеофайла и т. Д.) get_posts из идентификатора категории не работает Неустранимая ошибка в функции wp_get_current_user () Сделать пароль недействительным после выхода из защищенной паролем страницы Бесплатный хостинг файлов для WordPress Создание сообщений из данных API, как идентифицировать уже импортированные должности? Извлечь значения атрибутов из каждого короткого кода в сообщении Показ «Уведомление: неопределенная переменная:» и «Примечание: попытка получить свойство не-объекта»

Как совместно использовать переменные между двумя функциями?

Итак … вот часть моего кода для плагина. Я новичок, поэтому будьте добрыми. Я читал о глобальных переменных, но я не могу заставить его работать, и я читал, что вы все равно не должны их использовать. Итак, что было бы лучшим способом написать ниже код без необходимости повторного объявления переменных для каждой функции? Вот полный код, если необходимо.

// Display the product badge on the shop page add_action( 'woocommerce_after_shop_loop_item_title', 'wc_simple_product_badge_display_shop', 30 ); function wc_simple_product_badge_display_shop() { $title = get_post_meta( get_the_ID(), '_wc_simple_product_badge_title', true ); // badge title $class = get_post_meta( get_the_ID(), '_wc_simple_product_badge_class', true ); // badge class $duration = get_post_meta( get_the_ID(), '_wc_simple_product_badge_duration', true ); // badge duration $postdate = get_the_time( 'Ymd' ); // post date $postdatestamp = strtotime( $postdate ); // post date in unix timestamp $difference = round ((time() - $postdatestamp) / (24*60*60)); // difference in days between now and product's post date if ( !empty( $title ) && empty( $duration ) || !empty( $title ) && $difference <= $duration ){ // Check to see if there is a title and the product is still within the duration timeframe if specified $class = !empty( $class ) ? $class : ''; echo '<span class="wc_simple_product_badge ' . $class . '">' . $title . '</span>'; } } // Display the product badge on the single page add_filter( 'woocommerce_single_product_image_html', 'wc_simple_product_badge_display_single' ); function wc_simple_product_badge_display_single( $img_html ) { $title = get_post_meta( get_the_ID(), '_wc_simple_product_badge_title', true ); // badge title $class = get_post_meta( get_the_ID(), '_wc_simple_product_badge_class', true ); // badge class $duration = get_post_meta( get_the_ID(), '_wc_simple_product_badge_duration', true ); // badge duration $single_opt = get_post_meta( get_the_ID(), '_wc_simple_product_badge_single_page_option', true ); // badge on single page $postdate = get_the_time( 'Ymd' ); // post date $postdatestamp = strtotime( $postdate ); // post date in unix timestamp $difference = round ((time() - $postdatestamp) / (24*60*60)); // difference in days between now and product's post date if ( !empty( $title ) && empty( $duration ) && $single_opt === 'yes' || !empty( $title ) && $difference <= $duration && $single_opt === 'yes' ){ // Check to see if there is a title and the product is still within the duration timeframe ()if specified) and the checkbox is checked to show on single page view $class = !empty( $class ) ? $class : ''; echo '<span class="wc_simple_product_badge ' . $class . '">' . $title . '</span>'; return $img_html; } elseif ( $single_opt === 'no' ) { // Check to see if the checkbox is unchecked to show on single page view return $img_html; } } 

Solutions Collecting From Web of "Как совместно использовать переменные между двумя функциями?"

Создайте класс для хранения переменных как частных, внутренних членов. Настройте переменные, когда объект сообщения настроен, это действие the_post .

Затем назначьте методы класса как обратные вызовы вместо отдельных функций.

Вот ваш код слегка переформатирован:

Класс

 class WPSE_WC_Badge { private $title = ''; private $class = ''; private $duration = ''; private $postdate = ''; private $postdatestamp = ''; private $difference = 0; public function __construct( \WP_Post $post ) { $this->title = get_post_meta( $post->ID, '_wc_simple_product_badge_title', TRUE ); // badge title $this->class = get_post_meta( $post->ID, '_wc_simple_product_badge_class', TRUE ); // badge class $this->duration = get_post_meta( $post->ID, '_wc_simple_product_badge_duration', TRUE ); // badge duration $this->postdate = get_the_time( 'Ym-d', $post ); // post date $this->postdatestamp = strtotime( $this->postdate ); // post date in unix timestamp // difference in days between now and product's post date $this->difference = round( ( time() - $this->postdatestamp ) / DAY_IN_SECONDS ); } function loop() { if ( ! empty( $this->title ) && empty( $this->duration ) || ! empty( $this->title ) && $this->difference <= $this->duration ) { // Check to see if there is a title and the product is still within the duration timeframe if specified echo '<span class="wc_simple_product_badge ' . $this->class . '">' . $this->title . '</span>'; } } function single( $img_html ) { $single_opt = get_post_meta( get_the_ID(), '_wc_simple_product_badge_single_page_option', TRUE ); // badge on single page if ( ! empty ( $this->title ) && empty( $this->duration ) && $single_opt === 'yes' || ! empty( $this->title ) && $this->difference <= $this->duration && $single_opt === 'yes' ) { echo '<span class="wc_simple_product_badge ' . $this->class . '">' . $this->title . '</span>'; return $img_html; } return $img_html; } } 

И регистрация

 add_action( 'the_post', function( \WP_Post $post ) { $badge = new WPSE_WC_Badge( $post ); // Display the product badge on the shop page add_action( 'woocommerce_after_shop_loop_item_title', [ $badge, 'loop' ], 30 ); // Display the product badge on the single page add_filter( 'woocommerce_single_product_image_html', [ $badge, 'single' ] ); }); 

Я не тестировал это, пожалуйста, возьмите его как отправную точку.

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

— Использование глобалов —

Любая переменная, определенная в глобальной области (не внутри функции или аналогичной), по своей сути является глобальной. Чтобы получить доступ к глобальному с помощью функции, вы должны использовать глобальное ключевое слово, например global $myglobal

Вот ваш код, реорганизованный для демонстрации:

 <?php $product_data = array(); // populating the global on a hook before the other two add_action('woocommerce_before_single_product','populate_product_data'); function populate_product_data() { global $product_data; $postdate = get_the_time( 'Ymd' ); // post date $postdatestamp = strtotime($postdate); $product_data = array( 'title' => get_post_meta( get_the_ID(), '_wc_simple_product_badge_title', true ), // badge title 'class' => get_post_meta( get_the_ID(), '_wc_simple_product_badge_class', true ), // badge class 'duration' => get_post_meta( get_the_ID(), '_wc_simple_product_badge_duration', true ), // badge duration 'single_opt' => get_post_meta( get_the_ID(), '_wc_simple_product_badge_single_page_option', true ), // badge on single page 'postdate' => $postdate, 'postdatestamp' => $postdatestamp, // post date in unix timestamp 'difference' => round ((time() - $postdatestamp) / (24*60*60)), // difference in days between now and ); } add_action( 'woocommerce_after_shop_loop_item_title', 'wc_simple_product_badge_display_shop', 30 ); function wc_simple_product_badge_display_shop() { global $product_data; if ( !empty( $product_data['title'] ) && empty( $product_data['duration'] ) || !empty( $product_data['title'] ) && $product_data['difference'] <= $product_data['duration'] ){ // Check to see if there is a title and the product is still within the duration timeframe if specified $class = !empty( $class ) ? $class : ''; echo '<span class="wc_simple_product_badge ' . $product_data['class'] . '">' . $product_data['title'] . '</span>'; } } // Display the product badge on the single page add_filter( 'woocommerce_single_product_image_html', 'wc_simple_product_badge_display_single' ); function wc_simple_product_badge_display_single( $img_html ) { global $product_data; if ( !empty( $product_data['title'] ) && empty( $product_data['duration'] ) && $product_data['single_opt'] === 'yes' || !empty( $product_data['title'] ) && $product_data['difference'] <= $product_data['duration'] && $product_data['single_opt'] === 'yes' ){ // Check to see if there is a title and the product is still within the duration timeframe ()if specified) and the checkbox is checked to show on single page view $class = !empty( $product_data['title'] ) ? $product_data['title'] : ''; echo '<span class="wc_simple_product_badge ' . $product_data['class'] . '">' . $product_data['title'] . '</span>'; return $img_html; } elseif ( $product_data['single_opt'] === 'no' ) { // Check to see if the checkbox is unchecked to show on single page view return $img_html; } }