Je réponds tardivement à cette question, mais depuis que Ian a commencé ce fil de discussion sur la liste des wp-hackers aujourd'hui, cela m'a fait penser que cela valait la peine de répondre, d'autant plus que j'ai prévu d'ajouter une telle fonctionnalité aux plugins sur lesquels je travaille.
Une approche à considérer consiste à vérifier sur le chargement de la première page pour voir si le shortcode est réellement utilisé, puis enregistrez le statut d'utilisation du shortcode dans une clé méta de publication. Voici comment:
Comment faire étape par étape
- Définir un
$shortcode_used
drapeau pour 'no'
.
- Dans la fonction shortcode, réglez l'
$shortcode_used
indicateur sur 'yes'
.
- Définissez une
'the_content'
priorité de raccordement 12
après que WordPress a traité les codes courts et vérifiez la méta-publication pour une ''
utilisation de la clé "_has_{$shortcode_name}_shortcode"
. (Une valeur de ''
est renvoyée lorsqu'une clé méta de publication n'existe pas pour l'ID de publication.)
- Utilisez un
'save_post'
crochet pour supprimer la publication meta en effaçant l'indicateur de persistance pour cette publication au cas où l'utilisateur modifierait l'utilisation du code court.
- Également dans le
'save_post'
hook, utilisez wp_remote_request()
pour envoyer un HTTP GET non bloquant à la permalien de la publication afin de déclencher le chargement de la première page et le réglage de l'indicateur de persistance.
- Enfin, définissez a
'wp_print_styles'
et vérifiez post meta pour une valeur de 'yes'
, 'no'
ou ''
utilisez la clé "_has_{$shortcode_name}_shortcode"
. Si la valeur est 'no'
ne pas servir l'externe. Si la valeur est 'yes'
ou ''
aller de l'avant et servir l'externe.
Et cela devrait le faire. J'ai écrit et testé un exemple de plugin pour montrer comment tout cela fonctionne.
Exemple de code de plugin
Le plugin se réveille sur un [trigger-css]
shortcode qui définit les <h2>
éléments de la page en blanc sur rouge afin que vous puissiez facilement la voir fonctionner. Il suppose un css
sous - répertoire contenant un style.css
fichier contenant ce CSS:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
Et ci-dessous est le code dans un plugin de travail:
<?php
/**
* Plugin Name: CSS on Shortcode
* Description: Shows how to conditionally load a shortcode
* Author: Mike Schinkel <mike@newclarity.net>
*/
class CSS_On_Shortcode {
/**
* @var CSS_On_Shortcode
*/
private static $_this;
/**
* @var string 'yes'/'no' vs. true/false as get_post_meta() returns '' for false and not found.
*/
var $shortcode_used = 'no';
/**
* @var string
*/
var $HAS_SHORTCODE_KEY = '_has_trigger-css_shortcode';
/**
*
*/
function __construct() {
self::$_this = $this;
add_shortcode( 'trigger-css', array( $this, 'do_shortcode' ) );
add_filter( 'the_content', array( $this, 'the_content' ), 12 ); // AFTER WordPress' do_shortcode()
add_action( 'save_post', array( $this, 'save_post' ) );
add_action( 'wp_print_styles', array( $this, 'wp_print_styles' ) );
}
/**
* @return CSS_On_Shortcode
*/
function this() {
return self::$_this;
}
/**
* @param array $arguments
* @param string $content
* @return string
*/
function do_shortcode( $arguments, $content ) {
/**
* If this shortcode is being used, capture the value so we can save to post_meta in the 'the_content' filter.
*/
$this->shortcode_used = 'yes';
return '<h2>THIS POST WILL ADD CSS TO MAKE H2 TAGS WHITE ON RED</h2>';
}
/**
* Delete the 'has_shortcode' meta value so that it can be regenerated
* on first page load in case shortcode use has changed.
*
* @param int $post_id
*/
function save_post( $post_id ) {
delete_post_meta( $post_id, $this->HAS_SHORTCODE_KEY );
/**
* Now load the post asynchronously via HTTP to pre-set the meta value for $this->HAS_SHORTCODE_KEY.
*/
wp_remote_request( get_permalink( $post_id ), array( 'blocking' => false ) );
}
/**
* @param array $args
*
* @return array
*/
function wp_print_styles( $args ) {
global $post;
if ( 'no' != get_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, true ) ) {
/**
* Only bypass if set to 'no' as '' is unknown.
*/
wp_enqueue_style( 'css-on-shortcode', plugins_url( 'css/style.css', __FILE__ ) );
}
}
/**
* @param string $content
* @return string
*/
function the_content( $content ) {
global $post;
if ( '' === get_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, true ) ) {
/**
* This is the first time the shortcode has ever been seen for this post.
* Save a post_meta key so that next time we'll know this post uses this shortcode
*/
update_post_meta( $post->ID, $this->HAS_SHORTCODE_KEY, $this->shortcode_used );
}
/**
* Remove this filter now. We don't need it for this post again.
*/
remove_filter( 'the_content', array( $this, 'the_content' ), 12 );
return $content;
}
}
new CSS_On_Shortcode();
Exemple de captures d'écran
Voici une série de captures d'écran
Post Editor basique, sans contenu
Affichage post, pas de contenu
Post Editor [trigger-css]
basique avec Shortcode
Affichage de poste avec [trigger-css]
Shortcode
Pas sûr si c'est 100%
Je crois que ce qui précède devrait fonctionner dans presque tous les cas, mais comme je viens d'écrire ce code, je ne peux pas être sûr à 100%. Si vous pouvez trouver des situations où cela ne fonctionne pas, j'aimerais vraiment savoir si je peux corriger le code dans certains plugins auxquels j'ai ajouté ceci. Merci d'avance.