سرمایه گذاری متفاوت در سال نو 🍎🌱 ۳۵٪ تخفیف نوروزی ➕ حضور رایگان در مسترمایند نخبگان صنعت نرم‌افزار 💻✅
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ مهدی فانی
چالش با یکپارچه سازی پنل با ووکامرس
جامعه وردپرس (برنامه نویسی) ایجاد شده در ۱۳ خرداد ۱۴۰۳

سلام. 

من در افزونه پنل کاربری اومدم برای نمایش آیتم‌های سبد خرید از این کلاس استفاده کردم:

<?php
defined( 'ABSPATH' ) || exit;
class CartItems {
public static function get_user_cart_items() {
global $woocommerce;
if ( ! WC()->cart ) {
return [
'items' => [],
'total_price' => 0,
'total_items' => 0,
];
}
WC()->cart->calculate_totals();
$items = WC()->cart->get_cart();
$subtotal = WC()->cart->get_cart_subtotal();
$total_items = WC()->cart->get_cart_contents_count();
return [
'items' => $items,
'total_price' => $subtotal,
'total_items' => $total_items,
];
}
}


توی ویو هم طبق معمول اینکار کردم:

include_once UPP_DIR . 'utility/woocommerce/CartItems.php';
$cart_data   = CartItems::get_user_cart_items();

 

آیتم‌های سبد خرید ووکامرس رو من دریافت میکنم و به درستی همچی کار میکنه و میتونم با ایجکس آیتم از سبد خرید حذف و اضافه کنم.
اما یک php Notice هم توی لاگ دریافت میکنم با این مضمون:

PHP Notice: get_cart() should not be called before the wp_loaded action

این پیغام رو نتونستم برطرفش کنم. حتی اومدم متد داخل کلاس رو به اکشن wp_loaded هم وصل کردم. اما اکی نشد.
یه نکته توی این سیستم روتینگ هست که متوجه نمیشم. وقتی من چک کردم که آیا اکشن wp_loaded توی روت‌های این پنل فایر شده یا نه، چند بار فایر شده؟ کلا اتفاق نمی‌افته.
 

if (did_action('wp_loaded') > 0) {
	echo 'اکشن wp_loaded اتفاق افتاده است.';exit;
} else {
	echo 'اکشن wp_loaded اتفاق نیافتاده است.';exit;
	}


و به خاطر همین فکر کنم وقتی از کلاس کارت آیتم استفاده میکنم این خطا در لاگ سیستم ثبت میشه.
این پیغام چقدر میتونه مهم باشه؟ 
ایده خودم اینه که ووکامرس رو توی فایل اصلی پلاگین اینکلودش کنم اما نمیدونم کار درستیه یا نه و یا کلا کار کنه یا نه. لطفا راهنمایی ام کنین. 

سلام شما میتونید با استفاده از هوک‌های لازم اطمینان حاصل کنید که حتما کلاستون بعد از بارگذاری کامل ووکامرس فراخوانی بشه مثل مثال زیر

<?php
defined( 'ABSPATH' ) || exit;
class My_Plugin {
    public function __construct() {
 add_action('wp_loaded', array($this, 'initialize_cart'));
    }
    public function initialize_cart() {
UPP_DIR . 'utility/woocommerce/CartItems.php';
    }
}
new My_Plugin();
ابوالفضل محجوب ۱۴ خرداد ۱۴۰۳، ۰۵:۳۷

مساله اینجاست که این هوک wp_loaded توی سیستم روتینگ پنل کار نمیکنه. چون جدای از وردپرس هست. اصلا فایر نمیشه. اما هوک اینیت کار میکنه و اجرا میشه. من این کار کردم:

کلاس کارت آیتم رو به هوک اینیت وصل کردم:

<?php
defined( 'ABSPATH' ) || exit;
class CartItems {
	private $cartItems;
	public function __construct() {
		add_action( 'init', [ $this, 'initialize_cart' ] );
	}
	public static function get_user_cart_items() {
		global $woocommerce;
		if ( ! WC()->cart ) {
			return [
				'items'       => [],
				'total_price' => 0,
				'total_items' => 0,
			];
		}
		WC()->cart->calculate_totals();
		$items       = WC()->cart->get_cart();
		$subtotal    = WC()->cart->get_cart_subtotal();
		$total_items = WC()->cart->get_cart_contents_count();
		return [
			'items'       => $items,
			'total_price' => $subtotal,
			'total_items' => $total_items,
		];
	}
	public function initialize_cart() {
		$this->cartItems = self::get_user_cart_items();
	}
	public function get_cart_items() {
		return $this->cartItems;
	}
}

 

و در کلاس اصلی پلاگین هم این متد اضافه کردم:

public function initialize_cart_items() {
		require_once UPP_DIR . 'utility/woocommerce/CartItems.php';
		global $cartItemsInstance;
		$cartItemsInstance = new CartItems();
	}

 

توی ویو هم این کد قرار دادم که تست کنم:

<?php
global $cartItemsInstance;
print_r($cartItemsInstance);exit;
?>

اما خروجی نداره.

مهدی فانی ۱۴ خرداد ۱۴۰۳، ۱۱:۱۶