Tôi trả lời câu hỏi này muộn nhưng vì Ian đã bắt đầu chủ đề này trong danh sách tin tặc wp hôm nay nên tôi nghĩ rằng nó đáng để trả lời, đặc biệt là khi tôi dự định thêm một tính năng như vậy vào một số plugin tôi đang làm việc.
Một cách tiếp cận để xem xét là kiểm tra tải trang đầu tiên để xem liệu shortcode có thực sự được sử dụng hay không và sau đó lưu trạng thái sử dụng shortcode vào khóa meta post. Đây là cách thực hiện:
Từng bước làm thế nào
- Đặt
$shortcode_used
cờ thành 'no'
.
- Trong hàm shortcode, chính nó đặt
$shortcode_used
cờ thành 'yes'
.
- Đặt
'the_content'
mức độ ưu tiên hook 12
sau khi WordPress đã xử lý shortcodes và kiểm tra meta post để ''
sử dụng khóa "_has_{$shortcode_name}_shortcode"
. (Giá trị ''
được trả về khi khóa meta bài đăng không tồn tại cho ID bài đăng.)
- Sử dụng một
'save_post'
cái móc để xóa meta post xóa cờ liên tục cho bài đăng đó trong trường hợp người dùng thay đổi cách sử dụng shortcode.
- Ngoài ra, trong
'save_post'
hook sử dụng wp_remote_request()
để gửi HTTP GET không chặn đến permalink của chính bài đăng để kích hoạt tải trang đầu tiên và cài đặt cờ liên tục.
- Cuối cùng thiết lập một
'wp_print_styles'
và kiểm tra bài meta cho một giá trị 'yes'
, 'no'
hoặc ''
sử dụng phím "_has_{$shortcode_name}_shortcode"
. Nếu giá trị 'no'
không phục vụ bên ngoài. Nếu giá trị là 'yes'
hoặc ''
đi trước và phục vụ bên ngoài.
Và rằng nên làm điều đó. Tôi đã viết và thử nghiệm một plugin ví dụ để cho thấy tất cả những thứ này hoạt động như thế nào.
Mã Plugin ví dụ
Plugin thức dậy trên một [trigger-css]
shortcode đặt các <h2>
thành phần trên trang thành màu trắng trên đỏ để bạn có thể dễ dàng thấy nó hoạt động. Nó giả sử một css
thư mục con chứa style.css
tệp có CSS này trong đó:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
Và dưới đây là mã trong một plugin hoạt động:
<?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();
Ví dụ Ảnh chụp màn hình
Dưới đây là một loạt các ảnh chụp màn hình
Trình chỉnh sửa bài cơ bản, không có nội dung
Hiển thị bài đăng, không có nội dung
Trình chỉnh sửa bài cơ bản với [trigger-css]
Shortcode
Hiển thị bài đăng với [trigger-css]
Shortcode
Không chắc chắn nếu đó là 100%
Tôi tin rằng những điều trên sẽ hoạt động trong hầu hết các trường hợp nhưng vì tôi mới viết mã này nên tôi không thể chắc chắn 100%. Nếu bạn có thể tìm thấy các tình huống mà nó không hoạt động tôi thực sự muốn biết vì vậy tôi có thể sửa mã trong một số plugin tôi vừa thêm vào. Cảm ơn trước.