मैं इस प्रश्न का उत्तर देने में देर कर रहा हूं, लेकिन जब से इयान ने यह धागा wp-hackers की सूची पर शुरू किया, आज इसने मुझे विशेष रूप से इस बात का जवाब देने के लायक समझा कि मैं कुछ प्लगइन्स में इस तरह की सुविधा जोड़ने की योजना बना रहा हूं, जिन पर मैं काम कर रहा हूं।
विचार करने के लिए एक दृष्टिकोण पहले पृष्ठ लोड पर जांच करना है कि क्या शोर्ट वास्तव में उपयोग किया जाता है और फिर पोस्ट मेटा कुंजी में शोर्ट उपयोग की स्थिति को सहेजें। ऐसे:
चरण-दर-चरण कैसे-कैसे
- को एक
$shortcode_used
ध्वज सेट करें 'no'
।
- शोर्ट फ़ंक्शन में स्वयं
$shortcode_used
ध्वज को सेट करें 'yes'
।
- एक
'the_content'
हुक प्राथमिकता निर्धारित करें 12
जो कि वर्डप्रेस के बाद शॉर्टकोड और चेक पोस्ट मेटा ''
की कुंजी का उपयोग करके संसाधित किया गया है "_has_{$shortcode_name}_shortcode"
। ( ''
पोस्ट आईडी के लिए पोस्ट मेटा कुंजी मौजूद नहीं होने पर मान लौटाया जाता है।)
- एक का प्रयोग करें
'save_post'
कि पोस्ट मामले में उपयोगकर्ता शोर्ट उपयोग में परिवर्तन के लिए लगातार झंडा समाशोधन पोस्ट मेटा नष्ट करने के लिए हुक।
- इसके अलावा
'save_post'
हुक में wp_remote_request()
पहले पृष्ठ लोड और लगातार ध्वज की स्थापना के लिए ट्रिगर करने के लिए पोस्ट के अपने Permalink के लिए एक गैर अवरुद्ध HTTP GET भेजने के लिए उपयोग करें।
- अन्त में एक सेट
'wp_print_styles'
और मान के लिए पोस्ट मेटा जाँच 'yes'
, 'no'
या ''
कुंजी का उपयोग कर "_has_{$shortcode_name}_shortcode"
। यदि मान 'no'
बाहरी नहीं है। यदि मान है 'yes'
या ''
आगे बढ़ें और बाहरी सेवा करें।
और वह करना चाहिए। मैंने यह सब कैसे काम करता है यह दिखाने के लिए एक उदाहरण प्लगइन लिखा और परीक्षण किया है।
उदाहरण प्लगइन कोड
प्लगइन एक [trigger-css]
शोर्ट पर उठता है जो <h2>
पृष्ठ पर तत्वों को सफेद-पर-लाल पर सेट करता है ताकि आप आसानी से इसे काम करते देख सकें। यह इस सीएसएस के साथ एक css
उपनिर्देशिका युक्त style.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% निश्चित नहीं हो सकता। यदि आप ऐसी परिस्थितियां पा सकते हैं जहां यह काम नहीं करता है तो मैं वास्तव में यह जानना चाहूंगा कि मैं कुछ प्लगइन्स में कोड को ठीक कर सकता हूं जो मैंने इसे अभी जोड़ा है। अग्रिम में धन्यवाद।