web-dev-qa-db-ja.com

ショートコードがページで呼び出されているかどうかを検出する方法

いくつかの変数をGoogleアナリティクスにプッシュしようとしていますが、ショートコードがページに含まれているかどうかを検出できるようにしたいと考えています。

誰もがこれについてうまくいく方法を知っていますか?

ありがとうございました!

ノエル

1
Noel Tock

私は時々同じことを不思議に思っていました - wpが保存時にチェックしてレジスタなどを保存しているかどうか

コードをちょっと見てみましたが、そうではないようです。

しかしグローバルな$shortcode_tagsがあり、wpはこの機能を持っています

function get_shortcode_regex() {
    global $shortcode_tags;
    $tagnames = array_keys($shortcode_tags);
    $tagregexp = join( '|', array_map('preg_quote', $tagnames) );

    // WARNING! Do not change this regex without changing do_shortcode_tag() and strip_shortcodes()
    return '(.?)\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)';
}

ショートコードを適用するためにここで使用されます。

$pattern = get_shortcode_regex();
return preg_replace_callback('/'.$pattern.'/s', 'do_shortcode_tag', $content);

私の正規表現はそれほど素晴らしいものではありませんが、それを使って何かできるかもしれません。

あるいは:

それからブルートフォースの方法があります - それぞれのショートコードタグについて、'['.$tagが内容に含まれているかどうかを '単に'チェックしますか?しかし、その後、一部の開発者や古いプラグインは、コメントや他のカスタムタグを使って、コンテンツに対して独自のファンキーなフィルタをかけます。

そのため、$wp_filterのwpグローバル$wp_filter['the_content']を確認することもできます。内容は「内容」のために呼び出された関数であるべきです。

賢いことに

あなたはたぶん自分自身でpost save/updateにアクションを追加し、その後フィルターとショートコードのチェックをして何かをpost-metaに保存することができます。それから表示時にしなければならないのはpost-metaをチェックすることだけです。

うーん...それは価値がある?

3
anmari

だからここにそれの私のtrainrereckバージョンがあります(それがこの分立っているので、Anmariはたくさんの良いアイデアを与えました)。それは他の誰の使用にも全く柔軟ではありません、しかし私たちのホストされたプラットフォームと人々がそれを使う方法はとても柔軟です(私の人生をより簡単にします):

function tfh_analytics() {

    $client_ua = trim(get_option( 'tf_ua_analytics' ));

    ?>
    <script type='text/javascript'>
        //<![CDATA[
        var _gaq = _gaq || [];
        // TF Aggregate Tracking
        _gaq.Push(['_setAccount','UA-xxxxxxx-x']);
        _gaq.Push(['_trackPageview'],['_trackPageLoadTime']);
        // Define Theme
        _gaq.Push(['_setCustomVar',1,'Theme','<?php echo TF_THEME; ?>']);
        // Define Category
        <?php
        if ( have_posts() && ( is_page() || is_single() ) ) {
            $content = get_the_content(the_post());
            // Check if Front Page
            if ( is_front_page() ) { 
                if ( is_home() ) {
                $category = 'home-blog';
                } else {
                $category = 'home-static'; 
                }
            } else {
                // Check if Events
                if ( stripos( $content , '[tf-event') ) { $category = 'events'; }
                // Check if Food Menu
                if ( stripos( $content , '[tf-food') ) { $category = 'food-menu'; }
                // Check if Location
                if ( stripos( $content , '[tf-googlemaps') ) { $category = 'location'; }
                // Check if Blog
                if ( is_home() ) { $category = 'blog'; }
                }
            if ( !$category ) { $category = 'other'; } 
        }   
        ?>
        _gaq.Push(['_setCustomVar',2,'Category','<?php echo $category; ?>']);
        // Define Yelp Bar
        _gaq.Push(['_setCustomVar',3,'YelpEnabled','<?php if( get_option( 'tf_Yelp_enabled' ) == true) { echo 'true'; } else { echo 'false';} ?>']);     
        // Define User Type
        _gaq.Push(['_setCustomVar',4,'User','<?php if( is_user_logged_in() ) { echo 'logged_in'; } else { echo 'logged_out'; } ?>',1]);

    <?php if ( $client_ua != '' ) { ?>
        // Client Tracking
        _gaq.Push(['b._setAccount','<?php echo $client_ua; ?>']);
        _gaq.Push(['b._trackPageview']);
    <?php } ?>

    (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
        })();
        //]]>
    </script>
    <?php
}
0
Noel Tock

簡単な方法は、ショートコード関数内で$tag変数を使用することです。このアイデアを こちらから入手してください

add_shortcode("your_shortcode_tag", "shortcode_function");

function shortcode_function($atts, $content = null, $tag){ // $tag variable is here
   // check if your shortcode is called
    if($tag == "your_shortcode_tag"){
        // do your stuff
    }

}
0
KeepMove