Khi tôi bắt đầu câu trả lời này, nó chỉ là một ghi chú nhỏ. Chà, tôi đã thất bại. Lấy làm tiếc! Ở lại với tôi, có một điều tốt đẹp ẩn sâu xuống
Cách các widget WordPress được lưu trữ
Danh sách các widget được lưu trữ trong một tùy chọn có tên 'sidebars_widgets'
. A var_export()
có thể cung cấp một cái gì đó như sau:
array (
'wp_inactive_widgets' =>
array (
),
'top-widget' =>
array (
),
'bottom-widget' =>
array (
),
'array_version' => 3,
)
Bỏ qua 'wp_inactive_widgets'
và 'array_version'
. Chúng ta không cần phải quan tâm đến những điều đó.
Các khóa khác là định danh cho các thanh bên đã đăng ký. Trong trường hợp này, các thanh bên có thể đã được đăng ký với mã này:
// 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' => ''
)
);
}
Theo mặc định, các sidebars trống sau khi đăng ký. Tất nhiên.
Đối với mỗi lớp widget đã đăng ký, một tùy chọn riêng biệt được tạo, chứa tất cả các tùy chọn cần thiết. Tùy chọn được tiền tố bởi chuỗi widget_
. Để có được các tùy chọn cho tất cả các tiện ích RSS đang hoạt động, chúng tôi phải tìm hiểu về
get_option( 'widget_rss' );
Sản lượng có thể:
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,
),
)
Lưu ý số 2 . Các đối số cho nhiều trường hợp đều được lưu trữ trong tùy chọn này được sắp xếp theo số.
Để xem các lớp widget nào đã được WordPress biết đến, hãy wp-admin/options.php
cuộn xuống và cuộn xuống cho đến khi bạn thấy một cái gì đó như thế này:
Có, dữ liệu nối tiếp. Không, bạn không thể đọc chúng ở đây. Đừng lo lắng, bạn không cần phải làm vậy.
Một widget demo
Để minh họa các hoạt động bên trong tốt hơn tôi đã viết một tiện ích demo rất đơn giản:
/**
* 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
);
}
}
Lưu ý hàm tạo: 't5_demo_widget'
là $id_base
, định danh cho widget này. Như bạn có thể thấy trong màn hình, các đối số của nó được lưu trong tùy chọn widget_t5_demo_widget
. Tất cả các vật dụng tùy chỉnh của bạn sẽ được đối xử như thế này. Bạn không cần phải đoán tên. Và vì bạn đã viết các widget của mình (có thể), bạn biết tất cả các đối số từ các $instance
tham số của lớp .
Chủ đề cơ bản
Đầu tiên bạn phải đăng ký một số thanh bên và widget tùy chỉnh. Các hành động thích hợp cho điều này là dễ nhớ : 'widgets_init'
. Đặt mọi thứ vào một thùng chứa - một lớp hoặc một chức năng. Để đơn giản, tôi sẽ sử dụng một hàm có tên t5_default_widget_demo()
.
Tất cả các mã sau đây đi vào functions.php
. Các lớp T5_Demo_Widget
nên được tải. Tôi chỉ cần đặt nó vào cùng một tập tin
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' => ''
)
);
}
Cho đến nay, rất đơn giản. Chủ đề của chúng tôi bây giờ là widget đã sẵn sàng, tiện ích demo được biết đến. Bây giờ là niềm vui.
$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;
}
Bạn thực sự không muốn phá hủy cài đặt người dùng. Nếu đã có một số nội dung trong thanh bên, mã của bạn không nên chạy qua nó. Đó là lý do tại sao chúng ta dừng lại trong trường hợp này.
Được rồi, giả sử các thanh bên là trống rỗng, chúng tôi cần một bộ đếm:
$counter = 1;
Các widget được đánh số . Những con số này là định danh thứ hai cho WordPress.
Hãy lấy mảng để thay đổi nó:
$active_widgets = get_option( 'sidebars_widgets' );
Chúng ta cũng cần một bộ đếm (nhiều hơn về điều đó sau):
$counter = 1;
Và đây là cách chúng ta sử dụng bộ đếm, tên thanh bên và các đối số widget (tốt, chúng ta chỉ có một đối số 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++;
Lưu ý cách định danh widget được tạo: the id_base
, trừ -
và bộ đếm. Các nội dung của widget được lưu trữ trong một biến khác $demo_widget_content
. Đây là bộ đếm khóa và các đối số widget được lưu trữ trong một mảng.
Chúng tôi tăng bộ đếm lên một khi chúng tôi hoàn thành để tránh va chạm.
Điều đó thật dễ dàng. Bây giờ là một tiện ích RSS. Nhiều lĩnh vực hơn, vui hơn!
$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++;
Đây là một điều mới: update_option()
điều này sẽ lưu trữ đối số tiện ích RSS trong một tùy chọn riêng. WordPress sẽ tự động tìm những thứ này sau.
Chúng tôi đã không lưu các đối số tiện ích demo vì chúng tôi thêm phiên bản thứ hai vào thanh bên thứ hai của chúng tôi ngay bây giờ
// 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 );
Càng và lưu tất cả các đối số cho t5_demo_widget
trong một vội vàng. Không cần phải cập nhật cùng một tùy chọn hai lần.
Chà, đủ vật dụng cho ngày hôm nay, chúng ta hãy lưu lại sidebars_widgets
:
update_option( 'sidebars_widgets', $active_widgets );
Bây giờ WordPress sẽ biết rằng có một số widget đã đăng ký và nơi lưu trữ các đối số cho mỗi widget. Một var_export()
trên sidebar_widgets sẽ trông như thế này:
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,
)
Các hoàn chỉnh đang một lần nữa:
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 );
}
Nếu bạn đi đến wp-admin/widgets.php
bây giờ bạn sẽ thấy ba widget được cài đặt sẵn:
Và đó là nó. Sử dụng …
dynamic_sidebar( 'top-widget' );
dynamic_sidebar( 'bottom-widget' );
Để in các widget ra.
Có một trục trặc nhỏ: Bạn phải tải front-end hai lần cho đăng ký ban đầu. Nếu ai đó có thể giúp đỡ ở đây tôi sẽ rất biết ơn.