Llegué tarde a esta pregunta, pero desde que Ian comenzó a este hilo en la lista de wp-hackers de hoy me hizo pensar que vale la pena responder, especialmente teniendo en cuenta que he estado planeando agregar una característica de este tipo a algunos complementos en los que he estado trabajando.
Un enfoque a considerar es verificar la carga de la primera página para ver si realmente se usa el shortcode y luego guardar el estado de uso del shortcode en una clave de metadatos posterior. Aquí es cómo:
Instrucciones paso a paso
- Establezca un indicador
$shortcode_used
en 'no'
.
- En la propia función de código abreviado, establece el indicador
$shortcode_used
en 'yes'
.
- Establezca una prioridad de enganche
'the_content'
12
después de que WordPress haya procesado los códigos cortos y verifique el meta del post para un ''
usando la clave "_has_{$shortcode_name}_shortcode"
. (se devuelve un valor de ''
cuando no existe una clave de metadatos de publicación para la ID de publicación).
- Use un gancho
'save_post'
para eliminar el meta de publicación que borra la marca persistente para esa publicación en caso de que el usuario cambie el uso de shortcode.
- También en el enganche
'save_post'
use wp_remote_request()
para enviar un GET HTTP sin bloqueo al enlace permanente de la publicación para activar la carga de la primera página y la configuración del indicador persistente.
- Por último, establezca un
'wp_print_styles'
y verifique el metadatos para un valor de 'yes'
, 'no'
o ''
usando la clave "_has_{$shortcode_name}_shortcode"
. Si el valor es 'no'
no sirve el externo. Si el valor es 'yes'
o ''
, siga adelante y sirva al externo.
Y eso debería hacerlo. He escrito y probado un complemento de ejemplo para mostrar cómo funciona todo esto.
Código de complemento de ejemplo
El complemento se activa con un código corto [trigger-css]
que establece los elementos <h2>
en la página en blanco sobre rojo para que pueda verlo fácilmente. Asume un subdirectorio css
que contiene el archivo style.css
con este CSS en él:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
Y debajo está el código en un complemento de trabajo:
<?php
/**
* Plugin Name: CSS on Shortcode
* Description: Shows how to conditionally load a shortcode
* Author: Mike Schinkel <[email protected]>
*/
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();
Capturas de pantalla de ejemplo
Aquí hay una serie de capturas de pantalla
Editor de publicaciones básico, sin contenido

Visualizacióndepublicaciones,sincontenido
Editor de publicaciones básico con [trigger-css]
Shortcode

Visualizacióndepublicacióncon[trigger-css]
Shortcode
No estoy seguro de que sea 100%
Creo que lo anterior debería funcionar en casi todos los casos, pero como acabo de escribir este código no puedo estar 100% seguro. Si puede encontrar situaciones en las que no funciona, me gustaría saberlo para poder corregir el código en algunos complementos a los que acabo de agregar esto. Gracias de antemano.