web-dev-qa-db-ja.com

Is_adminダッシュボードにショートコードを登録しないのはなぜですか?

私は、 Contact-form-7Nextgen-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のときにプラグインがショートコードを登録することは一般的ですか?もしそうなら、私はそれが時期尚早の最適化であるかもしれないということ以外の文書やそれの理由を見つけることができませんでした。

10
NoBugs

しばらく前に、contact-form-7でも同じ問題が見られました。

ただし、is_adminに基づくショートコードの登録はdoing_it_wronggmazzapの答えを参照

seem一見正当であると思われる2つの理由(およびそれらが間違っている理由):

  1. (可能性は低い)プラグイン作成者は、必要な場合にのみショートコードを登録するためにスクリプトをoptimizeしようとしました。この場合、著者はショートコードがAjaxリクエストで使用される可能性があるとは考えていませんでした。

    間違っているため:この最適化ではパフォーマンスは向上しません。グローバルな「登録済みショートコード」配列に値を追加するだけです。

  2. (これが最も可能性が高いものです)プラグインの作成者は、Ajaxリクエストでのショートコードのサポートを意図的に無効にしました。 Contact-Form-7では、フォームは「Submit via Ajax」に設定できるため、これが該当する可能性があります。ただし、この機能では、Ajaxを介してショートコードが解析され、enqueue_scripts()を介してjavascriptが追加されたときにロードされない追加のJavaScriptファイルをロードするフォームが必要です。

    著者は、「これを使用しないでください:フォームは表示されますが、[送信]ボタンをクリックしても機能しません。時間の無駄です!」などのバグレポートを防ぐために、Ajaxサポートを無効にすることにしました。

    したがって、ユーザーには、動作確認済みのフォームが表示されるか、フォームがまったく表示されません。

    間違っているため、is_adminのチェックはここでは悪い習慣です。条件は、定数DOING_AJAXが定義され、trueであるかどうかを確認する必要があります。

ほとんどのプラグインはこの種の条件を使用しませんが、過去に問題があったために、その制限を持つ可能性のある数個のプラグインがあります。

ショートコードが単にページ上で何らかの出力を行う場合、管理条件を追加する理由はありません。ただし、ショートコードがjsまたはcssファイルもキューに入れる場合は、使用を非管理/非ajax要求に制限するのが理にかなっています。

6
Philipp

実際、管理者にショートコードを登録しない理由はありません。

プラグインの作成者がAjaxフォームからプラグインを無効にしたい場合

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

確認する代わりにadminです。

将来、 Shortcake が「機能プラグイン」であるため、コアに埋め込まれる可能性があることに注意してください。

その場合、管理者で定義されていないショートコードは動作しません。これにより、管理者にショートコードを登録しない理由がないことを確認できます。コア開発者でさえ、管理者で使用可能なショートコードrequireに取り組んでいます。

とはいえ、可能性がなければなりません:

  1. プラグインの作成者に連絡し、その動作を修正できるかどうかを確認します
  2. 自分で解決策を見つけようとする

#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' );
}

これにより、両方の場合にショートコードが追加されます。

これは、他のプラグインコードに応じて単独で動作する場合と動作しない場合がありますが、これに対する一般的な答えはありません。

3
gmazzap