私は、 Contact-form-7 、 Nextgen-gallery のようないくつかのプラグインが、興味深いアンチフォームを持っていることに気づいた。 is_admin()
がtrueのときにショートコードを登録しないという機能。
問題となるのは、もしあなたがajaxから何らかの動的コンテンツ(ショートコードを持っているかもしれません)を生成し、それをするための "正しい" wp方法、admin-ajax.phpを使いたいなら、WP_ADMINが真でないことは不可能です。 admin-ajax.phpの最初の行を見てください。
define( 'DOING_AJAX', true );
if ( ! defined( 'WP_ADMIN' ) ) {
define( 'WP_ADMIN', true );
}
さて、定義された定数を設定解除するためのPHP拡張があるようです(ハッキー)、あるいは文書化されていないWP_Screenシステムと$GLOBALS['current_screen']
を使ってis_admin()
関数がfalseを返すようにする方法がありますか? ?最も有用な回避策は、ページまたはサイトのルートに投稿することです。
is_admin()
がfalseのときにプラグインがショートコードを登録することは一般的ですか?もしそうなら、私はそれが時期尚早の最適化であるかもしれないということ以外の文書やそれの理由を見つけることができませんでした。
しばらく前に、contact-form-7でも同じ問題が見られました。
ただし、is_admin
に基づくショートコードの登録はdoing_it_wrong( gmazzapの答えを参照 )
seem一見正当であると思われる2つの理由(およびそれらが間違っている理由):
(可能性は低い)プラグイン作成者は、必要な場合にのみショートコードを登録するためにスクリプトをoptimizeしようとしました。この場合、著者はショートコードがAjaxリクエストで使用される可能性があるとは考えていませんでした。
間違っているため:この最適化ではパフォーマンスは向上しません。グローバルな「登録済みショートコード」配列に値を追加するだけです。
(これが最も可能性が高いものです)プラグインの作成者は、Ajaxリクエストでのショートコードのサポートを意図的に無効にしました。 Contact-Form-7では、フォームは「Submit via Ajax」に設定できるため、これが該当する可能性があります。ただし、この機能では、Ajaxを介してショートコードが解析され、enqueue_scripts()
を介してjavascriptが追加されたときにロードされない追加のJavaScriptファイルをロードするフォームが必要です。
著者は、「これを使用しないでください:フォームは表示されますが、[送信]ボタンをクリックしても機能しません。時間の無駄です!」などのバグレポートを防ぐために、Ajaxサポートを無効にすることにしました。
したがって、ユーザーには、動作確認済みのフォームが表示されるか、フォームがまったく表示されません。
間違っているため、:is_admin
のチェックはここでは悪い習慣です。条件は、定数DOING_AJAX
が定義され、trueであるかどうかを確認する必要があります。
ほとんどのプラグインはこの種の条件を使用しませんが、過去に問題があったために、その制限を持つ可能性のある数個のプラグインがあります。
ショートコードが単にページ上で何らかの出力を行う場合、管理条件を追加する理由はありません。ただし、ショートコードがjsまたはcssファイルもキューに入れる場合は、使用を非管理/非ajax要求に制限するのが理にかなっています。
実際、管理者にショートコードを登録しない理由はありません。
プラグインの作成者がAjaxフォームからプラグインを無効にしたい場合
if (defined('DOING_AJAX') && DOING_AJAX)
確認する代わりにadminです。
将来、 Shortcake が「機能プラグイン」であるため、コアに埋め込まれる可能性があることに注意してください。
その場合、管理者で定義されていないショートコードは動作しません。これにより、管理者にショートコードを登録しない理由がないことを確認できます。コア開発者でさえ、管理者で使用可能なショートコードrequireに取り組んでいます。
とはいえ、可能性がなければなりません:
#2に関しては、実際にis_admin
をtrueにすることができるライブラリが存在します。それらはハック的であり、私はそれらを本番環境で決して使用しません。
例は パッチワーク です。
これを使用すると、PHPカスタム関数をオーバーライドできます。
MUプラグイン でできること(完全に未テスト):
add_action('muplugins_loaded', function() {
if ( defined('DOING_AJAX') && DOING_AJAX ) {
require 'path/to/Patchwork.php';
Patchwork\replace("is_admin", function() {
return FALSE;
});
}
});
これにより、is_admin()
はajaxリクエストでfalseを返します。
ただし、前述のように、これはかなりハック的であり、他のプラグイン(およびコア)の動作に影響を及ぼし、予測できない影響を及ぼします。
もう1つできることは、管理要求でプラグインショートコードハンドラーを登録することです。
例えば。プラグインコードが次の場合:
if (! is_admin()) {
add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}
その後、youは別のプラグインを記述できます:
if (is_admin()) {
add_shortcode( 'shortcode' , 'plugin_shortcode_handler' );
}
これにより、両方の場合にショートコードが追加されます。
これは、他のプラグインコードに応じて単独で動作する場合と動作しない場合がありますが、これに対する一般的な答えはありません。