जब मैंने इस उत्तर को शुरू किया तो यह केवल एक छोटा नोट होना चाहिए। खैर, मैं असफल रहा। माफ़ करना! मेरे साथ रहो, वहाँ एक गुडी छिपी हुई गहरी है ...
वर्डप्रेस विजेट कैसे संग्रहीत किए जाते हैं
विजेट की सूची नामक विकल्प में संग्रहीत है '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 नंबर । कई उदाहरणों के तर्क संख्याओं द्वारा क्रमबद्ध इस एक विकल्प में संग्रहीत हैं।
यह देखने के लिए कि कौन सी विजेट कक्षाएं पहले से ही वर्डप्रेस के लिए जानी जाती हैं 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
);
}
}
नोट निर्माता: '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;
विजेट गिने जाते हैं । ये नंबर वर्डप्रेस के लिए दूसरे पहचानकर्ता हैं।
चलो इसे बदलने के लिए सरणी प्राप्त करते हैं:
$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
ए, माइनस -
और काउंटर। विजेट की सामग्री दूसरे चर में संग्रहीत की जाती है $demo_widget_content
। यहाँ काउंटर कुंजी है और विजेट तर्क एक सरणी में संग्रहीत हैं।
जब हम टकराव से बचने के लिए किए जाते हैं तो हम एक-एक करके काउंटर बढ़ाते हैं।
वह तो आसान था। अब एक आरएसएस विजेट। अधिक क्षेत्र, अधिक मज़ा!
$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 विजेट तर्क को एक अलग विकल्प में संग्रहीत करेगा। वर्डप्रेस इन्हें बाद में अपने आप मिल जाएगा।
हमने डेमो विजेट तर्कों को नहीं सहेजा क्योंकि हम अब अपने दूसरे साइडबार में एक दूसरा उदाहरण जोड़ते हैं ...
// 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 );
अब वर्डप्रेस को पता चल जाएगा कि कुछ पंजीकृत विजेट हैं और जहां प्रत्येक विजेट के लिए तर्क संग्रहीत हैं। 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' );
… विगेट्स को प्रिंट करने के लिए।
एक छोटी सी गड़बड़ है: आपको प्रारंभिक पंजीकरण के लिए दो बार फ्रंट-एंड को लोड करना होगा। अगर कोई यहाँ मदद कर सकता है तो मैं बहुत आभारी रहूँगा।