Ich beantworte diese Frage zu spät, aber seit Ian diesen Thread auf der Liste der WP-Hacker gestartet hat, war es mir ein Anliegen, sie zu beantworten, insbesondere angesichts der Tatsache, dass ich geplant habe, einigen Plugins, an denen ich arbeite, eine solche Funktion hinzuzufügen.
Ein zu berücksichtigender Ansatz besteht darin, beim Laden der ersten Seite zu überprüfen, ob der Shortcode tatsächlich verwendet wird, und dann den Shortcode-Verwendungsstatus in einem Post-Metaschlüssel zu speichern. Hier ist wie:
Schritt-für-Schritt-Anleitung
- Setzen Sie eine
$shortcode_used
Flagge auf 'no'
.
- In der Shortcode-Funktion selbst setzen Sie das
$shortcode_used
Flag auf 'yes'
.
- Stellen Sie eine
'the_content'
Hook-Priorität ein 12
, nachdem WordPress Shortcodes verarbeitet hat, und überprüfen Sie das Post-Meta ''
mit der Taste auf a "_has_{$shortcode_name}_shortcode"
. (Ein Wert von ''
wird zurückgegeben, wenn für die Beitrags-ID kein Beitrags-Metaschlüssel vorhanden ist.)
- Verwenden Sie einen
'save_post'
Haken, um das Post-Meta zu löschen und das persistente Flag für diesen Post zu löschen, falls der Benutzer die Verwendung des Shortcodes ändert.
- Ebenfalls im
'save_post'
Hook verwenden wp_remote_request()
, um ein nicht blockierendes HTTP-GET an den eigenen Permalink des Posts zu senden, um das Laden der ersten Seite und das Setzen des persistenten Flags auszulösen.
- Schließlich setzt ein
'wp_print_styles'
und überprüft Post meta für einen Wert von 'yes'
, 'no'
oder mit ''
der Taste "_has_{$shortcode_name}_shortcode"
. Wenn der Wert 'no'
nicht ist, dienen Sie dem Äußeren. Wenn der Wert ist 'yes'
oder ''
weitermachen und dem Äußeren dienen.
Und das sollte es tun. Ich habe ein Beispiel-Plugin geschrieben und getestet, um zu zeigen, wie das alles funktioniert.
Beispiel Plugin Code
Das Plugin wird durch einen [trigger-css]
Shortcode aktiviert, der die <h2>
Elemente auf der Seite auf Weiß auf Rot setzt, damit Sie leicht sehen können, wie sie funktionieren. Es wird davon css
ausgegangen, dass ein Unterverzeichnis eine style.css
Datei mit folgendem CSS enthält:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
Und unten ist der Code in einem funktionierenden Plugin:
<?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();
Beispiel-Screenshots
Hier ist eine Reihe von Screenshots
Basic Post Editor, kein Inhalt
Nachanzeige, kein Inhalt
Einfacher Post Editor mit [trigger-css]
Shortcode
[trigger-css]
Nachanzeige mit Kurzwahl
Nicht sicher, ob es 100% ist
Ich glaube, dass das oben Genannte in fast allen Fällen funktionieren sollte, aber da ich gerade diesen Code geschrieben habe, kann ich nicht 100% sicher sein. Wenn Sie Situationen finden, in denen es nicht funktioniert, würde ich gerne wissen, ob ich den Code in einigen Plugins korrigieren kann, die ich soeben hinzugefügt habe. Danke im Voraus.