HEX
Server: Apache
System: Linux sxb1plzcpnl440011.prod.sxb1.secureserver.net 4.18.0-553.54.1.lve.el8.x86_64 #1 SMP Wed Jun 4 13:01:13 UTC 2025 x86_64
User: xfp2mtarcm67 (7705020)
PHP: 7.3.33
Disabled: NONE
Upload Files
File: //home/xfp2mtarcm67/www/wp-content/plugins/tiktok-for-business/admin/tts/order_list.php
<?php

namespace tiktok\admin\tts\order_list;

use function tiktok\admin\tts\common\array_insert_after;
use function tiktok\admin\tts\common\get_edit_link;
use function tiktok\admin\tts\common\get_tts_seller_center_origin;

/**
 * The order list class
 */
class OrderList {

	/**
	 * The constructor
	 */
	public static function init() {
		// check for woo install
		self::modify_table();
		// self::add_tiktok_filter();
		self::load_style_and_script();
	}

	public static function load_style_and_script() {
		add_action(
			'admin_enqueue_scripts',
			function ( $hook ) {
				if ( 'edit.php' != $hook ) {
					return;
				}
				wp_enqueue_style(
					'tts_order_css',
					plugins_url( '/css/order.css', dirname( __DIR__ ) . '/tiktok-for-woocommerce.php' ),
					'',
					'v1'
				);
				wp_enqueue_script(
					'tts_order_js',
					plugins_url( '/js/order.js', dirname( __DIR__ ) . '/tiktok-for-woocommerce.php' ),
					'',
					'v1'
				);
			}
		);
	}

	/**
	 * Add Channel adn Update columns
	 * hook located in wordpress/wp-admin/includes/screen.php get_column_headers function
	 */
	private static function modify_table() {
		add_filter(
			'manage_edit-shop_order_columns',
			function ( $columns ) {
				$new_columns = array_insert_after(
					'order_number',
					$columns,
					'order_channel',
					esc_html__( 'Channel' )
				);
				$new_columns = array_insert_after(
					'order_status',
					$new_columns,
					'order_update',
					esc_html__( 'Update' )
				);

				return $new_columns;
			}
		);

		/**
		 * Default show all columns in order list page
		 * hook located in wordpress/wp-admin/includes/screen.php get_hidden_columns function
		 * set priority greater than woocommerce filter
		 */
		add_filter(
			'default_hidden_columns',
			function ( $hidden, $screen ) {
				return 'edit-shop_order' === $screen->id ? array() : $hidden;
			},
			10000,
			2
		);

		/**
		 * Tiktok order remove action button
		 * hook located in woocommerce/src/Internal/Admin/Orders/ListTable.php column_wc_actions method
		 */
		add_filter(
			'woocommerce_admin_order_actions',
			function ( $actions, $order ) {
				return $order->get_meta( 'tiktok_order' ) ? array() : $actions;
			},
			10,
			2
		);

		/**
		 * Set the contents for each row of the custom columns
		 * hook located in wordpress/wp-admin/includes/class-wp-posts-list-table.php column_default method
		 */
		add_action(
			'manage_shop_order_posts_custom_column',
			function ( $column ) {
				$tts_awaiting_shipment = '111';
				$pl_3                  = '0';
				$pl_4                  = '1';

				// wc_get_order() defaults to the global $post object, so we don't need to pass a parameter.
				global $post;
				$order                     = wc_get_order( $post->ID );
				$is_tiktok_order           = (bool) $order->get_meta( 'tiktok_order' );
				$tiktok_order_id           = $order->get_meta( 'tiktok_order_id' );
				$tiktok_fulfillment_type   = $order->get_meta( 'tiktok_fulfillment_type' );
				$is_tiktok_fulfillment_3pl = $tiktok_fulfillment_type === $pl_3;
				// $is_tiktok_fulfillment_4pl || ! = $tiktok_fulfillment_type === $pl_4;
				$is_highlight_button = $order->get_meta( 'tiktok_order_status' ) === $tts_awaiting_shipment;

				/**
				 * Debug start
				 */
				// $order_data = $order->get_data();
				// $order_id = $order_data['id'];
				// $order_status = $order_data['status'];
				// if ( 'wc_actions' === $column ) {
				// printf('<p>test add button</p>'.$tiktok_order_id.'xxx'.$post->ID);
				// printf('<p>tiktok_fulfillment_type</p>'.$order->get_meta( 'tiktok_fulfillment_type' ));
				// printf('<p>tiktok_order</p>'.$order->get_meta( 'tiktok_order' ));
				// printf('<p>tiktok_order_status</p>'.$order->get_meta( 'tiktok_order_status' ));
				// }
				/**
				 * Debug end
				 */
				if ( 'order_channel' === $column ) {
					echo esc_html__( $is_tiktok_order ? 'TikTok' : '-' );
					return;
				}

				if ( 'order_update' === $column ) {
					// split text by timestamp
					$texts = preg_split(
						'/{(\d+)}/',
						$is_tiktok_order && $order->get_meta( 'tiktok_order_update' ) ? $order->get_meta( 'tiktok_order_update' ) : '',
						-1,
						PREG_SPLIT_DELIM_CAPTURE
					);

					foreach ( $texts as $key => $value ) {
						if ( preg_match( '/^\d+$/', $value ) ) {
							// need to replace utc timestamp with the time in the corresponding time zone
							echo '<span style="color:red">' . esc_html__( get_date_from_gmt( gmdate( 'Y-m-d H:i:s', $value ) ) ) . '</span>';
						} else {
							echo esc_html__( $value );
						}
					}

					return;
				}

				if ( 'wc_actions' === $column && $is_tiktok_order ) {
					if ( $is_tiktok_fulfillment_3pl ) {
						$style_string  = 'padding:0.3em !important;width:7em;height:auto !important;text-indent:0;text-align:center;line-height:normal;white-space:normal;';
						$style_string .= $is_highlight_button ? 'background:yellow' : '';

						printf(
							'<a class="button" style="%s" target="_blank" href="%s">%s</a>',
							esc_attr( $style_string ),
							esc_url( get_tts_seller_center_origin() . '/order' ),
							esc_html__( $is_highlight_button ? 'Add Tracking Info' : 'Update Tracking Info' )
						);
					} else {
						printf(
							'<a class="button" style="%s" target="_blank" href="%s">%s</a>',
							'padding:0.3em !important;width:7em;height:auto !important;text-indent:0;text-align:center;line-height:normal;white-space:normal',
							esc_url( get_tts_seller_center_origin() . '/order/detail?order_no=' . $tiktok_order_id ),
							esc_html__( 'Manage on seller center' )
						);
					}
				}
			}
		);
	}

