Eklenti etkin, ayarlar kayıtlı, test modunda bile hata yok — ama müşteri ödeme sayfasında o yöntemi hiç görmüyor. Sebep çoğu zaman eklentide değil, ödeme sayfasının türündedir.
WooCommerce 8.3'ten beri yeni mağazalarda ödeme sayfası blok tabanlıdır ve ödeme yöntemlerini tarayıcıda React ile çizer. Blok ödeme sayfası, WC_Payment_Gateway sınıfından türeyen klasik geçitleri kendiliğinden listelemez; her yöntemin woocommerce_blocks_payment_method_type_registration kancasında bir AbstractPaymentMethodType sınıfıyla ve JavaScript tarafında registerPaymentMethod ile ayrıca kaydedilmesi gerekir. Kayıt yoksa hata da yoktur; yöntem sadece görünmez. Aynı eklenti kısa kodlu ([woocommerce_checkout]) klasik ödeme sayfasında sorunsuz çalıştığı için sorun gözden kaçar.
WooCommerce → Ayarlar → Ödemeler ekranında yöntem etkin görünür. Ayarlar kaydedilmiştir, hata kaydında bir şey yoktur. Ama ödeme sayfasında yalnızca havale ya da kapıda ödeme listelenir; özel geçidiniz yoktur.
Bu durumla Castor Coffee'nin QNB sanal POS entegrasyonunu incelerken karşılaştık: aynı çok siteli kurulumdaki perakende mağaza kısa kodlu klasik ödeme sayfasını kullanıyordu, kurumsal mağaza ise blok tabanlı olanı. Eklenti kodu doğruydu, hash hesapları bankanın beklediğiyle birebir aynıydı — ama kurumsal sitede yöntem, ayarlar tamamlansa bile hiçbir zaman görünmeyecekti.
İlk soru eklentiyle değil, sayfayla ilgilidir. Ödeme sayfasının içeriğine bakın:
wp post get $(wp option get woocommerce_checkout_page_id) --field=post_content | head -c 200
<!-- wp:woocommerce/checkout --> ile başlıyorsa blok ödeme sayfası[woocommerce_checkout] görüyorsanız klasik ödeme sayfasıÇok siteli kurulumlarda bunu her site için ayrı kontrol edin; siteler farklı zamanlarda kurulduysa farklı türde ödeme sayfaları olabilir.
Klasik ödeme sayfası PHP ile sunucuda çizilir; WooCommerce etkin geçitleri dolaşır, her birinin payment_fields() çıktısını sayfaya basar. Blok ödeme sayfası ise tarayıcıda çalışan bir React uygulamasıdır ve sepet/ödeme verisini Store API'den alır. Hangi yöntemin nasıl görüneceğini bilmesi için JavaScript tarafında kayıtlı bir tanım gerekir.
WooCommerce bu tanımı klasik geçitten türetmez. Sonuç: geçidiniz sunucuda kayıtlıdır, is_available() doğru döner, ama blok ödeme sayfasının haberi yoktur.
Önce blok tarafına geçidi tanıtan bir sınıf yazılır. $name değeri geçidin id'siyle birebir aynı olmalıdır:
use Automattic\WooCommerce\Blocks\Payments\Integrations\AbstractPaymentMethodType;
final class My_Gateway_Blocks extends AbstractPaymentMethodType {
protected $name = 'my_gateway'; // WC_Payment_Gateway::$id ile aynı
public function initialize() {
$this->settings = get_option( 'woocommerce_my_gateway_settings', array() );
}
public function is_active() {
$gateways = WC()->payment_gateways()->payment_gateways();
return isset( $gateways[ $this->name ] ) && $gateways[ $this->name ]->is_available();
}
public function get_payment_method_script_handles() {
wp_register_script( 'my-gateway-blocks', plugins_url( 'assets/blocks.js', __FILE__ ),
array( 'wc-blocks-registry', 'wc-settings', 'wp-element', 'wp-html-entities' ), '1.0', true );
return array( 'my-gateway-blocks' );
}
public function get_payment_method_data() {
return array( 'title' => 'Kredi / Banka Kartı', 'supports' => array( 'products' ) );
}
}
add_action( 'woocommerce_blocks_payment_method_type_registration', function ( $registry ) {
$registry->register( new My_Gateway_Blocks() );
} );
is_active() içinde geçidin kendi is_available() kararını kullanmak önemlidir: kimlik bilgileri eksikken ya da para birimi uymazken yöntem blok ödeme sayfasında da gizli kalır, iki sayfa türü aynı kuralla davranır.
Ayrıca ana eklenti dosyasında blok uyumluluğunu bildirin; aksi hâlde editör eklentiyi uyumsuz olarak işaretleyebilir:
add_action( 'before_woocommerce_init', function () {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'cart_checkout_blocks', __FILE__, true );
} );
get_payment_method_data() ile gönderilen veri, tarayıcıda <name>_data anahtarıyla okunur. Derleme adımı gerektirmeyen en küçük kayıt:
( function () {
var settings = window.wc.wcSettings.getSetting( 'my_gateway_data', {} );
var el = window.wp.element.createElement;
var label = settings.title || 'Kredi / Banka Kartı';
window.wc.wcBlocksRegistry.registerPaymentMethod( {
name: 'my_gateway', // PHP'deki $name ile aynı
label: el( 'span', null, label ),
ariaLabel: label,
content: el( 'p', null, 'Güvenli ödeme sayfasına yönlendirileceksiniz.' ),
edit: el( 'p', null, 'Güvenli ödeme sayfasına yönlendirileceksiniz.' ),
canMakePayment: function () { return true; },
supports: { features: settings.supports || [ 'products' ] }
} );
} )();
Müşteriyi bankanın 3D sayfasına yönlendiren geçitlerde başka bir şey gerekmez: geçidin process_payment() metodu redirect adresi döndürdüğünde blok ödeme sayfası müşteriyi o adrese götürür. Kart bilgisini kendi sayfanızda alan geçitlerde ise ek olarak onPaymentSetup olayıyla ödeme verisini Store API'ye taşımanız gerekir.
Kayıt yapıldığı hâlde yöntem görünmüyorsa, sırasıyla şunlara bakın. Hiçbiri ekranda hata üretmez:
id'si, PHP'deki $name ve JavaScript'teki name üçü birden aynı olmalıwc.wcBlocksRegistry hazır olmadan çalışır ya da hiç çalışmaz — ödeme sayfasını optimizasyondan muaf tutunwc-blocks-registry bağımlılık listesinde yoksa konsolda wc is not defined görülüris_active() yanlış dönüyor: eksik ayar, desteklenmeyen para birimi ya da yanlış kurgulanmış koşulSunucu tarafında kaydın gerçekleştiğini WP-CLI ile görebilirsiniz:
wp eval '
$r = Automattic\WooCommerce\Blocks\Package::container()
->get( Automattic\WooCommerce\Blocks\Payments\PaymentMethodRegistry::class );
do_action( "woocommerce_blocks_payment_method_type_registration", $r );
echo implode( ", ", array_keys( $r->get_all_registered() ) );'
Listede yönteminizin adı yoksa sorun PHP kaydındadır. Varsa ama ödeme sayfasında görünmüyorsa tarayıcıda betiğin yüklenip yüklenmediğine ve konsol hatalarına bakın; son olarak is_active() kararını kontrol edin.
Blok ödeme sayfası, klasik ödeme geçitleri için ayrı bir kapıdır ve o kapıdan ancak kayıtla geçilir. Teşhis tek komutla başlar: ödeme sayfası blok mu, kısa kod mu? Blok ise geçit için bir AbstractPaymentMethodType sınıfı ve bir registerPaymentMethod çağrısı yazın, üç yerdeki ismi aynı tutun ve betiği ertelemeyin. Ödeme almaya hazır görünen ama müşteriye hiç görünmeyen bir yöntem, en pahalı hatalardan biridir — çünkü kimse şikâyet etmez, satış sadece olmaz.
wp:woocommerce/checkout ise blok, [woocommerce_checkout] ise klasikAbstractPaymentMethodType + woocommerce_blocks_payment_method_type_registrationwc.wcBlocksRegistry.registerPaymentMethod()id = PHP $name = JS namewc-blocks-registry, wc-settings, wp-elementdeclare_compatibility( 'cart_checkout_blocks', … )En sık sebep ödeme sayfasının blok tabanlı olmasıdır. WooCommerce 8.3'ten beri yeni mağazalar blok ödeme sayfasıyla gelir ve bu sayfa klasik ödeme geçitlerini kendiliğinden listelemez. Geçidin AbstractPaymentMethodType sınıfıyla ve JavaScript'te registerPaymentMethod ile ayrıca kaydedilmesi gerekir.
Çözer; ödeme sayfasındaki bloğu kısa kodlu klasik sürüme çevirmek yöntemi hemen görünür yapar. Ama bu kalıcı çözüm değildir: WooCommerce yeni özellikleri blok ödeme sayfası üzerinden getiriyor. Eklentiyi blok uyumlu hâle getirmek bir kerelik bir iştir.
Üç yerdeki ismin aynı olduğunu kontrol edin: geçidin id'si, PHP sınıfındaki $name ve JavaScript'teki name. Ardından betiğin bir hız eklentisi tarafından ertelenip ertelenmediğine ve is_active() metodunun true döndüğüne bakın. Bunların hiçbiri ekranda hata üretmez.
Gerekmez. process_payment() metodu redirect adresi döndürdüğünde blok ödeme sayfası müşteriyi o adrese yönlendirir. Ek kod yalnızca kart bilgisini kendi sayfanızda alan geçitlerde gerekir.