WooCommerce Abonelik Eklentisi için Özel durum Nasıl Oluşturulur


Bugünün makalesinde, özel durumlar oluşturmak için WooCommerce Abonelik eklentisini nasıl genişleteceğinizi göstereceğim. Benzer şekilde ' Beklemede ' gibi çalışan ' Beklemede Beğen ' adlı yeni bir WooCommerce Abonelik durumu oluşturacağım .

Hadi başlayalım!

#1 Aşağıda gösterildiği gibi woocommerce_subscriptions_registered_statuses eylemini kullanarak abonelikte yeni durumu kaydetmek için ilk adım :

 add_filter ( 'woocommerce_subscriptions_registered_statuses' , 'register_new_post_status' , 100 , 1 ) ;

function register_new_post_status ( $registered_statuses ) {
	$registered_statuses [ 'wc-like-on-hold' ] = _nx_noop ( 'Like On Hold <span class="count">(%s)</span>' , 'Like On Hold <span class="count"> (%s)</span>' , 'gönderme sayısı dahil gönderi durumu etiketi' , 'özel-wcs-status-texts' ) ;
	$registered_statuses döndür ;
}

#2 Bu durumu abonelik sayfasındaki durum açılır menüsünde görünür kılmak için, aşağıda gösterildiği gibi 'wcs_subscription_statuses' filtresini kullanarak bunu abonelik durumları listesine eklemeniz gerekir:

 add_filter ( 'wcs_subscription_statuses' , 'add_new_subscription_statuses' , 100 , 1 ) ;

function add_new_subscription_statuses ( $subscription_statuses ) {
	$subscription_statuses [ 'wc-like-on-hold' ] = _x ( 'Beklemedeki Beğeni' , 'Abonelik durumu' , 'özel-wcs-status-texts' ) ;
	$subscription_statuses döndür ;
}

Açılır menüde yeni durumun görünürlüğü için belirli bir statüye sahip aboneliğin yeni duruma güncellenip güncellenmeyeceğini belirtmeniz gerekir. Bu, 'woocommerce_subscription_status_updated' kullanılarak yapılabilir .

 add_filter ( 'woocommerce_can_subscription_be_updated_to' , 'extends_can_be_updated' , 100 , 3 ) ;