	/**
	 * Add TikTok views
	 * hook is located in wordpress/wp-admin/includes/class-wp-list-table.php views method
	 */
	private static function add_tiktok_filter() {
		add_filter(
			'views_edit-shop_order',
			function ( $views ) {
				$screen    = get_current_screen();
				$curr_page = 1;
				$orders    = array();
				$num_pages = wc_get_orders(
					array(
						'page'     => $curr_page,
						'paginate' => true,
						'limit'    => 10,
						'meta_key' => 'tiktok_order',
						'type'     => 'shop_order',
					)
				)->max_num_pages;

				while ( $curr_page <= $num_pages ) {
					$new_orders = wc_get_orders(
						array(
							'page'     => $curr_page,
							'limit'    => 10,
							'meta_key' => 'tiktok_order',
							'type'     => 'shop_order',
						)
					);
					$orders     = array_merge( $orders, $new_orders );
					$curr_page++;
				}

				return array_merge(
					$views,
					array(
						'tiktok' => get_edit_link(
							array(
								'post_type' => $screen->post_type,
								'channel'   => 'tiktok',
							),
							'TikTok <span class="count">(' . number_format_i18n( count( $orders ) ) . ')</span>',
							isset( $_REQUEST['channel'] ) && 'tiktok' === $_REQUEST['channel'] ? 'current' : ''
						),
					)
				);
			}
		);

		/**
		 * Modify query args of WP_Query instance
		 * need to wait current screen been set
		 * hook located in wordpress/wp-includes/class-wp-query.php get_posts method
		 */
		add_action(
			'current_screen',
			function ( $screen ) {
				add_action(
					'pre_get_posts',
					function ( $query ) use ( $screen ) {
						if (
							'edit-shop_order' === $screen->id &&
							'shop_order' === $screen->post_type &&
							isset( $_GET['channel'] ) &&
							'tiktok' === $_GET['channel']
						) {
							$query->query_vars['meta_key'] = 'tiktok_order';
						}
					}
				);
			}
		);
	}
}

OrderList::init();