Я опаздываю с ответом на этот вопрос, но с тех пор, как Ян начал эту тему в списке wp-хакеров, я подумал, что стоит ответить, особенно учитывая, что я планировал добавить такую функцию в некоторые плагины, над которыми я работал.
Подход, который необходимо рассмотреть, заключается в проверке загрузки первой страницы, чтобы увидеть, действительно ли используется шорткод, и затем сохранении статуса использования шорткода в мета-ключе поста. Вот как:
Пошаговая инструкция
- Установите
$shortcode_used
флаг в 'no'
.
- В самой функции шорткода установите
$shortcode_used
флаг в 'yes'
.
- Установите
'the_content'
приоритет перехвата, 12
который происходит после того, как WordPress обработал шорткоды, и проверьте метаданные публикации на предмет ''
использования ключа "_has_{$shortcode_name}_shortcode"
. (Значение ''
возвращается, когда мета-ключ сообщения не существует для идентификатора сообщения.)
- Используйте
'save_post'
ловушку для удаления мета-сообщения, удаляя постоянный флаг для этого сообщения в случае, если пользователь меняет использование шорткода.
- Также в
'save_post'
ловушке используется wp_remote_request()
для отправки неблокирующего HTTP GET на собственную постоянную ссылку поста для запуска загрузки первой страницы и установки постоянного флага.
- Наконец, установите
'wp_print_styles'
и проверьте мета сообщения для значения 'yes'
, 'no'
или ''
используя ключ "_has_{$shortcode_name}_shortcode"
. Если значение 'no'
не служит внешнему. Если значение 'yes'
или ''
идти вперед и служить внешним.
И это должно сделать это. Я написал и протестировал пример плагина, чтобы показать, как все это работает.
Пример кода плагина
Плагин [trigger-css]
активирует шорткод, который устанавливает <h2>
элементы на странице белым по красному, чтобы вы могли легко увидеть, как он работает. Предполагается, что css
подкаталог содержит style.css
файл с этим CSS:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
И ниже код в рабочем плагине:
<?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();
Примеры скриншотов
Вот серия скриншотов
Основной редактор сообщений, без содержимого
Опубликовать дисплей, нет контента
Базовый редактор сообщений с [trigger-css]
шорткодом
Опубликовать дисплей с [trigger-css]
шорткодом
Не уверен, что это 100%
Я считаю, что вышеупомянутое должно работать почти во всех случаях, но поскольку я только что написал этот код, я не могу быть уверен на 100%. Если вы можете найти ситуации, когда это не работает, мне бы очень хотелось знать, чтобы я мог исправить код в некоторых плагинах, к которым я только что добавил это. Заранее спасибо.