Sto rispondendo in ritardo a questa domanda, ma da quando Ian ha iniziato questa discussione nella lista degli hacker di wp oggi mi ha fatto pensare che valesse la pena rispondere soprattutto considerando che ho intenzione di aggiungere una tale funzionalità ad alcuni plugin su cui sto lavorando.
Un approccio da considerare è quello di verificare il caricamento della prima pagina per vedere se lo shortcode è effettivamente utilizzato e quindi salvare lo stato di utilizzo dello shortcode in una meta meta post. Ecco come:
Procedura dettagliata
- Imposta una
$shortcode_used
bandiera su 'no'
.
- Nella funzione shortcode stessa imposta il
$shortcode_used
flag su 'yes'
.
- Imposta una
'the_content'
priorità hook 12
che è dopo che WordPress ha elaborato i codici brevi e controlla la meta post per un ''
usando il tasto "_has_{$shortcode_name}_shortcode"
. (Viene ''
restituito un valore di quando non esiste una meta chiave post per l'ID post.)
- Utilizzare un
'save_post'
hook per eliminare la meta meta cancellando il flag persistente per quel post nel caso in cui l'utente cambi l'utilizzo dello shortcode.
- Inoltre,
'save_post'
usa l' hook wp_remote_request()
per inviare un HTTP GET non bloccante al proprio permalink del post per attivare il caricamento della prima pagina e l'impostazione del flag persistente.
- Infine imposta un
'wp_print_styles'
e controlla il post meta per un valore di 'yes'
, 'no'
o ''
usando la chiave "_has_{$shortcode_name}_shortcode"
. Se il valore è 'no'
non servire l'esterno. Se il valore è 'yes'
o ''
vai avanti e servi l'esterno.
E così dovrebbe andare. Ho scritto e testato un plug-in di esempio per mostrare come funziona tutto questo.
Esempio di codice plug-in
Il plug-in si riattiva su uno [trigger-css]
shortcode che imposta gli <h2>
elementi della pagina su bianco-rosso in modo da poterlo vedere facilmente funzionante. Presuppone una css
sottodirectory contenente il style.css
file con questo CSS al suo interno:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
E di seguito è riportato il codice in un plugin funzionante:
<?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();
Schermate di esempio
Ecco una serie di schermate
Editor di post di base, nessun contenuto
Pubblica display, nessun contenuto
Editor di posta base con [trigger-css]
shortcode
Pubblica display con [trigger-css]
shortcode
Non sono sicuro se è al 100%
Credo che quanto sopra dovrebbe funzionare in quasi tutti i casi, ma dato che ho appena scritto questo codice non posso esserne sicuro al 100%. Se riesci a trovare situazioni in cui non funziona, mi piacerebbe davvero saperlo, così posso correggere il codice in alcuni plugin a cui ho appena aggiunto questo. Grazie in anticipo.