is_adminダッシュボードの場合、ショートコードを登録しないのはなぜですか?


10

Contact-form-7Nextgen-galleryなどのプラグインにis_admin()は、trueのときにショートコードを登録しないという興味深いアンチ機能があることに気づきました。

問題となるのは、ajaxから動的コンテンツ(ショートコードが含まれている可能性がある)を生成し、「正しい」wpの方法であるadmin-ajax.phpを使用したい場合、WP_ADMINをtrueにすることは不可能です。admin-ajax.phpの最初の行を参照してください:

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

さて、それはあなたが定義された定数(ハック)未設定できますPHPの拡張がある、またはそこに文書化されていないWP_Screenシステムを台無しに方法かもしれないと思わ$GLOBALS['current_screen']せるためにis_admin()、関数の戻り偽の?? 最も有効な回避策は、ページまたはサイトルートに投稿することです。

is_admin()がfalseの場合、プラグインがショートコードを登録することは一般的ですか?もしそうなら、私はそれが時期尚早の最適化であるかもしれないということ以外に、それに関する文書や理由を見つけることができませんでした。

回答:


6

しばらく前にcontact-form-7で同じ問題が発生しました。

しかし、に基づいてショートコードを登録することis_admindoing_it_wrongですgmazzapの答えを参照してください

一見して正当であると思われる 2つの理由があります(それらがなぜ間違っているのか)。

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

    理由:この最適化ではパフォーマンスは向上しません。それは単に値をグローバルな「登録されたショートコード」配列に追加します。

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

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

    したがって、ユーザーには動作が保証されたフォームが表示されるか、まったく表示されません。

    理由:確認is_adminはここでは悪い習慣です。条件DOING_AJAXは、定数が定義され、真であるかどうかをチェックする必要があります。

ほとんどのプラグインはこの種の条件を使用しませんが、その制限を持ついくつかのプラグインは、過去の問題のためにおそらくそれを持っています。

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


2
ショートコードを登録しないと、パフォーマンスにほとんど影響がありません。登録は、配列に変数を追加するだけです。何である可能性が遅いことは、それを登録していない、ショートを実行することです。したがって、それがパフォーマンス最適化である場合、それは失敗したものです。プラグインの作成者がajaxのショートコードを無効にしたい場合、チェックis_admindoing_it_wrong WPでajaxリクエストをチェックするはるかに良い方法があります。最後に、プラグインがjs / cssをキューに入れ、それが('wp_enqueue_scripts'アクションを使用して)キューに入れられた場合、そのフックは管理ページで起動されないため、管理ページには影響しません。
gmazzap

@gmazzapフィードバックをありがとう、私は完全に同意します!私は私の答えを更新し、あなたの入力を追加して、状態が悪い習慣であることをより明確にしました。
フィリップ

enqueue_scriptsがthe_content呼び出しとadmin-ajax呼び出しに影響を与えることはないので、2番目の可能性は低いと思います。
NoBugs

3

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

プラグインの作成者がプラグインフォームAjaxを無効にする場合は、行う必要があります

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

チェックする代わりに管理者です。

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

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

そうは言っても、あなたは可能性を秘めています:

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

#2に関しては、is_admin真実を強制できるライブラリが実際に存在します。彼らはハックであり、私はそれらを本番環境で使用することは決してありません。

例はパッチワークです。

これを使用すると、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 が返されます。

ただし、前述のとおり、これはかなりハックであり、他のプラグイン(およびコア)の動作に影響を及ぼし、予測できない影響を及ぼします。

あなたができる別のことは、管理リクエストでプラグインショートコードハンドラーを登録することです。

たとえば、プラグインコードが次の場合:

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

次に、別のプラグインを作成できます

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

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

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


また、add_shortcode('shortcode', array('their-class', 'their-function') )または類似することができます。
NoBugs

@nobugsもちろんです:)
gmazzap

または、より良い「回避策」として、サイトのルートまたはページに投稿するだけです。これは、皮肉にもNextGenが行うことです。
NoBugs
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.