fonksiyon extensions_can_be_updated ( $can_be_updated , $new_status , $abonelik ) {
	if ( $new_status == 'beklemedeki gibi' ) {
		if ( $subscription -> payment_method_supports ( 'subscription_suspension' ) && $subscription -> has_status ( array ( 'etkin' , 'beklemede' , ' beklemede ' ) ) {
			$can_be_updated = doğru ;
		} başka {
			$can_be_updated = yanlış ;
		}
	}
	$can_be_updated döndür ;
}

#3 Şimdi, yönetici açılır menüden 'Beklemede Beğen'i seçtiğinde ve aboneliği güncellediğinde bir eylem gerçekleştirmek için 'woocommerce_subscription_status_updated' eylemini kullanarak update_status işlevini genişletmemiz gerekiyor . Burada bekleme durumuyla aynı kodu kopyalayıp yapıştıracağız .

add_action ( 'woocommerce_subscription_status_updated' , 'extends_update_status' , 100 , 3 ) ;

function extensions_update_status ( $abonelik , $yeni_status , $eski_status ) {
	if ( $new_status == 'beklemedeki gibi' ) {
		$abonelik -> update_suspension_count ( $abonelik -> süspansiyon_sayısı + 1 ) ;
		wcs_maybe_make_user_inactive ( $subscription -> customer_user ) ;
	}
}

WooCommerce aboneliğinde 'Beklemede Beğen' adlı yeni bir durum ayarlamak için temel kod burada sona eriyor.

Şimdi, mevcut durumu 'Beklemede Beğen' olan bir aboneliğin açılır menüsünde belirli bir durumu göstermek ve yeni durumu liste sayfasındaki toplu eyleme eklemek ve işlemek gibi bazı şeyleri ele alalım.

add_filter ( 'woocommerce_can_subscription_be_updated_to_active' , 'enable_active_in_new_statuses' , 100 , 2 ) ;

add_filter ( 'woocommerce_can_subscription_be_updated_to_on-hold' , 'enable_on_hold_in_new_statuses' , 100 , 2 ) ;

function enable_active_in_new_statuses ( $can_be_updated , $abonelik ) {
	if ( $subscription -> payment_method_supports ( 'subscription_reactivation' ) && $subscription -> has_status ( array ( 'beklemede' , 'beklemede gibi ' ) ) {
		$can_be_updated = doğru ;
	} elseif ( $abonelik -> has_status ( 'beklemede' ) ) {
		$can_be_updated = doğru ;
	} başka {
		$can_be_updated = yanlış ;
	}
	$can_be_updated döndür ;
}

function enable_on_hold_in_new_statuses ( $can_be_updated , $abonelik ) {
	if ( $subscription -> Payment_method_supports ( 'subscription_suspension' ) && $subscription -> has_status ( array ( 'aktif' , 'beklemede' , 'beklemede gibi ' ) ) {
		$can_be_updated = doğru ;
	} başka {
		$can_be_updated = yanlış ;
	}
	$can_be_updated döndür ;
}

#4 'woocommerce_subscription_bulk_actions' filtresini kullanarak abonelik listesi sayfasındaki toplu işlem açılır listesine yeni durumu ekleme .

 add_filter ( 'woocommerce_subscription_bulk_actions' , 'add_new_status_bulk_actions' , 100 , 1 ) ;

function add_new_status_bulk_actions ( $bulk_actions ) {
	$bulk_actions [ 'beklemedeki gibi' ] = _x ( 'Beklemede Beğeni İşaretle' , 'abonelikteki bir eylem' , 'özel-wcs-status-texts' ) ;
	$bulk_actions döndür ;
}

#5 Aşağıdaki kod, toplu eylemlerin ele alınmasıyla ilgilidir . Stil, WooCommerce'in yaptığına benzer. Uzantılar, woocommerce abonelik eklentisinde yazılan yöntemin arkasındaki konsepti kopyalayarak kendi mantıklarını tanımlamalıdır. İşlev, wordpress çekirdeğinin 'load-edit.php' eylemine bağlıdır.

add_action ( 'load-edit.php' , 'parse_bulk_actions' ) ;

function parse_bulk_actions ( ) {


	// Biz sadece shop_subscriptions ile uğraşmak istiyoruz. Diğer CPT'lerin 'aktif' bir eylemi olması durumunda
	if ( ! isset ( $_REQUEST [ 'post_type' ] ) || 'shop_subscription' !== $_REQUEST [ 'post_type' ] || ! isset ( $_REQUEST [ 'post' ] ) ) {
		dönüş ;
	}

	$eylem = '' ;

	if ( isset ( $_REQUEST [ 'eylem' ] ) && - 1 != $_REQUEST [ 'eylem' ] ) {
		$eylem = $_REQUEST [ 'eylem' ] ;
	} elseif ( isset ( $_REQUEST [ 'action2' ] ) && - 1 != $_REQUEST [ 'action2' ] ) {
		$eylem = $_REQUEST [ 'eylem2' ] ;
	}

	geçiş ( $eylem ) {
		durum 'aktif' :
		"beklemede" durum :
		vaka 'iptal edildi' :
		durum 'beklemede' :
			$new_status = $eylem ;
			ara ;
		varsayılan :
			dönüş ;
	}

	$report_action = 'işaretli_' . $yeni_durum ;

	$değişti = 0 ;

	$subscription_ids = array_map ( 'absint' , ( dizi ) $_REQUEST [ 'post' ] ) ;

	$sendback_args = dizi (
		'post_type' => 'shop_subscription' ,
		$report_action => doğru ,
		'ids' => katıl ( ',' , $subscription_ids ) ,
		'hata_sayısı' => 0 ,
		) ;

	foreach ( $subscription_ids as $subscription_id ) {
		$abonelik = wcs_get_subscription ( $subscription_id ) ;
		$order_note = _x ( 'Toplu düzenleme ile abonelik durumu değişti:' , 'Sipariş notunda kullanıldı. Durumun neden değiştiğinin nedeni.' , 'woocommerce-subscriptions' ) ;

		denemek {
			if ( 'iptal edildi' == $eylem ) {
				$abonelik -> iptal_sipariş ( $order_note ) ;
			} başka {
				$abonelik -> update_status ( $new_status , $order_note , true ) ;
			}

			// Eylem kancalarını ateşle
			geçiş ( $eylem ) {
				durum 'aktif' :
				"beklemede" durum :
				vaka 'iptal edildi' :
				durum 'beklemede' :
				durum 'çöp' :
					do_action ( 'woocommerce_admin_changed_subscription_to_' . $action , $subscription_id ) ;
					ara ;
			}

			$değiştirildi ++;
		} yakalama ( İstisna $e ) {
			$sendback_args [ 'hata' ] = urlencode ( $e -> getMessage ( ) ) ;
			$sendback_args [ 'hata_sayısı' ] ++;
		}
	}

	$sendback_args [ 'değişti' ] = $değiştirildi ;
	$sendback = add_query_arg ( $sendback_args , wp_get_referer ( ) ? wp_get_referer ( ) : '' ) ;
	wp_safe_redirect ( esc_url_raw ( $sendback ) ) ;

	çıkış ( ) ;
}

WooCommerce abonelik sonundaki ana işlevlerin çoğunu ele aldık. Şimdi, WooCommerce siparişinde aynı durumu istiyorsak ne olur? Ve siparişin durumu "yeni duruma güncelle" ise, içindeki tüm aboneliği (mümkünse) yeni durumla nasıl işaretleyeceğiz?

O zaman, işte nasıl devam etmemiz gerektiği.

1) WooCommerce'de yeni durum kaydedin .

Burada WooCommerce aboneliği ile aynı durumu kaydedeceğiz.

 add_action ( 'init' , 'register_like_on_hold_order_statuses' ) ;

function register_like_on_hold_order_statuses ( ) {
	register_post_status ( 'wc-beklemedeki gibi' , dizi (
		'label' => _x ( 'Beklemedeki Beğeni' , 'Sipariş durumu' , 'özel-wcs-status-texts' ) ,
		'genel' => doğru ,
		'exclude_from_search' => yanlış ,
		'show_in_admin_all_list' => doğru ,
		'show_in_admin_status_list' => doğru ,
		'label_count' => _n_noop ( 'Beklemede Beğenmek <span class="count">(%s)</span>' , 'Beklemede Beğenmek<span class="count">(%s)</span>' , 'woocommerce' ) ,
	) ) ;
}

2) 'wc_order_statuses' filtresini kullanarak bu yeni durumu sipariş durumları listesine ekleyin

 add_filter ( 'wc_order_statuses' , 'like_on_hold_wc_order_statuses' , 100 , 1 ) ;
işlev like_on_hold_wc_order_statuses ( $order_statuses ) {
	$order_statuses [ 'wc-like-on-hold' ] = _x ( 'Like On Hold' , 'Sipariş durumu' , 'custom-wcs-status-texts' ) ;
	$order_statuses döndür ;
}

3) Sipariş durumu yeni duruma değiştirildiğinde, sipariş içindeki tüm abonelik durumunun yeni duruma değiştirilmesini istiyoruz. Bunu 'woocommerce_order_status_' kullanarak yapabiliriz. $new_status eylemi aşağıda gösterildiği gibi.

 add_action ( 'woocommerce_order_status_hold-on-hold' , dizi ( $this , 'put_subscription_on_like_on_hold_for_order' ) , 100 ) ;

