เมื่อฉันเริ่มคำตอบนี้มันควรจะเป็นเพียงโน้ตเล็ก ๆ ฉันล้มเหลว ขออภัย! อยู่กับฉันมีสิ่งที่ดีซ่อนอยู่ลึกลงไป ...
วิดเจ็ต WordPress ถูกจัดเก็บอย่างไร
'sidebars_widgets'
รายการของเครื่องมือที่ถูกเก็บไว้ในตัวเลือกที่มีชื่อว่า A var_export()
อาจให้อะไรบางอย่างดังต่อไปนี้:
array (
'wp_inactive_widgets' =>
array (
),
'top-widget' =>
array (
),
'bottom-widget' =>
array (
),
'array_version' => 3,
)
ละเว้นและ'wp_inactive_widgets'
'array_version'
เราไม่ต้องสนใจสิ่งเหล่านั้น
ปุ่มอื่น ๆ เป็นตัวระบุสำหรับแถบด้านข้างที่ลงทะเบียน ในกรณีนี้แถบข้างอาจมีการลงทะเบียนด้วยรหัสนี้:
// 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' => ''
)
);
}
โดยค่าเริ่มต้นแถบด้านข้างจะว่างเปล่าหลังจากการลงทะเบียน แน่นอน.
สำหรับคลาสวิดเจ็ตที่ลงทะเบียนแต่ละคลาสจะมีการสร้างตัวเลือกแยกต่างหากซึ่งมีตัวเลือกที่จำเป็นทั้งหมด widget_
ตัวเลือกจะนำหน้าด้วยสตริง เพื่อให้ได้ตัวเลือกสำหรับวิดเจ็ต RSS ที่ใช้งานอยู่เราต้องดู ...
get_option( 'widget_rss' );
เอาต์พุตที่เป็นไปได้:
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 อาร์กิวเมนต์สำหรับหลายอินสแตนซ์ทั้งหมดถูกเก็บไว้ในตัวเลือกนี้เรียงลำดับตามตัวเลข
ในการดูว่าคลาสวิดเจ็ตใดที่ WordPress รู้จักแล้วให้wp-admin/options.php
เลื่อนลงไปจนกว่าคุณจะเห็นสิ่งนี้:
ใช่ข้อมูลต่อเนื่อง ไม่คุณไม่สามารถอ่านที่นี่ได้ ไม่ต้องกังวลคุณไม่ต้องทำ
วิดเจ็ตสาธิต
เพื่อแสดงให้เห็นถึงการทำงานภายในที่ดีกว่าฉันได้เขียนวิดเจ็ตตัวอย่างที่ง่ายมาก:
/**
* 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
);
}
}
หมายเหตุ Constructor: 't5_demo_widget'
คือ$id_base
ตัวระบุสำหรับวิดเจ็ตนี้ widget_t5_demo_widget
ในขณะที่คุณสามารถเห็นในหน้าจอยิงอาร์กิวเมนต์จะถูกเก็บไว้ในตัวเลือก วิดเจ็ตที่กำหนดเองทั้งหมดของคุณจะได้รับการปฏิบัติเช่นนี้ คุณไม่ต้องเดาชื่อ และเนื่องจากคุณได้เขียนวิดเจ็ตของคุณ (อาจ) คุณจะรู้ข้อโต้แย้งทั้งหมดจาก$instance
พารามิเตอร์คลาสของคุณ
พื้นฐานธีม
ก่อนอื่นคุณต้องลงทะเบียนไซด์บาร์และวิดเจ็ตที่กำหนดเอง 'widgets_init'
การดำเนินการที่เหมาะสมสำหรับการนี้เป็นเรื่องง่ายที่จะจำ: ใส่ทุกอย่างลงในคอนเทนเนอร์ - คลาสหรือฟังก์ชัน t5_default_widget_demo()
สำหรับความเรียบง่ายฉันจะใช้ฟังก์ชั่นที่มีชื่อว่า
functions.php
ทั้งหมดของรหัสต่อไปนี้จะเข้าสู่ T5_Demo_Widget
ควรโหลดคลาสแล้ว ฉันแค่ใส่มันลงในไฟล์เดียวกัน ...
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' => ''
)
);
}
จนถึงตอนนี้ง่ายมาก ชุดรูปแบบของเราพร้อมใช้งานแล้ววิดเจ็ตสาธิตเป็นที่รู้จัก ตอนนี้ความสนุก
$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;
}
คุณไม่ต้องการทำลายการตั้งค่าของผู้ใช้จริงๆ หากมีเนื้อหาบางอย่างในแถบด้านข้างโค้ดของคุณไม่ควรใช้ทับ นั่นเป็นเหตุผลที่เราหยุดในกรณีนี้
ตกลงสมมติว่าไซด์บาร์ว่างเปล่า…เราต้องการเคาน์เตอร์:
$counter = 1;
วิดเจ็ตจะมีหมายเลข ตัวเลขเหล่านี้เป็นตัวบ่งชี้ที่สองสำหรับ WordPress
รับอาร์เรย์เพื่อเปลี่ยน:
$active_widgets = get_option( 'sidebars_widgets' );
เราต้องการเคาน์เตอร์ด้วย (เพิ่มเติมในภายหลัง):
$counter = 1;
และนี่คือวิธีที่เราใช้เคาน์เตอร์ชื่อแถบด้านข้างและข้อโต้แย้งวิดเจ็ต (ดีเรามีเพียงหนึ่งอาร์กิวเมนต์: 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++;
สังเกตวิธีการสร้างตัวระบุวิดเจ็ต: id_base
a, a ลบ-
และตัวนับ เนื้อหา$demo_widget_content
ของเครื่องมือจะถูกเก็บไว้ในตัวแปรอื่น นี่คือตัวนับคีย์และอาร์กิวเมนต์ของวิดเจ็ตจะถูกเก็บไว้ในอาร์เรย์
เราเพิ่มตัวนับทีละตัวเมื่อเราทำเพื่อหลีกเลี่ยงการชน
นั่นเป็นเรื่องง่าย ตอนนี้เป็นเครื่องมือ RSS สาขาอื่น ๆ สนุกกว่า!
$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++;
นี่คือสิ่งใหม่: update_option()
สิ่งนี้จะเก็บอาร์กิวเมนต์ของวิดเจ็ต RSS ไว้ในตัวเลือกแยกต่างหาก WordPress จะค้นหาสิ่งเหล่านี้โดยอัตโนมัติในภายหลัง
เราไม่ได้บันทึกข้อโต้แย้งวิดเจ็ตการสาธิตเพราะเราเพิ่มอินสแตนซ์ที่สองในแถบด้านข้างของเราตอนนี้ ...
// 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 );
... และบันทึกข้อโต้แย้งทั้งหมดt5_demo_widget
ในการเร่งด่วนครั้งเดียว ไม่จำเป็นต้องอัพเดทตัวเลือกเดียวกันสองครั้ง
วิดเจ็ตที่เพียงพอสำหรับวันนี้มาบันทึกsidebars_widgets
กันด้วย:
update_option( 'sidebars_widgets', $active_widgets );
ตอนนี้ WordPress จะรู้ว่ามีวิดเจ็ตที่ลงทะเบียนไว้บางส่วนและที่เก็บอาร์กิวเมนต์ของแต่ละวิดเจ็ต A var_export()
บนแถบด้านข้างวิดเจ็ตจะมีลักษณะดังนี้:
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,
)
สมบูรณ์ รหัสอีกครั้ง:
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 );
}
หากคุณไปที่wp-admin/widgets.php
ตอนนี้คุณจะเห็นวิดเจ็ตที่ตั้งค่าไว้ล่วงหน้าสามรายการ:
และนั่นคือมัน ใช้ ...
dynamic_sidebar( 'top-widget' );
dynamic_sidebar( 'bottom-widget' );
…เพื่อพิมพ์วิดเจ็ต
มีความผิดพลาดเล็กน้อย: คุณต้องโหลดส่วนหน้าสองครั้งสำหรับการลงทะเบียนครั้งแรก หากใครสามารถช่วยได้ที่นี่ฉันจะขอบคุณมาก