Ketika saya memulai jawaban ini, itu seharusnya hanya sebuah catatan kecil. Yah, saya gagal. Maaf! Tetap bersamaku, ada yang tersembunyi di dalam hati ...
Bagaimana widget WordPress disimpan
Daftar widget disimpan dalam opsi bernama 'sidebars_widgets'
. A var_export()
dapat memberikan sesuatu seperti berikut:
array (
'wp_inactive_widgets' =>
array (
),
'top-widget' =>
array (
),
'bottom-widget' =>
array (
),
'array_version' => 3,
)
Abaikan 'wp_inactive_widgets'
dan 'array_version'
. Kami tidak perlu peduli tentang itu.
Kunci lainnya adalah pengidentifikasi untuk bilah samping yang terdaftar. Dalam hal ini bilah sisi mungkin telah terdaftar dengan kode ini:
// Register two sidebars.
$sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
'name' => $sidebar,
'id' => $sidebar,
'before_widget' => '',
'after_widget' => ''
)
);
}
Secara default, sidebar kosong setelah pendaftaran. Tentu saja.
Untuk setiap kelas widget terdaftar, opsi terpisah dibuat, berisi semua opsi yang diperlukan. Opsi diawali oleh string widget_
. Untuk mendapatkan opsi untuk semua widget RSS aktif, kita harus melihat ke ...
get_option( 'widget_rss' );
Output yang mungkin:
array (
2 =>
array (
'title' => 'WordPress Stack Exchange',
'url' => 'http://wordpress.stackexchange.com/feeds',
'link' => 'http://wordpress.stackexchange.com/questions',
'items' => 5,
'show_summary' => 1,
'show_author' => 0,
'show_date' => 0,
),
)
Catat angka 2 . Argumen untuk beberapa instance semuanya disimpan dalam opsi yang diurutkan berdasarkan angka.
Untuk melihat kelas widget mana yang sudah diketahui oleh WordPress, buka wp-admin/options.php
dan gulir ke bawah sampai Anda melihat sesuatu seperti ini:
Ya, data serial. Tidak, Anda tidak dapat membacanya di sini. Jangan khawatir, kamu tidak harus.
Widget demo
Untuk menggambarkan pekerjaan dalam yang lebih baik, saya telah menulis widget demo yang sangat sederhana:
/**
* Super simple widget.
*/
class T5_Demo_Widget extends WP_Widget
{
public function __construct()
{ // id_base , visible name
parent::__construct( 't5_demo_widget', 'T5 Demo Widget' );
}
public function widget( $args, $instance )
{
echo $args['before_widget'], wpautop( $instance['text'] ), $args['after_widget'];
}
public function form( $instance )
{
$text = isset ( $instance['text'] )
? esc_textarea( $instance['text'] ) : '';
printf(
'<textarea class="widefat" rows="7" cols="20" id="%1$s" name="%2$s">%3$s</textarea>',
$this->get_field_id( 'text' ),
$this->get_field_name( 'text' ),
$text
);
}
}
Perhatikan konstruktor: 't5_demo_widget'
adalah $id_base
, pengidentifikasi untuk widget ini. Seperti yang Anda lihat di screen shot, argumennya disimpan dalam opsi widget_t5_demo_widget
. Semua widget khusus Anda akan diperlakukan seperti ini. Anda tidak perlu menebak namanya. Dan karena Anda telah menulis widget Anda (mungkin), Anda tahu semua argumen dari $instance
parameter kelas Anda .
Dasar-dasar tema
Pertama, Anda harus mendaftarkan beberapa sidebar dan widget khusus. Tindakan yang tepat untuk ini adalah mudah diingat: 'widgets_init'
. Masukkan semuanya ke dalam wadah - kelas atau fungsi. Untuk mempermudah saya akan menggunakan fungsi bernamat5_default_widget_demo()
.
Semua kode berikut masuk ke functions.php
. Kelas T5_Demo_Widget
harus sudah dimuat. Saya hanya memasukkannya ke file yang sama ...
add_action( 'widgets_init', 't5_default_widget_demo' );
function t5_default_widget_demo()
{
// Register our own widget.
register_widget( 'T5_Demo_Widget' );
// Register two sidebars.
$sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
'name' => $sidebar,
'id' => $sidebar,
'before_widget' => '',
'after_widget' => ''
)
);
}
Sejauh ini, sangat sederhana. Tema kami sekarang widget siap, widget demo dikenal. Sekarang menyenangkan.
$active_widgets = get_option( 'sidebars_widgets' );
if ( ! empty ( $active_widgets[ $sidebars['a'] ] )
or ! empty ( $active_widgets[ $sidebars['b'] ] )
)
{ // Okay, no fun anymore. There is already some content.
return;
}
Anda benar-benar tidak ingin merusak pengaturan pengguna. Jika sudah ada beberapa konten di sidebar, kode Anda tidak boleh melewatinya. Itu sebabnya kami berhenti dalam kasus ini.
Oke, anggap sidebar kosong ... kita perlu penghitung:
$counter = 1;
Widget diberi nomor . Angka-angka ini adalah pengidentifikasi kedua untuk WordPress.
Mari kita minta array untuk mengubahnya:
$active_widgets = get_option( 'sidebars_widgets' );
Kami juga membutuhkan penghitung (lebih lanjut tentang itu nanti):
$counter = 1;
Dan inilah cara kami menggunakan penghitung, nama bilah sisi, dan argumen widget (well, kami hanya punya satu argumen:) text
.
// Add a 'demo' widget to the top sidebar …
$active_widgets[ $sidebars['a'] ][0] = 't5_demo_widget-' . $counter;
// … and write some text into it:
$demo_widget_content[ $counter ] = array ( 'text' => "This works!\n\nAmazing!" );
$counter++;
Perhatikan bagaimana pengenal widget dibuat: the id_base
, a minus -
dan the counter. The isi dari widget tersebut disimpan dalam variabel lain $demo_widget_content
. Ini adalah counter kuncinya dan argumen widget disimpan dalam array.
Kami menambah penghitung satu demi satu ketika kami selesai untuk menghindari tabrakan.
Itu mudah. Sekarang widget RSS. Lebih banyak bidang, lebih menyenangkan!
$active_widgets[ $sidebars['a'] ][] = 'rss-' . $counter;
// The latest 15 questions from WordPress Stack Exchange.
$rss_content[ $counter ] = array (
'title' => 'WordPress Stack Exchange',
'url' => 'http://wordpress.stackexchange.com/feeds',
'link' => 'http://wordpress.stackexchange.com/questions',
'items' => 15,
'show_summary' => 0,
'show_author' => 1,
'show_date' => 1,
);
update_option( 'widget_rss', $rss_content );
$counter++;
Ini adalah sesuatu yang baru: update_option()
ini akan menyimpan argumen widget RSS dalam opsi terpisah. WordPress akan menemukan ini secara otomatis nanti.
Kami tidak menyimpan argumen widget demo karena kami menambahkan instance kedua ke sidebar kedua kami sekarang ...
// Okay, now to our second sidebar. We make it short.
$active_widgets[ $sidebars['b'] ][] = 't5_demo_widget-' . $counter;
#$demo_widget_content = get_option( 'widget_t5_demo_widget', array() );
$demo_widget_content[ $counter ] = array ( 'text' => 'The second instance of our amazing demo widget.' );
update_option( 'widget_t5_demo_widget', $demo_widget_content );
... dan simpan semua argumen untuk t5_demo_widget
satu pencarian. Tidak perlu memperbarui opsi yang sama dua kali.
Nah, cukup widget untuk hari ini, mari kita simpan sidebars_widgets
juga:
update_option( 'sidebars_widgets', $active_widgets );
Sekarang WordPress akan tahu bahwa ada beberapa widget terdaftar dan di mana argumen untuk setiap widget disimpan. A var_export()
di sidebar_widgets akan terlihat seperti ini:
array (
'wp_inactive_widgets' =>
array (
),
'top-widget' =>
array (
0 => 't5_demo_widget-1',
1 => 'rss-2',
),
'bottom-widget' =>
array (
0 => 't5_demo_widget-3',
),
'array_version' => 3,
)
The lengkap kode lagi:
add_action( 'widgets_init', 't5_default_widget_demo' );
function t5_default_widget_demo()
{
// Register our own widget.
register_widget( 'T5_Demo_Widget' );
// Register two sidebars.
$sidebars = array ( 'a' => 'top-widget', 'b' => 'bottom-widget' );
foreach ( $sidebars as $sidebar )
{
register_sidebar(
array (
'name' => $sidebar,
'id' => $sidebar,
'before_widget' => '',
'after_widget' => ''
)
);
}
// Okay, now the funny part.
// We don't want to undo user changes, so we look for changes first.
$active_widgets = get_option( 'sidebars_widgets' );
if ( ! empty ( $active_widgets[ $sidebars['a'] ] )
or ! empty ( $active_widgets[ $sidebars['b'] ] )
)
{ // Okay, no fun anymore. There is already some content.
return;
}
// The sidebars are empty, let's put something into them.
// How about a RSS widget and two instances of our demo widget?
// Note that widgets are numbered. We need a counter:
$counter = 1;
// Add a 'demo' widget to the top sidebar …
$active_widgets[ $sidebars['a'] ][0] = 't5_demo_widget-' . $counter;
// … and write some text into it:
$demo_widget_content[ $counter ] = array ( 'text' => "This works!\n\nAmazing!" );
#update_option( 'widget_t5_demo_widget', $demo_widget_content );
$counter++;
// That was easy. Now a RSS widget. More fields, more fun!
$active_widgets[ $sidebars['a'] ][] = 'rss-' . $counter;
// The latest 15 questions from WordPress Stack Exchange.
$rss_content[ $counter ] = array (
'title' => 'WordPress Stack Exchange',
'url' => 'http://wordpress.stackexchange.com/feeds',
'link' => 'http://wordpress.stackexchange.com/questions',
'items' => 15,
'show_summary' => 0,
'show_author' => 1,
'show_date' => 1,
);
update_option( 'widget_rss', $rss_content );
$counter++;
// Okay, now to our second sidebar. We make it short.
$active_widgets[ $sidebars['b'] ][] = 't5_demo_widget-' . $counter;
#$demo_widget_content = get_option( 'widget_t5_demo_widget', array() );
$demo_widget_content[ $counter ] = array ( 'text' => 'The second instance of our amazing demo widget.' );
update_option( 'widget_t5_demo_widget', $demo_widget_content );
// Now save the $active_widgets array.
update_option( 'sidebars_widgets', $active_widgets );
}
Jika Anda masuk ke wp-admin/widgets.php
sekarang Anda akan melihat tiga widget yang telah ditetapkan:
Dan itu saja. Gunakan ...
dynamic_sidebar( 'top-widget' );
dynamic_sidebar( 'bottom-widget' );
... untuk mencetak widget.
Ada kesalahan kecil: Anda harus memuat front-end dua kali untuk pendaftaran awal. Jika ada yang bisa membantu di sini saya akan sangat berterima kasih.