Özel eklenti sayfası işlemlerini en iyi nasıl işlerim?


21

Sürekli aynı sıkıntıyla karşılaşıyorum, bu yüzden orada herhangi bir fikir veya deneyim olup olmadığını göreceğimi düşündüm ...

Kendi yönetici sayfasını kullanan bir eklenti oluşturdum. Yapmalı. Şimdi WP_List_Table () öğelerini sıraladım, harika olduğunu söylemeliyim ... ama ....

Özel eklenti sayfaları her zaman admin.php?page=...onları doğrudan eklenti dizininden yüklemek istemediğim sürece yükler. Şimdi o sayfadan bir 'eylem' yaparsam, bir şekilde bunu işlemeli ve daha sonra action parametresi olmadan tekrar sayfaya yönlendirmem gerekiyor . Gerçekten bir GET veya POST yapmamın önemi yok.

İç sayfalarında WP bunu aynı sayfada yapıyor, bir eylem olup olmadığını kontrol ediyor, eğer öyleyse işlem yapıyor ve işlem yapmadan kendisine yönlendiriyor. Bu mümkün, çünkü bu sayfalara admin-headerhenüz yüklenmedi.

Ancak, kendi sayfanızda yapmayı denerseniz, yönetici arayüzünün yarısı zaten tarayıcıya gönderildi, bu nedenle bir yönlendirme artık mümkün değil. Açıkçası, çözüm doğrudan POST / GET'in başka bir sayfaya gitmesi, WP çerçevesini bunun üzerine yüklemesi, işlem yapması ve sonra tekrar orijinal sayfaya yönlendirmesi ... ama ... bu biraz can sıkıcı, çünkü ... orjinalim Sayfa bir geri çağırma aracılığıyla yüklenir, bu yüzden sınıfımın bir yöntemi içinde çalışır. Bu çok güzel.

Ayrı bir sayfa yüklersem, el ile eklemem wp-load.phpve sınıfımın dışına çıkmam gerekir; bu can sıkıcıdır ve benim özel durumumda özellikle hatalar vardır, çünkü yalnızca eklenti sınıfımı anonim olarak adlandıracağım, böylece kimse erişemez dışarıdan.

Yani bu uzun bir hikaye sonra ... herkes bir geri yoluyla başka bir sayfa yüklemek için iyi bir çözüm ile geldi olmadan zaten etrafında kurulum bütün yönetici arayüzüne sahip?

(Bir geçici çözüm biliyorum ... load-....eylem parametresini denetleyen ve işleme koyan ve yönlendiren bir işlevi bağlayabilirim. Ama daha iyi bir yol olup olmadığını merak ediyorum.)

Teşekkürler.


Bu neden etiketlendi [plugin-wp-pagenavi]? [plugin-development]kesinlikle burada açığız.
Jan Fabry

@Jan Fabry: Ne plugin-wp-pagenaviiçin olduğundan emin değilim ... bunun eklentiler ve yönetici menüsü arasındaki korelasyon ile ilgili şeyler için olduğunu sanıyordum . Sorum bununla ilgili olduğundan, bu etiketi seçtim.
wyrfel

WP-PageNavi , ön uç için daha gelişmiş bir çağrı gezinme özelliğine sahip bir eklentidir. [admin-menu]Burada kullanabilirsiniz , ama bununla gerçekten ilgili olduğunu sanmıyorum. Etiketleri, benim için uygun olduğunu düşündüğüm şekilde değiştirdim, elbette tekrar düzenleyebilirsiniz.
Jan Fabry

@Jan Fabry: Yeniden etiketleme için teşekkürler ... tüm etiket havuzuna aşina değil, henüz (açıkça belli).
wyrfel

Yanıtlar:


28

Genel bir kural olarak, çoğu eylem için yanlışlıkla çalıştırılmadıklarından emin olmak için bir POST isteği kullanmalısınız . Ancak, kullanıcı sayfayı yenilediğinde yinelenen yürütmeyi önlemek için POST isteğinden sonra normal bir sayfaya yönlendirmek de iyi bir uygulamadır.

Yani akış şöyle:

  1. Eklenti sayfanıza gönderilen bir POST formu ile
  2. Yönlendiren isteği işleyen bir sayfa
  3. İşlemin sonucunu gösteren eklenti sayfanız

Orta sayfa, eklenti sayfanız olmak zorunda değildir. Bu araçlar kendinizin kullanabileceği "jenerik POST işleyicisi" üç yıl önce dahil, kancayı .'admin_action_' . $_REQUEST['action']admin.php

