NoorKaximi Ответов: 0

Двойная публикация пользовательских метаданных 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, но ошибка осталась прежней

0 Ответов