web-dev-qa-db-fra.com

Comment détecter si un Shortcode est appelé sur une page?

J'essaie de pousser certaines variables dans Google Analytics et j'aimerais pouvoir détecter si un shortcode a été inclus dans une page.

Quelqu'un sait-il comment s'y prendre?

Je vous remercie!

Noel

1
Noel Tock

Je me suis parfois demandé la même chose - si wp est peut-être coché lors de la sauvegarde et tenu un registre, etc.

J'ai jeté un coup d'œil au code et il semble que non.

Il existe cependant un $shortcode_tags global, et wp a cette fonction

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\])?(.?)';
}

utilisé ici pour appliquer le shortcode:

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

Mon regex n'est pas terrible, mais peut-être que vous pourriez faire quelque chose avec ça?

Sinon:

Ensuite, il y a la méthode de la force brute - pour chacune des balises shortcode, "simplement" vérifiez si '['.$tag est dans le contenu? Mais ensuite, certains développeurs/plugins plus anciens font leurs propres filtres géniaux sur le contenu avec des commentaires ou d’autres balises personnalisées.

Dans ce cas, vous pouvez également vérifier le $wp_filter wp global pour $wp_filter['the_content']; le contenu devrait les fonctions appelées "le contenu".

Pour être malin

Vous pourriez peut-être ajouter une action vous-même après l'enregistrement/la mise à jour, ensuite vérifier les filtres et les codes courts et stocker quelque chose dans un post-méta. Ensuite, tout ce que vous avez à faire au moment de l'affichage est de vérifier le post-méta.

Ouf ... ça vaut le coup?

3
anmari

Voici donc ma version de trainwreck (Anmari a donné beaucoup de bonnes idées). Ce n'est pas vraiment flexible du tout pour quelqu'un d'autre non plus, mais notre plate-forme hébergée et la façon dont les gens l'utilisent sont très flexibles (me facilitent la vie):

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

De manière simple, utilisez la variable $tag dans votre fonction de shortcode. Obtenez cette idée de ici

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