Intereting Posts

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

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

// 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; } }