どのようにしてウィジェットの単一のインスタンスのみをWordpressインターフェースを通して追加することを許可するウィジェットを作成するのですか?
ウィジェットのデフォルト動作では、複数のインスタンスを追加できます。
http://codex.wordpress.org/Widgets_API のサンプルコードを使用しています。
私は 同様の質問 を見てきましたが、その答えは古いウィジェットコードを使うことでしたが、可能であればもっと新しいコードを使い続けたいと思います。
Twitter for Wordpress のように、許可されるインスタンス数を正確に制御できるプラグインを見ました。
ありがとう、
マット
次の例では、最初のインスタンスに設定されていないstatic
変数を見つけることができます。ウィジェットが1回目に呼び出された場合は、trueに設定します。 2回目の実行では、実際にはユーザーに何も提供せずに中止し、単に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の記事 からのコード
他の選択肢は、登録されているすべてのウィジェットを含むグローバル配列をチェックすることです。
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
で追加されています(nrはインクリメントされます)。 init
またはadmin_init
フックで配列を検索し、2番目のインスタンスが見つかった場合は単に設定を解除することができます。おそらく以下のようになります。
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 にマルチウィジェットを追加しました。そこで、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
に置き換えました。そうでなければ、これは私がリンクしたチュートリアルからのまっすぐなコピー/貼り付けです。
これは、この答えから派生した使い捨てウィジェットの概念実証です。
https://github.com/glueckpress/single-use-widget
制限事項:カスタマイザーでのみ機能し、ウィジェット管理ページでは機能しません。