Mengapa tidak mendaftarkan kode pendek jika dashboard is_admin?

10

Saya perhatikan bahwa beberapa plugin seperti Contact-form-7 , Nextgen-gallery , mungkin yang lain, memiliki fitur anti-menarik yang tidak mendaftarkan kode pendek mereka ketika is_admin()itu benar.

Masalahnya adalah, jika Anda ingin menghasilkan beberapa konten dinamis (yang mungkin memiliki kode pendek) dari ajax, dan menggunakan cara wp "benar" untuk melakukannya, admin-ajax.php, tidak mungkin WP_ADMIN tidak benar. Lihat baris pertama admin-ajax.php:

define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
    define( 'WP_ADMIN', true );
}

Sekarang, tampaknya ada ekstensi PHP yang akan membiarkan Anda menghapus konstanta yang ditetapkan (hacky), atau mungkin ada cara untuk mengacaukan dengan sistem WP_Screen tidak berdokumen dan $GLOBALS['current_screen']untuk membuat is_admin()fungsi kembali palsu ?? Solusi yang paling dapat digunakan tampaknya adalah memposting ke halaman atau root situs.

Apakah umum bagi plugin untuk mendaftarkan kode pendeknya ketika is_admin()itu salah? Jika demikian, saya tidak dapat menemukan dokumentasi atau alasan untuk itu selain itu mungkin merupakan optimasi prematur.

NoBugs
sumber

Jawaban:

6

Saya telah mengamati masalah yang sama dengan contact-form-7 beberapa waktu lalu.

Tetapi perhatikan bahwa mendaftar shortcode berdasarkan is_adminsedang melakukan_it_wrong ( lihat jawaban gmazzap )

Ada dua alasan yang tampaknya sah pada pandangan pertama (dan mengapa mereka salah):

  1. (Tidak mungkin) Pembuat plugin mencoba mengoptimalkan skrip untuk hanya mendaftarkan kode pendek ketika diperlukan. Dalam hal ini penulis tidak menganggap bahwa shortcode mungkin digunakan dalam permintaan Ajax.

    Salah karena : Optimasi ini tidak memberikan keuntungan kinerja apa pun. Ini hanya menambah nilai ke array global "kode pendek terdaftar".

  2. (Ini kemungkinan besar). Pembuat plugin sengaja menonaktifkan dukungan untuk shortcode dalam permintaan Ajax. Dengan Contact-Form-7 ini mungkin terjadi karena formulir dapat diatur ke "Kirim via Ajax". Namun, fitur ini memerlukan formulir untuk memuat file javascript tambahan yang tidak dimuat ketika shortcode diurai melalui Ajax dan javascript ditambahkan via enqueue_scripts().

    Penulis memutuskan untuk menonaktifkan dukungan Ajax untuk mencegah laporan bug seperti "Jangan gunakan ini: Formulir ditampilkan tetapi mengklik tombol Kirim tidak berfungsi. Buang-buang waktu saja!"

    Jadi pengguna akan melihat formulir yang dijamin-bekerja atau tidak sama sekali.

    Salah karena : Memeriksa is_adminadalah praktik buruk di sini. Keadaan harus memeriksa apakah konstanta DOING_AJAXdidefinisikan dan benar.

Meskipun sebagian besar plugin tidak menggunakan kondisi seperti ini, beberapa yang memiliki batasan itu mungkin memilikinya karena masalah di masa lalu.

Ketika kode pendek hanya melakukan beberapa output pada halaman, tidak ada alasan untuk menambahkan kondisi admin. Namun, ketika shortcode juga memberikan file js atau css maka masuk akal untuk membatasi penggunaan untuk permintaan non-admin / non-ajax.

Philipp
sumber
2
Tidak mendaftar kode pendek memiliki dampak hampir nol dalam kinerja. Mendaftar hanya menambahkan variabel ke array. Apa yang mungkin lambat adalah melakukan kode pendek, bukan untuk mendaftarkannya. Jadi jika itu adalah kinerja optimis, itu gagal. Jika pembuat plugin ingin menonaktifkan shortcode untuk ajax, memeriksa is_adminapakah doing_it_wrong ada cara yang jauh lebih baik di WP untuk memeriksa permintaan ajax. Akhirnya, jika plugin enqueues js / css, jika itu melakukannya dengan baik (menggunakan 'wp_enqueue_scripts'tindakan) itu tidak akan mempengaruhi halaman admin karena kait itu tidak dipecat di halaman admin.
gmazzap
@ gmazzap Terima kasih atas umpan baliknya, saya sangat setuju! Saya telah memperbarui jawaban saya dan menambahkan masukan Anda untuk membuatnya lebih jelas bahwa kondisinya adalah praktik yang buruk.
Philipp
Saya tidak berpikir # 2 mungkin, karena enqueue_scripts seharusnya tidak mempengaruhi the_contentpanggilan dan panggilan admin-ajax.
NoBugs
3

Sebenarnya, tidak ada alasan untuk tidak mendaftarkan kode pendek di admin.

Jika pembuat plugin ingin menonaktifkan bentuk plugin Ajax, mereka harus melakukannya

if (defined('DOING_AJAX') && DOING_AJAX)

bukannya memeriksa adalah admin.

Perhatikan bahwa di masa mendatang, ada kemungkinan Shortcake akan tertanam di dalam inti karena itu adalah "Plugin Fitur".

Jika itu akan terjadi, shortcode tidak didefinisikan di admin tidak akan bekerja dengannya. Ini memberi Anda konfirmasi lain bahwa tidak ada alasan untuk tidak mendaftarkan kode pendek di admin: bahkan pengembang inti mengerjakan hal-hal yang memerlukan kode pendek yang tersedia di admin.

Yang mengatakan, Anda harus kemungkinan:

  1. hubungi plugin plugins dan lihat apakah mereka dapat memperbaiki perilaku itu
  2. coba cari solusinya sendiri

Mengenai # 2, sebenarnya ada perpustakaan yang dapat memaksa is_adminuntuk menjadi kenyataan. Oleh mereka peretasan, dan saya tidak akan pernah menggunakannya dalam produksi.

Contohnya adalah Patchwork .

Menggunakannya, Anda dapat mengganti fungsi kustom PHP.

Dalam plugin MU Anda dapat melakukan (sepenuhnya tidak TERLARANG):

add_action('muplugins_loaded', function() {
  if ( defined('DOING_AJAX') && DOING_AJAX ) {
     require 'path/to/Patchwork.php';
     Patchwork\replace("is_admin", function() {
        return FALSE;
     });
  }
});

Ini akan membuat is_admin()return false pada permintaan ajax.

Namun, seperti yang dikatakan, ini cukup meretas, dan akan memengaruhi perilaku plugin (dan inti) lainnya dengan efek yang tidak dapat diprediksi.

Hal lain yang dapat Anda lakukan adalah mendaftar handler plugin kode pendek pada permintaan admin.

Misal jika kode plugin adalah:

if (! is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

maka Anda dapat menulis plugin lain yang berfungsi:

if (is_admin()) {
  add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}

Dengan cara ini, kode pendek akan ditambahkan dalam kedua kasus.

Ini mungkin atau mungkin tidak bekerja sendiri tergantung pada kode plugin lain, tetapi tidak ada jawaban umum untuk ini.

gmazzap
sumber
Anda juga bisa add_shortcode('shortcode', array('their-class', 'their-function') )atau serupa.
NoBugs
@nobugs tentu saja :)
gmazzap
Atau "solusi" yang lebih baik, cukup posting ke root situs atau ke halaman, yang ironisnya adalah apa yang NextGen lakukan.
NoBugs