Spóźniam się z odpowiedzią na to pytanie, ale odkąd Ian rozpoczął ten wątek na liście wp-hackerów, pomyślałem, że warto odpowiedzieć, szczególnie biorąc pod uwagę, że planuję dodać taką funkcję do niektórych wtyczek, nad którymi pracuję.
Podejście, które należy rozważyć, to sprawdzenie przy ładowaniu pierwszej strony, aby sprawdzić, czy shortcode jest rzeczywiście używany, a następnie zapisanie stanu użycia shortcode w meta-kluczu post. Oto jak:
Poradnik krok po kroku
- Ustaw
$shortcode_used
flagę na 'no'
.
- W samej funkcji shortcode ustaw
$shortcode_used
flagę na 'yes'
.
- Ustaw
'the_content'
priorytet przechwytywania, 12
który jest po przetworzeniu przez WordPress skrótów i sprawdź post meta pod kątem ''
używania klucza "_has_{$shortcode_name}_shortcode"
. (Zwracana jest wartość, ''
gdy meta-klucz posta nie istnieje dla identyfikatora postu).
- Użyj
'save_post'
haka, aby usunąć meta postu, usuwając trwałą flagę dla tego postu na wypadek, gdyby użytkownik zmienił użycie krótkiego kodu.
- Również w tym
'save_post'
haku użyj, wp_remote_request()
aby wysłać nieblokujący HTTP GET do bezpośredniego linku do posta, aby uruchomić ładowanie pierwszej strony i ustawienie trwałej flagi.
- Wreszcie ustawić
'wp_print_styles'
i sprawdzić postu meta na wartości 'yes'
, 'no'
lub ''
za pomocą klawisza "_has_{$shortcode_name}_shortcode"
. Jeśli wartość 'no'
nie jest podana na zewnątrz. Jeśli wartość wynosi 'yes'
lub ''
śmiało i podaj zewnętrzny.
I to powinno wystarczyć. Napisałem i przetestowałem przykładową wtyczkę, aby pokazać, jak to wszystko działa.
Przykładowy kod wtyczki
Wtyczka budzi się na [trigger-css]
krótkim kodzie, który ustawia <h2>
elementy na stronie na biało-czerwone, abyś mógł łatwo zobaczyć, jak działa. Zakłada css
podkatalog zawierający style.css
plik z tym CSS:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
Poniżej znajduje się kod działającej wtyczki:
<?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();
Przykładowe zrzuty ekranu
Oto seria zrzutów ekranu
Podstawowy edytor postów, bez zawartości
Wyświetlanie postów, brak treści
Podstawowy edytor [trigger-css]
postów z krótkim kodem
Wyświetlanie [trigger-css]
postów za pomocą krótkiego kodu
Nie jestem pewien, czy to w 100%
Uważam, że powyższe powinno działać prawie we wszystkich przypadkach, ale ponieważ właśnie napisałem ten kod, nie mogę być w 100% pewien. Jeśli możesz znaleźć sytuacje, w których to nie działa, naprawdę chciałbym wiedzieć, żebym mógł naprawić kod w niektórych wtyczkach, do których właśnie to dodałem. Z góry dziękuję.