Örnek bir kullanıcı Akismet eklentisidir . Güvenilir bir şekilde kullanmak istiyorsanız, içerdiği başka bir sayfaya değil, doğrudan göndermeniz gerekiradmin.phpadmin.php .

İşte nasıl kullanılacağına dair çok temel bir örnek:

add_action( 'admin_action_wpse10500', 'wpse10500_admin_action' );
function wpse10500_admin_action()
{
    // Do your stuff here

    wp_redirect( $_SERVER['HTTP_REFERER'] );
    exit();
}

add_action( 'admin_menu', 'wpse10500_admin_menu' );
function wpse10500_admin_menu()
{
    add_management_page( 'WPSE 10500 Test page', 'WPSE 10500 Test page', 'administrator', 'wpse10500', 'wpse10500_do_page' );
}

function wpse10500_do_page()
{
?>
<form method="POST" action="<?php echo admin_url( 'admin.php' ); ?>">
    <input type="hidden" name="action" value="wpse10500" />
    <input type="submit" value="Do it!" />
</form>
<?php
}

Hei, koda tekrar bakacağım, açıkça görmedim, ama sadece onaylamak için ... demek istediğin, eğer admin.php'yi doğrudan bir sayfa parametresi olmadan çağırırsam, tüm sayfayı atlar. yükleme ve sadece bazı başlatma ve kanca çalışır? Bu harika olurdu ... ish (sayfa yüklenmeden önce neden kancayı takmadıklarını hala anlamadım).
wyrfel

@wyrfel: Evet, admin.phpdoğrudan aramak , Akismet kaynağının bana öğrettiği "hile" dir. Bir formu görüntülerken haklısınız ve hata durumunda tekrar görüntülemek istiyorsanız: hedef, eklenti sayfanızsa, ancak başlangıçta bir yere çengelseniz kolay olur (başarılı olursanız yeniden yönlendirebilir veya değilse hata mesajlarıyla tekrar doldurun). Belki bir Trac biletinde önerebilirsin?
Jan Fabry

Bir bilet vereceğim. Çözüm olarak, 'load-<pagehook>'çalışacak kancası buldum ... sayfa yüklenmeden önce çağrıldı ... ancak admin_action_...konsept çok daha güzel ve daha spesifik görünüyor. Ayrıca, bir notta, POST'ları yaparsanız ve yeniden yükleme sırasında yeniden göndermek istemiyorsanız hata mesajları yine de sorunludur, ancak bu farklı bir konudur.
wyrfel

@wyrfel: Neden hata mesajları hala sorunlu olsun? Bir hata mesajı varsa, sayfada kalın ve formu iletilerle tekrar görüntüleyin (elbette bir yenileme burada pek bir anlam ifade etmeyecektir - ancak aynı zamanda zarar vermez, çünkü hatalar hala orada olacaktır ve hiçbir işlem yapılmayacaktır. idam edilecek). Hata yoksa, işlemi yürütün ve "güvenli" bir genel bakış sayfasına yönlendirin. Bu işe yarar - admin_action_kanca, eklenti sayfa yükleyiciden önce hareket ettirilirse.
Jan Fabry

Tamam ... çok karmaşık düşünüyordum.
wyrfel

3

Bunu, kullanıcının gönderdiği sayfadaki işlem URL'sine doğru noheader = true ekleyerek biraz daha farklı bir şekilde yaklaştım.

İşleyicim daha sonra eylemi gerçekleştirir (yani, genellikle bir ekleme, güncelleme veya silme), ardından bir sonraki sayfa işlemine bir wp_redirect () ile tamamlanır (örneğin, sayfa ekle -> sayfayı düzenle, sayfayı sil -> liste sayfasını, sayfayı düzenle -> sayfayı düzenle ). Ayrıca URL’de bir mesaj iletiyorum, böylece güncelleme gibi bir durumu başarılı bir şekilde görüntüleyebildim veya başaramadım.

Bu yaklaşım tüm eylemleri tutar: aynı sınıfta ve aynı yönetici eklentisiyle listeleme, ekleme, düzenleme, silme, toplu silme, vb. Böylece bakımı ve anlaşılması kolaydır.


Dostum sen bir dahisin! İki gündür mücadele ediyorum ve ihtiyacım olan tek şey "noheader = true" kısmıydı. Teşekkürler!
r00m

0

Başka bir farklı yaklaşım, forma yalnızca gizli bir giriş alanı eklemek:

<input type="hidden" name="page" value="your-page-slug" />

Bu şekilde, WordPress yönlendirmeyi otomatik olarak ele alıyor gibi görünüyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.