function put_subscription_on_like_on_hold_for_order ( $sipariş ) {

	$subscriptions = wcs_get_subscriptions_for_order ( $sipariş , dizi ( 'order_type' => 'parent' ) ) ;

	if ( ! boş ( $abonelikler ) ) {
		foreach ( $abonelik olarak $abonelik ) {
			denemek {
				if ( ! $subscription -> has_status ( wcs_get_subscription_ended_statuses ( ) ) ) {
					$abonelik -> update_status ( 'beklemedeki gibi' ) ;
				}
			} yakalama ( İstisna $e ) {
				// çevirmenler: $1: sipariş numarası, $2: hata mesajı
				$subscription -> add_order_note ( sprintf ( __ ( '#1$s numaralı sipariş beğeni beklemeye alındıktan sonra abonelik durumu güncellenemedi: %2$s' , 'woocommerce-subscriptions' ) , is_object ( $order ) $order -> get_order_number ( ) : $order , $e -> getMessage ( ) ) ) ;
			}
		}
		// Abonelik eklentisinin beklemeye eklediği gibi yeni bir eylem eklendi
		do_action ( 'subscriptions_put_to_like_on_hold_for_order' , $sipariş ) ;
	}
}

Bu kodun uygulanması, her bir işlevin daha ayrıntılı bir açıklamasıyla birlikte git depomuzda özel-woocommerce-subscription-status bulunabilir.

Bu kadar!. Herhangi bir sorunuz varsa, sadece bir yorum yapın, size geri döneceğim.

O zamana kadar, mutlu kodlamalar.

Copyright statement: Unless otherwise noted, this article is Collected from the Internet, please keep the source of the article when reprinting.

Check Also

Divi's Theme Builder ile Özel Global Başlık Nasıl Oluşturulur

Artık Tema Oluşturucu burada olduğuna göre, web sitenizi A'dan Z'ye kurmanıza yardımcı olacak yeni eğitimlere dalmak için sabırsızlanıyoruz. Buna Divi'nin yerleşik seçeneğini kullanarak özel başlıklar oluşturma da dahildir. Bu eğitimde Divi's Theme Builder'ı kullanarak global bir başlık oluşturmaya odaklanacağız. Bu sayfaya veya gönderiye farklı bir başlık atamadıysanız, web sitenizin her yerinde genel bir başlık görünecektir.

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir