WordPress Rest API’sini kullanarak bir WordPress Ayarları sayfası oluşturun
WordPress Rest API için birçok harika kullanımdan biri, tema ayarlarınızın eklentisini veya ekranını artırmaktır. Özel bir yangın uç noktası ekledikten sonra, Ajax aracılığıyla depolanan ayarları alın ve ek sayfalar yüklemeden Ajax – yani kaydedin – daha basit hale gelir. WordPress Rest WordPress yerine admin-ajax yerine sadece daha fazla performans sergilemekle kalmaz, aynı zamanda WordPress’in çekirdeğinin sanitasyon ve doğrulama açısından ağır işin çoğunu yapmasına izin verir. Bu makalede, bir Ayarlar Form sayfası oluşturmak ve bir WordPress API dinlenme kullanarak formu işlemek için her adımı tartışacağız.
Ayar sayfanızı ekleyin Ayarlar sayfasını tasarlamaya başlamadan önce, ayarlar formunu koyabileceğiniz WordPress kontrol paneline menü veya alt menü öğeleri eklememiz gerekir. Bu sayfada, CSS ve JavaScript dosyalarını yüklemeniz gerekir. İşte bunun için yeni başlayan bir sınıf: assets_url = $ assets_url;
Add_action (‘admin_menu’, dizi ($ this, ‘add_page’));
Add_action (‘admin_enqueue_scripts’, dizi ($ this, ‘register_asses’));
}
/**
* CF Popup alt menüsü sayfasını ekleyin
*
* @sejak 0.0.3
*
* @kullanıcı “admin_menu”
*/
Genel işlev add_page () {
Add_menu_halam (
__ (‘üst sayfa’, ‘metin alanı’),
__ (‘üst sayfa’, ‘metin alanı’), ‘manage_opsi’,
$ this-> salyangoz,
dizi (bu $, ‘render_admin’)));
}
/**
* Sayfa için CSS ve JS’yi kaydedin
*
* @”Admin_enqueue_scripts” eylemini kullanma
*/
genel işlev Register_asses ()
{
wp_register_script ($ this-> slug, $ this-> assets_url. ‘/js/admin.js’, dizi (‘jQuery’));
wp_register_style ($ this-> slug, $ this-> assets_url. ‘/css/admin.css’);
WP_LOCALICAL_SCRINK ($ this-> slug, ‘apeks’, dizi (
‘String’ => dizi (
‘depolandı’ => __ (‘depolanmış ayarlar’, ‘metin alanı’),,
‘Hata’ => __ (‘hata’, ‘metin alanı’)
),
‘API’ => dizi (
‘Url’ => esc_url_raw (rest_url (‘apex-api/v1/ayarlar’),,
‘Nonce’ => wp_create_nonce (‘wp_rest’)
)
));
}
/**
* Sayfa için CSS ve JS’yi enqueue
*/
Genel işlev enqueue_asses () {
if (! wp_script_is ($ this-> slug, ‘kayıtlı’)) {
$ this-> register_asses ();
}
wp_enqueue_script ($ this-> slug);
wp_enqueue_style ($ this-> slug);
}
/**
* Eklenti Yönetici sayfası oluşturma
*/
Genel işlev render_admin () {
$ this-> enqueue_asses ();
Echo ‘Formunuzu buraya koy!’;
}
} Bu sınıfta, üst düzey bir menü oluşturmak için add_menu_page kullanıyorum, ancak ihtiyaçlarınıza bağlı olarak add_sub_menu ile değiştirmek isteyebilirsiniz. Dikkat edilmesi gereken iki önemli şey daha var.
Birincisi, wp_localale_script () nasıl kullandığımızdır. Bu işlev, PHP kullanarak Global Scope’da bir JavaScript değişkeni oluşturmanın bir yolunu sunar, ilk argümanda belirtilen komut dosyası her yüklendiğinde. Bu başlangıçta tarayıcıya – yerelleştirilmiş – çevrilmiş bir dize sağlamak için tasarlanmıştır. Bu, kullanma şeklimizin bir parçasıdır – tercüme edilebilecek başarılı mesajlar ve hatalar vermek için. Ancak, mevcut site için URL’ler gibi dinamik değerlere devam etmek için de kullanılabilir, bu durumda API dinlenme ve nonce’nin bitiş noktası. Tüm bunlara JavaScript’imizde ihtiyacımız olacak, ancak her site için farklı olacak, bu yüzden hızlı bir şekilde yapmak için PHP kullanmalıyız. Ayrıca, komut dosyası için kök URL’nin sınıfa bağımlılık olarak aktarıldığını unutmayın. Bunu yapmayı seviyorum çünkü URL’nin bir eklenti veya temada başka bir yerde kullanılması muhtemel ve tüm eklenti için değiştirilecek veya filtreleyecek bir yer istiyorum. Bir sınıf örneği yaptığımızda URL’yi belirlememiz gerekir. Bunu yapmak için iyi bir yer kök eklenti dosyasında, bu nedenle eklenti_dir_url () doğru URL’yi üretecektir. Bunu ayarlayacak ana eklenti dosyasına bakalım: enqueue_asses ();
?>
<? Php
} Her alanın bir kimliği olduğundan emin olurum. Bu, değeri elde etmek için her birini jQuery.val () ile hedeflememe izin verecek. HTML semantiğimizi korumak da önemlidir, çünkü alan etiketinin alan kimlikleriyle ilgili olanlar için öznitelikleri olmalıdır. Ayrıca bir kimlik formu verdim ve "geri bildirim" kimliği ile boş bir öğe ekledim, böylece saklanan mesajı veya hatayı dinamik olarak yerleştirebilmemiz.
Bir kez daha, formunuz çok daha karmaşık olabilir, ancak basit olandan başlayalım. Ajax aracılığıyla sunucuya veri göndermek için herhangi bir JavaScript yazmadan önce rota dinlenme API ekleyin, bunun için bir restoran rotasına ihtiyacımız var. Bu konuda çok şey yazdım, ancak Get ve Post'un bitiş noktası ile çok basit özel rotaları tartışmak güzel. İş mantığını ayırma API REST rotası için sınıfın, talep için gereken iş mantığı değil, yalnızca taşıma talebi ile ilgili olması gerektiğine inanıyorum. Bu durumda, demek istediğim "iş mantığı" ile gerçek ayarları okumak ve yazmaktır. Önce, bunu işleyebilecek bir sınıf oluşturalım. Bu sınıf, bazı temel doğrulamalarla get_option () ve update_option () etrafında basit bir sarma olacak. Bu sınıf, depolanan bir değer elde eden ve daha sonra var olmayı beklediğimiz depolanan diziden kayıp dizini doldurmak için wp_parse_args () kullanan get_settings () yöntemine sahiptir. Ayrıca, depolanacak son dizide depolanan dizinin beyaz listesine yalnızca anahtarın dahil edilmesini sağlayan Save_Settings () yöntemine sahiptir. ‘ahşap’,
‘Sayı’ => 42
);
/**
* Kaydedilen ayarları alın
*
* @return dizisi
*/
Statik işlev public get_settings () {
$ saRed = get_option (self :: $ option_key, array ());
if (! Is_Array ($ Saved) ||! Boş ($ Saved)) {Kendinizi döndür :: $ varsayılan;
}
return wp_parse_args ($ saRed, self :: $ varsayılan);
}
/**
* Ayarları kaydedin
*
* Dizi anahtarı Beyaz Listeye dahil edilmelidir (yani bir kendi kendine kilit :: $ varsayılan olmalıdır
*
* @param dizisi $ ayarlar
*/
Statik genel işlev Save_settings (Array $ ayarları) {
// Depolamadan önce izin verilmeyen tüm dizinleri kaldırın
foreach ($ i => $ ayar olarak $ ayarlar) {
if (! array_key_exists ($ setting, self :: $ varsayılan) {
ayarlanmamış ($ ayarlar [$ i]);
}
}
Update_option (self :: $ option_key, $ ayarlar);
}
} Rota REST API Şimdi herhangi bir şekilde üstesinden gelebileceğimiz ayarları okumak ve yazmanın bir yolu var, bunun için dinlendirici bir arayüz görevi gören rota dinlenme API’sını yapalım. Bu rota Get ve Post’un son noktasına sahip olacak.
Hiç özel bir yangın son noktası yapmadıysanız, belgeleri okumanızı öneririm. Ayrıca, konuyla ilgili tork ve WordPress TV görüşmeleri de dahil olmak üzere küratörlü bağlantılar listem var. İşte rota sınıfı sınıfı: <? PHP
apex_api class {
/**
* Rotayı ekleyin
*/
Genel işlev add_routes () {
Register_rest_route (‘apex-api/v1’, ‘/ayarlar’,
Dernek (
‘Yöntem’ => ‘yazı’,
‘geri arama’ => dizi ($ this, ‘update_settings’),
‘Args’ => dizi (
‘endüstri’ => dizi (
‘type’ => ‘String’,
‘Zorunlu’ => Yanlış,
‘sendize_callback’ => ‘sendize_text_field’
),
‘Numara’ => dizi (
‘tip’ => ‘tamsayılar’,
‘Zorunlu’ => Yanlış,
‘sendize_callback’ => ‘ab ”
)
),
‘PermsionsS_Callback’ => Array ($ this, ‘İzinler’)
);
Register_rest_route (‘apex-api/v1’, ‘/ayarlar’,
Dernek (
‘Yöntem’ => ‘al’,
‘geri arama’ => dizi ($ this, ‘get_settings’),
‘Args’ => dizi (
),
‘PermsionsS_Callback’ => Array ($ this, ‘İzinler’)
)
);
}
/**
* Talep iznini kontrol edin
*
* @return bool
*/
Kamu İşlevi izni () {
Return current_user_can (‘manage_options’);
}
/**
* Ayarları güncelleyin
*
* @param wp_rest_request $ istek
*/
public işlevleri update_settings (wp_rest_request $ istek) {
$ ayar = dizi (
‘endüstri’ => $ istek-> get_param (‘endüstri’),
‘miktar’ => $ istek-> get_param (‘numara’)
);
Apex_settings :: save_settings ($ ayarlar);
geri rest_ensure_response (apex_settings :: get_settings ())-> set_status (201);
}
/**
* Yangınla ayarlar alın
*
* @param wp_rest_request $ istek
*/
Genel işlev get_settings (wp_rest_request $ istek) {
geri rest_ensure_response (apex_settings :: get_settings ());
}
} Bakın, geri arama işlevi oldukça basittir, çünkü yalnızca son bölümde yaptığım ayar sınıfını sardı. Tasarımda, düzenleyici sınıfın izin veya sanitasyon kontrolü olmadığını anlamak önemlidir. Ancak izinlerin ve sanitasyonun denetimi çok önemlidir.
Bu dinlenme ateşinin bitiş noktası bunu sağlar. Post yöntemi, her alan için ‘snetitize_callback’ argümanını belirler. Bu şekilde, verilerin devam etmeden önce güvenli olduğuna inanabilirim. Ayrıca, iki yol “Permisionsi_callback” kullanır, bu da onu yalnızca “Manage_options” yeteneğine sahip olanlar aracılığıyla erişilebilir. Bu adımlardan birini atlamak tehlikeli olacaktır. Şimdi bu sınıf örneğini, “REST_API_INIT” eyleminde yapmamız gerekiyor, böylece bitiş noktası var. Bu, bunu yapmak için değiştirilen ana eklenti dosyasıdır: <? PHP/**
* Eklenti Adı: Apex eklentisi
*/
Add_action ('init', function () {
$ assets_url = eklenti_dir_url (__file__);
// Ayarlar menüsü
İf (is_admin ()) {
yeni apex_menu ($ assets_url);
}
// Ateş dinlenmesi hazırlayın
}); API'yi kullanarak, son noktaya geldikten sonra ayar sayfanızda dinlenin, ayar sayfamızda kullanalım. İki Ajax çağrısı yazacağız. Birincisi, depolanan ayarları alacak ve formu ayarlarla güncelleyecektir. Bu, sayfa yüklemesi ile tetiklenecektir. İkincisi, Form Kaydet düğmesi tarafından tetiklenecek ve ayarları güncellemek için kullanılacaktır.
Daha önce bu öğreticide, WordPress'e bu yönetici sayfasına JavaScript dosyalarını yüklemesini söyledik. Şimdi dosyayı kullanmanın zamanı geldi. Bu ilk Ajax çağrısının görünümüdür. Görev, depolanan ayarları almak ve formu onunla güncellemektir: jQuery (işlev ($) {
$ .Ajax ({
Yöntem: 'Al',
URL: apex.api.url
Göndermeden önce: işlev (xhr) {
xhr.setRequestHeader ('x-wp-nonce', apex.api.nonce);
}
}). Sonra (işlev (r) {
İf (r.hasownpperter ('endüstri'))) {$ ('#düstriyel'). Val (R. Endüstri);
}
if (r.hasownpperter ('sayı')))) {
$ ('#Number'). Val (R. sayı);
}
})
}); Burada iki önemli şeye dikkat edin. İlk olarak, jQuery URL'sine ne sorulacağını söylemek için daha önce wp_localize_script () ile düzenlenmiş Global Apex nesnesini kullanıyorum. Ayrıca, başlığı nesnede yer alan nonce ile eklemek için BeForesend () yöntemini kullanıyorum. Onsuz, API talep etme sürecinde kullanıcıların girilmeyeceği düşünülmeyecek ve bu nedenle izin denetimimiz başarısız olacaktır.
API isteği tamamlandıktan sonra, jquery.val () kullanılarak saha alanına ayarlar eklenir. Güvenlik uğruna, nesneleri kullanmaya yanıt verdiklerinden emin oldum. Bu önemli bir doğrulamadır, ancak iyi bir ölçek değildir, çünkü düzenleme miktarı artar – bu tür şeyler için Vuej'leri kullanmamın birçok nedeninden biri. Şimdi sayfayı yüklediğinizde, kaydedilen ayarları, belki de şu anda varsayılan değeri almalı ve formu güncellemelidir. Bu iyi, ama tüm bunların gerçek çekirdeği ayarları güncelleyebilmek. Bu nedenle, form gönderildiğinde bir sonrası isteği çalıştıracak ikinci Ajax çağrımıza ihtiyacımız olacak. Bu, Save Ajax: JQuery (Function ($) {
$ .Ajax ({
Yöntem: 'Al',
URL: apex.api.url,
Göndermeden önce: işlev (xhr) {
xhr.setRequestHeader ('x-wp-nonce', apex.api.nonce);
}
}). Sonra (işlev (r) {
İf (r.hasownpperter ('endüstri')))) {
$ ('#Industri'). Val (R. Endüstri);
}
İf (r.hasownpperter ('miktar')))) {$ ('#number'). Val (R. sayı);
}
});
$ ('#apex-form') .on ('gönder', işlev (e) {
E.preventDefault ();
var data = {
Miktar: $ ('#Number'). Val (),,
Endüstri: $ ('#Industry'). Val ()
};
$ .Ajax ({
Yöntem: 'Post',
URL: apex.api.url,
Göndermeden önce: işlev (xhr) {
xhr.setRequestHeader ('x-wp-nonce', apex.api.nonce);
},
Veri: Veri
}). Sonra (işlev (r) {
$ ('#feedback') .html ('
' + apex.strings.saved + '
');
}). Hata (işlev (r) {
var Mesaj = apex.strings.error;
if (r.hasownpperter ('mesaj')) {
Mesaj = r.
}
$ ('#feedback') .html ('
' + mesaj + '
');
})
})
}); Bu ikinci çağrı, bir yazı kullanmadığı ve form teslimatına bağlı kapanışta sarılmadığı sürece çok benzerdir. Bu şekilde, bu form gönderildiğinde çalışır ve olaydan gelen varsayılan işlemin önlenmesini önleyebiliriz. Burada görmeniz gereken bir başarı ve hata yöntemidir. #Feedback öğesine apex.string nesnesinde yerelleştirilen metin olarak mesaj eklemek için kullanılırlar. "Hata" mesajı