web-dev-qa-db-ja.com

投稿/ページ、ウィジェット、テンプレートファイルのショートコードをチェックする

私のプラグインwww.mapsmarker.comの次のバージョンでは、私はショートコード[mapsmarker ...]が使用されている場合にのみ、プラグインのcssファイルとjsファイルを出力したいと思います。投稿やページのために私はすでにこのワーキングコードを見つけました:

function lmm_detect_shortcode()
{
    global $post;
    $pattern = get_shortcode_regex();
    preg_match_all( '/'. $pattern .'/s', $post->post_content, $matches );

    if( is_array( $matches ) && array_key_exists( 2, $matches ) && in_array( 'mapsmarker', $matches[2] ) )
    {
        echo 'shortcode is used';
    }
}
add_action( 'wp', 'lmm_detect_shortcode' );

問題は、関数do_shortcode()を使用して、マップを直接(ショートコードで)ウィジェットまたはテンプレートファイルに埋め込むこともできることです。(http://www.mapsmarker.com/docs/how-to-add-maps-to-これが真であれば、your-site-using-template-tags /)および上記のコードでは確認されません。その結果、地図は表示されません。

回避策として、ショートコードが投稿またはページに追加されて説明を追加するときにのみjs/cssファイルを追加する必要がある場合はプラグイン設定にオプションを追加します。 do_shortcode()でショートコードするかテンプレートファイルに。

これはあまり使用可能な解決策ではないので(長い目で見ればいくつかのサポート要求をもたらすでしょう)、私はデフォルトでこの機能を有効にでき、設定にオプションを追加する必要がない解決策を探しています。なぜなら、コードはショートコードがウィジェットの中で追加されたのか、テンプレートファイルの中のdo_shortcode()を介して追加されたのかをチェックするからです。

....
if( ( is_array( $matches ) && array_key_exists( 2, $matches ) && in_array( 'mapsmarker', $matches[2] ) ) || ( CHECK IF SHORTCODE USED IN WIDGETS == TRUE ) || ( CHECK IF SHORTCODE USED IN TEMPLATE FILES == TRUE ) )
{
    echo 'shortcode is used';
}
.....

この問題に対する私の最初のアプローチは、グローバル変数をチェックし、どういうわけか私がこの追加されたコードを除外できるかどうかを見ることでした。 by $ wp_filter(array) - フィルター/フックに追加された全ての関数の多次元配列。残念ながら私はまだ解決策を見つけられませんでした。任意の助けは大歓迎です!

2
robertharm

誰かが私を修正するかもしれませんが、バージョン3.3では、投稿のスクリプトとスタイルを「インライン」でキューに登録できると思います。

手段:wp_enqueue_script /スタイルをショートコード関数内に追加できます。WordPressはフッターに追加します...ヘッダーに追加するには遅すぎます。

手段:ショートコードが呼び出されるたびに機能します。

編集:エンキュー機能を追加する場所に関する以下のニックのコメントへの返信:コーデックスのサンプルショートコードを使用して簡単なテストを行いました:

function caption_shortcode( $atts, $content = null ) {
    wp_enqueue_script('myscript','nonexistinglocation');
    wp_enqueue_style('mystyle','throwmeanerror');
    return '<span class="caption">' . $content . '</span>';
}

投稿コンテンツとテキストウィジェット内でテストし、これまでのところ(無効なURLを無視して)機能しました。関数はもちろん戻る前に呼び出す必要があります(そして、はい、正しい方法でスクリプトとスタイルを事前に登録してください[怠y])

4
ungestaltbar