web-dev-qa-db-fra.com

vérifier le shortcode dans post/pages AND widgets ET les fichiers de modèles

Pour la prochaine version de mon plugin www.mapsmarker.com, je voudrais sortir les fichiers css et js du plugin uniquement si le shortcode [mapsmarker ...] est utilisé. Pour les articles/et les pages, j'ai déjà trouvé ce code de travail:

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

Le problème est que les cartes peuvent également être incorporées dans des widgets (par shortcode) ou un fichier de modèle directement à l’aide de la fonction do_shortcode () (http://www.mapsmarker.com/docs/how-to-add-maps-to- your-site-using-template-tags /) et le code ci-dessus ne vérifie pas, si cela est vrai - la carte ne sera pas affichée.

Comme solution de contournement, je pourrais ajouter une option dans les paramètres du plug-in si les fichiers js/css ne doivent être ajoutés que lorsque le shortcode est ajouté à un message ou à une page et que la description est ajoutée. Pour désactiver ce paramètre si une carte est ajoutée aux widgets via shortcode ou aux fichiers de modèle via do_shortcode ().

Comme ce n’est pas une solution tout à fait utilisable (ce qui résulterait en quelques demandes de support à long terme), je suis à la recherche d’une solution qui permette d’activer cette fonctionnalité par défaut sans avoir à ajouter d’option aux paramètres. , car le code vérifie également si un shortcode est ajouté dans les widgets ou via do_shortcode () dans l’un des fichiers de modèle, comme ceci:

....
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';
}
.....

Ma première approche de ce problème consistait à vérifier les variables globales et à voir si je pouvais filtrer ce code ajouté, par exemple. par $ wp_filter (array) - un tableau multidimensionnel de toutes les fonctions ajoutées aux filtres/hooks. Malheureusement, je n'ai pas encore trouvé de solution. Toute aide est appréciée!

2
robertharm

Quelqu'un peut me corriger, mais je pense qu'à partir de la version 3.3, vous pouvez mettre en file d'attente les scripts et les styles "en ligne" d'une publication.

Cela signifie: vous pouvez ajouter votre style/script wp_enqueue_script dans votre fonction de shortcode et WordPress les ajoutera au pied de page ... puisqu'il est trop tard pour les ajouter à l'en-tête.

Cela signifie: cela fonctionnera à chaque fois que le shortcode sera appelé.

Edit: en réponse au commentaire de Nick ci-dessous concernant l’ajout de la fonction de mise en file: j’ai fait un test rapide avec l’exemple de shortcode du codex:

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

Testé à l’intérieur du widget de contenu et de texte de publication et travail jusqu’à présent (sans tenir compte des URL non valides). Les fonctions doivent être appelées avant le retour, bien sûr (et oui, faites-le correctement et enregistrez votre script et vos styles au préalable [ paresseux ])

4
ungestaltbar