如何创建一个只允许通过Wordpress界面添加一个小部件实例的小部件?
小部件的默认行为允许添加多个实例。
我使用的示例代码来自http://codex.wordpress.org/Widgets_API
我看到了similar question 答案是使用旧的小部件代码,但如果可能的话,我想继续使用更现代的代码。
我见过一些插件,比如Twitter for Wordpress 可以精确控制允许的实例数。
谢谢,马特
如何创建一个只允许通过Wordpress界面添加一个小部件实例的小部件?
小部件的默认行为允许添加多个实例。
我使用的示例代码来自http://codex.wordpress.org/Widgets_API
我看到了similar question 答案是使用旧的小部件代码,但如果可能的话,我想继续使用更现代的代码。
我见过一些插件,比如Twitter for Wordpress 可以精确控制允许的实例数。
谢谢,马特
我知道这是一个非常古老的问题,但8年后,除了这个悬而未决的问题(以及其他一些模糊的答案)之外,寻找解决方案并没有产生多少结果。我在这个网站上找不到任何对我有用的东西,所以如果其他人来到这个页面上寻找一种方法,将一个小部件区域限制为特定小部件的单一使用,我在下面提供了对我有用的代码。此解决方案基于article 由Tom McFarlin发布。它利用了jQuery的sortable 函数在每次尝试更新时根据标准检查小部件。我自己做了一些调整,以更好地满足我的需要。
请注意:您需要更换widget_area_id
使用特定小部件区域的您自己的ID以及widget_id
使用实际小部件的您自己的ID。将此代码放入admin.js
文件并在后端将其排队。
jQuery(document).ready(function($){
$(\'#widget_area_id\').sortable({
update: function( evt, ui ) {
// Check each widget in the widget area to verify that it matches the ID of the widget we want there
$(this).children(\'.widget\').each(function(){
var value = $(this).find(\'.widget-inside\').children(\'form\').children(\'.id_base\').val();
if( value !== \'widget_id\' ){
$(this).remove();
}
});
// And if there are more than one widget, remove all but one
if ( 2 !== $(this).children().length ) {
$(this).children(\':last\').remove();
}
}
});
});
static
未在第一个实例上设置的变量。如果小部件第一次被调用,我们将其设置为true。在第二次运行时,我们中止运行return
没有实际为用户提供任何服务。class My_Widget extends WP_Widget {
// You static instance switch
static $instance;
function My_Widget() {
// We set the static class var to true on the first run
if ( ! $this->instance ) {
$this->instance = true;
}
// abort silently for the second instance of the widget
else {
return;
}
// widget actual processes
}
function form($instance) {
// outputs the options form on admin
}
function update($new_instance, $old_instance) {
// processes widget options to be saved
}
function widget($args, $instance) {
// outputs the content of the widget
}
}
register_widget(\'My_Widget\');
代码取自相关Widgets API Codex article处理全局小部件数组的另一个选项可能是检查包含所有已注册小部件的全局数组:
function wpse32103_show_widgets()
{
$dump = \'<pre>\';
$dump .= var_export( $GLOBALS[\'wp_registered_widgets\'], false );
$dump .= \'</pre>\';
return print $dump;
}
add_action( \'shutdown\', \'wpse32103_show_widgets\' );
关联数组的输出包含名称作为键,后面附加-2
(数量增加)。您可以在init
或admin_init
如果您找到了第二个实例,则挂起并简单地取消设置。可能如下所示:function wpse32103_show_widgets()
{
global $wp_registered_widgets;
// Go and search for your widgets name with the above written function
$target = \'FILL IN YOUR FOUND ARRAY KEY HERE. Without -2 (or any other appending number)\';
// Container for your targeted widget(s)
$unsets = array();
foreach ( array_keys( $wp_registered_widgets ) as $widget )
{
// remove dashes
$widget_check = str_replace( \'-\', \'\', $widget );
// remove numbers
$widget_check = preg_replace( \'/[^0-9]/\', \'\', $widget );
// if we match, do it in our container
if ( $widget_check === $target )
$unsets[] = $widget;
}
// less than one element in the container: abort
if ( ! count ( $unsets ) > 1 )
return;
// preserve first element
array_shift( array_values( $unsets ) );
// unset all left instances from the global array
foreach ( $unsets as $unset )
unset ( $wp_registered_widgets[ $unset ] );
return;
}
add_action( \'init\', \'wpse32103_show_widgets\' );
编辑:Doh,刚刚看到您不想使用旧代码。哦,好吧,我把它留下,以防万一它对别人有帮助。
WP在中添加了多个小部件2.8. 所以我找到了一个tutorial 这涵盖了如何在WP 2.7中制作小部件。代码如下:
add_action("widgets_init", array(\'Widget_name\', \'register\'));
register_activation_hook( __FILE__, array(\'Widget_name\', \'activate\'));
register_deactivation_hook( __FILE__, array(\'Widget_name\', \'deactivate\'));
class Widget_name {
function activate(){
$data = array( \'option1\' => \'Default value\' ,\'option2\' => 55);
if ( ! get_option(\'widget_name\')){
add_option(\'widget_name\' , $data);
} else {
update_option(\'widget_name\' , $data);
}
}
function deactivate(){
delete_option(\'widget_name\');
}
function control(){
$data = get_option(\'widget_name\');
?>
<p><label>Option 1<input name="widget_name_option1"
type="text" value="<?php echo $data[\'option1\']; ?>" /></label></p>
<p><label>Option 2<input name="widget_name_option2"
type="text" value="<?php echo $data[\'option2\']; ?>" /></label></p>
<?php
if (isset($_POST[\'widget_name_option1\'])){
$data[\'option1\'] = attribute_escape($_POST[\'widget_name_option1\']);
$data[\'option2\'] = attribute_escape($_POST[\'widget_name_option2\']);
update_option(\'widget_name\', $data);
}
}
function widget($args){
echo $args[\'before_widget\'];
echo $args[\'before_title\'] . \'Your widget title\' . $args[\'after_title\'];
echo \'I am your widget\';
echo $args[\'after_widget\'];
}
function register(){
wp_register_sidebar_widget( \'my_widget_id\', \'Widget name\', array(\'Widget_name\', \'widget\'));
wp_register_widget_control( \'my_widget_id\', \'Widget name\', array(\'Widget_name\', \'control\'));
}
}
我把电话换成了register_sidebar_widget
和register_widget_control
具有wp_register_sidebar_widget
和wp_register_widget_control
分别修复有关使用不推荐使用的函数的警告。否则,这是我链接到的教程的直接复制/粘贴。下面是一个从this answer:
限制:仅适用于自定义程序,而不适用于小部件管理页面。你没有。这太难了,不值得。这就是JS编辑器的工作原理。
BUT: 创建一个没有设置的小部件,并允许在其他页面上进行设置。像这样:
// In your Widget use this form() method
public function form($instance){
$settings_url = admin_url(\'options-general.php?page=SettingsPage\');
echo \'<p>\';
echo \'To setup this <strong>Widget</strong> go to:<br />\';
echo \'<a href="\', $settings_url, \'" target="_blank">\';
echo \'<strong>Settings » Settings Page</strong>\';
echo \'</a>\';
echo \'</p>\';
return \'noform\';
}
使用add\\u options\\u页面创建SettingsPage 第页,共页Widget management. 和使用get_option() 检索的设置Widget Output.当做
PS: <如果你需要一个完整的例子,请告诉我
本帖版次如下:wordpress json custom taxonomy problem如何编写使用自定义分类法获取类别的方法,类似于方法:get_category_index 核心json api控制器中?场景:我有一个名为-books的分类法,它有四个类别,我需要通过get\\u taxonomy\\u index输出这些类别。像这样的http://example.com//api/get_taxonomy_index/?dev=1