Bu cevabı başlattığımda sadece küçük bir not olmalı. Ben başarısız oldum. Üzgünüm! Benimle kal, derinlerde saklı bir şeref var ...
WordPress widget'ları nasıl depolanır?
Widget listesi adlı bir seçenek içinde saklanır 'sidebars_widgets'
. A var_export()
, aşağıdaki gibi bir şey verebilir:
array (
'wp_inactive_widgets' =>
array (
),
'top-widget' =>
array (
),
'bottom-widget' =>
array (
),
'array_version' => 3,
)
Yoksay 'wp_inactive_widgets'
ve 'array_version'
. Bunlarla ilgilenmek zorunda değiliz.
Diğer tuşlar kayıtlı kenar çubukları için tanımlayıcıdır. Bu durumda kenar çubukları bu koda kaydedilmiş olabilir:
// 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' => ''
)
);
}
Varsayılan olarak kenar çubukları kayıttan sonra boştur. Tabii ki.
Kayıtlı her widget sınıfı için, gerekli tüm seçenekleri içeren ayrı bir seçenek oluşturulur. Bu seçenek dizge tarafından ön eklenmiştir widget_
. Tüm aktif RSS widget'larının seçeneklerini görmek için araştırmamız gereken…
get_option( 'widget_rss' );
Mümkün çıktı:
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,
),
)
2 numaraya dikkat edin . Birden fazla örnek için olan argümanların tümü, sayılara göre sıralanmış bir seçenekte saklanır.
Hangi widget sınıflarının zaten WordPress tarafından bilindiğini görmek için şuna gidin wp-admin/options.php
ve aşağıdakine benzer bir şey görünceye kadar aşağı kaydırın:
Evet, serileştirilmiş veri. Hayır, burada okuyamazsın. Endişelenme, zorunda değilsin.
Bir demo widget
İç işleri daha iyi göstermek için çok basit bir demo widget'ı yazdım:
/**
* 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
);
}
}
Yapıcısı Not: 't5_demo_widget'
olup $id_base
, bu widget için tanımlayıcı. Ekran görüntüsünde de görebileceğiniz gibi argümanlar seçeneklerinde saklanır widget_t5_demo_widget
. Tüm özel aletleriniz bu şekilde ele alınacaktır. Adı tahmin etmek zorunda değilsin. Beri sen Widget'larınızı yazdım (muhtemelen) Eğer sınıf dan tüm argümanları biliyorum $instance
parametreler.
Tema temelleri
Önce bazı kenar çubuklarını ve özel widget'ı kaydetmeniz gerekir. Bunun için uygun eylem hatırlamak kolaydır: 'widgets_init'
. Her şeyi bir kaba yerleştirin - bir sınıf veya işlev. Basit olması için adlı bir işlev kullanacağım t5_default_widget_demo()
.
Aşağıdaki kodun tümü içine gider functions.php
. Sınıf T5_Demo_Widget
önceden yüklenmiş olmalı. Sadece aynı dosyaya koydum…
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' => ''
)
);
}
Şimdiye kadar, çok basit. Bizim tema artık widget hazır, demo widget biliniyor. Şimdi eğlence.
$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;
}
Gerçekten kullanıcı ayarlarını yok etmek istemezsin. Kenar çubuklarında zaten içerik varsa, kodunuz üzerinde çalışmamalıdır. Bu yüzden bu durumda duruyoruz.
Tamam, kenar çubuklarının boş olduğu varsayılıyor… bir sayaca ihtiyacımız var:
$counter = 1;
Widget'lar numaralandırılmıştır . Bu sayılar WordPress için ikinci tanımlayıcıdır.
Bunu değiştirmek için diziyi alalım:
$active_widgets = get_option( 'sidebars_widgets' );
Bir sayaca da ihtiyacımız var (daha fazlası için):
$counter = 1;
Ve işte sayacı, kenar çubuğu isimlerini ve widget argümanlarını nasıl kullanacağımız 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++;
Widget tanımlayıcısının nasıl oluşturulduğuna dikkat edin: id_base
eksi -
ve sayaç. İçerik aracının başka bir değişken olarak depolanır $demo_widget_content
. Burada sayaç ve anahtar değişkenleri argümanlar bir dizide saklanır.
Çarpışmaları önlemek için işlem bittiğinde sayacı birer birer artırıyoruz.
Kolaydı. Şimdi bir RSS gereci. Daha fazla alan, daha eğlenceli!
$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++;
İşte yeni bir şey: update_option()
bu, RSS widget argümanını ayrı bir seçenekte saklayacaktır. WordPress bunları daha sonra otomatik olarak bulacaktır.
Demo widget değişkenlerini kaydetmedik çünkü şimdi ikinci kenar çubuğumuza ikinci bir örnek ekledik…
// 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 );
… Ve t5_demo_widget
tek bir acele için tüm argümanları kaydedin . Aynı seçeneği iki kez güncellemeye gerek yok.
Pekala, bugün için yeterince alet, hadi de sidebars_widgets
kurtaralım:
update_option( 'sidebars_widgets', $active_widgets );
Şimdi WordPress bazı kayıtlı widget'lar olduğunu ve her widget için argümanların nerede saklandığını bilecek. var_export()
Sidebar_widgets üzerindeki A şunun gibi görünecektir:
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,
)
Tam kod tekrar:
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 );
}
Eğer giderseniz wp-admin/widgets.php
şimdi üç ön ayarlı widget'lar göreceksiniz:
Ve bu kadar. Kullan…
dynamic_sidebar( 'top-widget' );
dynamic_sidebar( 'bottom-widget' );
… Gereçleri yazdırmak için.
Küçük bir aksaklık var: İlk kayıt için ön ucu iki kez yüklemelisiniz. Biri burada yardım edebilirse çok minnettar olacağım.