Saya terlambat menjawab pertanyaan ini, tetapi karena Ian memulai utas ini pada daftar wp-hacker hari ini membuat saya berpikir itu layak untuk dijawab terutama mengingat saya telah berencana untuk menambahkan fitur seperti itu ke beberapa plugin yang telah saya kerjakan.
Pendekatan yang perlu dipertimbangkan adalah memeriksa pada pemuatan halaman pertama untuk melihat apakah kode pendek benar-benar digunakan dan kemudian menyimpan status penggunaan kode pendek ke kunci meta pos. Begini caranya:
Langkah-demi-Langkah
- Tetapkan
$shortcode_used
bendera ke 'no'
.
- Dalam fungsi shortcode itu sendiri mengatur
$shortcode_used
bendera ke 'yes'
.
- Tetapkan
'the_content'
prioritas kait 12
yang setelah WordPress memproses kode pendek dan periksa meta pos untuk ''
menggunakan kunci "_has_{$shortcode_name}_shortcode"
. (Nilai ''
dikembalikan ketika kunci meta pos tidak ada untuk ID pos.)
- Gunakan
'save_post'
pengait untuk menghapus meta pos yang menghapus bendera persisten untuk kiriman tersebut jika pengguna mengubah penggunaan kode pendek.
- Juga dalam penggunaan
'save_post'
hook wp_remote_request()
untuk mengirim GET HTTP non-blocking ke permalink posting sendiri untuk memicu memuat halaman pertama dan pengaturan flag persistent.
- Terakhir, tetapkan
'wp_print_styles'
dan periksa meta pos untuk nilai 'yes'
, 'no'
atau ''
gunakan kunci "_has_{$shortcode_name}_shortcode"
. Jika nilainya 'no'
tidak melayani eksternal. Jika nilainya 'yes'
atau ''
maju dan melayani eksternal.
Dan itu harus dilakukan. Saya telah menulis dan menguji contoh plugin untuk menunjukkan bagaimana semua ini bekerja.
Contoh Kode Pengaya
Plugin bangun dengan [trigger-css]
kode pendek yang mengatur <h2>
elemen - elemen pada halaman menjadi putih-merah sehingga Anda dapat melihatnya bekerja dengan mudah. Ini mengasumsikan css
subdirektori yang berisi style.css
file dengan CSS ini di dalamnya:
/*
* Filename: css/style.css
*/
h2 {
color: white;
background: red;
}
Dan di bawah ini adalah kode di plugin yang berfungsi:
<?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();
Contoh Screenshot
Berikut serangkaian tangkapan layar
Editor Posting Dasar, Tidak Ada Konten
Tampilan Posting, Tidak Ada Konten
Editor Posting Dasar dengan [trigger-css]
Kode Pendek
Posting Tampilan dengan [trigger-css]
Shortcode
Tidak yakin jika 100%
Saya percaya di atas harus bekerja di hampir semua kasus tetapi karena saya baru saja menulis kode ini saya tidak bisa 100% yakin. Jika Anda dapat menemukan situasi di mana itu tidak berhasil saya benar-benar ingin tahu sehingga saya dapat memperbaiki kode di beberapa plugin saya baru saja menambahkan ini. Terima kasih sebelumnya.