Двойная публикация пользовательских метаданных wordpress
Мой плагин извлекает значения из пользовательских метаданных заказа и публикует их в discord. Я внес изменения в сценарий, и теперь он дважды публикует пользовательские метаданные.
Загружается полный файл скрипта, а также примерный файл, содержащий только цикл. Цикл также можно найти в полном файле.
На линии 22 я переоделся
add_action( 'woocommerce_checkout_update_order_meta', array( $this, 'send_order' ), 15 );
К
add_action( 'woocommerce_order_status_processing', array( $this, 'send_order' ), 15 );
Как только я меняю статус woocommerce_order_status_processing, мой цикл for начинает дважды публиковать все. Мне нужно, чтобы двойной пост прекратился.
Пример того, как выглядит пост discord
Bob Joe <-- имя клиента
Заказ №123123 <-- номер заказа
Совершенно новая футболка <-- название продукта
Цвет: Красный <-- что следует разместить
Размер: Средний
Цвет: Красный <-- двойной столб
Размер Средний
Только пользовательские параметры удваиваются и только с этим одним набором фильтров. Однако мне нужен этот набор фильтров или, по крайней мере, один, который срабатывает, когда сообщение настроено на обработку.
Решение должно срабатывать только тогда, когда оно настроено на обработку.
Вот мой полный код
<?php /** * WP Discord Post WooCommerce * * @author Nicola Mustone * @license GPL-2.0+ */ if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Main class of the compatibility with WooCommerce. */ class WP_Discord_Post_WooCommerce { /** * Adds the required hooks. */ public function __construct() { if ( 'yes' === get_option( 'wp_discord_enabled_for_woocommerce' ) ) { add_action( 'woocommerce_order_status_processing', array( $this, 'send_order' ), 15 ); } } /** * Sends the order to Discord using the specified webhook URL and Bot token. * * @param int $order_id The order ID. */ public function send_order( $order_id ) { $order = wc_get_order( $order_id ); $content = $this->_prepare_order_content( $order ); $embed = array(); if ( ! wp_discord_post_is_embed_enabled() ) { $embed = $this->_prepare_order_embed( $order_id, $order ); } //todo:: Need to support multiple orders. $tm_option = $this->_get_tm_option($order->get_items()); $http = new WP_Discord_Post_HTTP( 'post', $tm_option); return $http->process( $content, $embed ); } /** * Prepares the request content for orders. * * @param object $order The order object. * @return string */ protected function _prepare_order_content( $order ) { $order_number = strip_tags( $order->get_order_number() ); $order_total = html_entity_decode( strip_tags( $order->get_formatted_order_total() ) ); $mention_everyone = get_option( 'wp_discord_post_mention_everyone' ); $message_format = get_option( 'wp_discord_order_message_format' ); $content = str_replace( array( '%order_number%', '%order_total%' ), array( $order_number, $order_total ), $message_format ); if ( empty( $content ) ) { $content = sprintf( esc_html__( 'Order #%1$s has been created. The order total is %2$s.', 'wp-discord-post' ), $order_number, $order_total ); } if ( 'yes' === $mention_everyone && false === strpos( $content, '@everyone' ) ) { $content = '@everyone ' . $content; } $content = apply_filters( 'wp_discord_post_woocommerce_order_content', $content, $order ); return $content; } /** * Prepares the embed for the the order. * * @access protected * @param int $order_id The order ID. * @param object $order The order object. * @return array */ protected function _prepare_order_embed( $order_id, $order ) { $embed = array( 'title' => sprintf( esc_html__( 'Order #%d', 'wp-discord-post' ), strip_tags( $order->get_order_number() ) ), 'url' => $order->get_edit_order_url(), 'timestamp' => get_the_date( 'c', $order_id ), 'author' => esc_html( $order->get_formatted_billing_full_name() ), 'fields' => array(), ); $items = $order->get_items(); foreach($items as $i) { $tm_extra_options = ''; $meta = $i->get_meta_data(); foreach( $meta as $m) { $meta_array = $m->get_data(); if ($meta_array['key'] == '_tmcartepo_data') { foreach($meta_array['value'] as $mv) { if (!empty($mv['name'])) { $name = $mv['name']; $value = $mv['value']; if (strpos($value, "Priority - Fast Completion") !== false) { $name = str_replace("Extra Options", '', $name); } if (strpos($name, "Platform") !== false) { $name = str_replace("Platform", '', $name); } } else { $name = "(No Name)"; } if (!empty($mv['value'])){ $value = $mv['value']; if (strpos($value, "Priority - Fast Completion") !== false) { $value = str_replace("Priority - Fast Completion", '', $value); } } else { $value = "(No Value)"; } if (!empty($name) && (!empty($value))){ $tm_extra_options .= $name . ": " . $value . "\n"; } } } } //break; $embed['fields'][] = array( 'name' => esc_html__($i->get_name(), 'wp-discord-post' ), 'value' => esc_html__($tm_extra_options), ); } $embed = apply_filters( 'wp_discord_post_order_embed', $embed, $product ); return $embed; } public function _get_tm_option($order_items) { $tc_type_array = array(); $tc_label = get_option('wp_discord_post_settings_webhooks_tm_target_label'); foreach($order_items as $item) { $meta = $item->get_meta_data(); foreach( $meta as $m) { $meta_array = $m->get_data(); if ($meta_array['key'] == '_tmcartepo_data') { foreach($meta_array['value'] as $mv) { if ($mv['name'] == $tc_label) { $tc_type_array[] = strtolower($mv['value']); } } } } } if (count(array_unique($tc_type_array)) === 1) { return $tc_type_array[0]; } else { return 'other'; } } } return new WP_Discord_Post_WooCommerce();
Что я уже пробовал:
я изменил woocommerce_order_status_processing на woocommerce_order_status_completed, но ошибка осталась прежней