ฉันช้าตอบคำถามนี้ แต่ตั้งแต่ Ian เริ่มหัวข้อนี้ในรายชื่อ wp-hackers วันนี้มันทำให้ฉันคิดว่ามันคุ้มค่าที่จะตอบโดยเฉพาะอย่างยิ่งเมื่อพิจารณาว่าฉันวางแผนที่จะเพิ่มคุณสมบัติดังกล่าวให้กับปลั๊กอินบางตัวที่ฉันทำงานอยู่
วิธีการพิจารณาคือตรวจสอบการโหลดหน้าแรกเพื่อดูว่าใช้รหัสย่อจริงหรือไม่จากนั้นให้บันทึกสถานะการใช้รหัสย่อลงในคีย์โพสต์เมตา นี่คือวิธี:
ทีละขั้นตอนวิธีการ
- ตั้งธง
$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% หากคุณสามารถค้นหาสถานการณ์ที่ใช้งานไม่ได้ฉันอยากจะรู้จริงๆดังนั้นฉันสามารถแก้ไขรหัสในปลั๊กอินบางตัวที่ฉันเพิ่งเพิ่มลงไปได้ ขอบคุณล่วงหน้า.