10

Wordpress での私の目標は、サイドバーに配置したすべてのウィジェットにカスタム クラスを提供できるようにすることです。できれば、各ウィジェットのウィジェット設定にこのクラスを追加したいと思います。サードパーティのウィジェットも。

クラス名は既にregister_sidebar関数 (%2$s)に渡されているため、クラス名を変更することを考えていました。

<?php
register_sidebar(array('before_widget' => '<aside id="%1$s" class="widget %2$s blue">'));
?>

もちろん、WP のコア コードやサードパーティのプラグインを変更するべきではありません。これは、ウィジェット構成プロセスにフックするプラグインを作成する必要があることを意味します。

アクション「in_widget_form」にフックすることで、すべてのウィジェットフォームを変更できることがすでにわかりました。

<?php
add_action('in_widget_form', 'teaserWidgetAddToForm');

function teaserWidgetAddToForm($widget_instance) {
  ?>
  <label for="<?php echo $widget_instance->get_field_id('teaser-classname'); ?>">Custom classname(s):</label>
  <input type="text" id="<?php echo $widget_instance->get_field_id('teaser-classname'); ?>" name="<?php echo $widget_instance->get_field_name('teaser-classname'); ?>">
  <?php
}
?>

このデータは Widget スーパークラスによって保存される必要がありますが、このデータを取得するにはどうすればよいですか (そのため、後でウィジェット設定を開くと、以前に入力した内容が表示されます)

そして、この保存されたデータはウィジェット インスタンスに配置する必要があります。これはどのように行われますか? 次のようなものを使用して推測します:

<?php
$wp_registered_widgets[<widget_id>]['callback'][0]['widget_options']['classname'] = <chosen_class>;
?>

だから基本的に私は2つの質問があります:

  • この問題に対処するために適切な方法を使用していますか (個々のウィジェットのスタイリング)
  • その場合、Wordpress またはサードパーティのプラグインのソース コードを変更せずに、ウィジェット インスタンスを変更して追加の設定を保存および取得するにはどうすればよいですか。
4

1 に答える 1

11
  1. デフォルトでは、各ウィジェットインスタンスには、スタイル設定に使用できる一意のIDがあります。

  2. アクションで追加されたフィールドのデータを保存するには、フィルターin_widget_formも必要です。widget_update_callback

    function my_widget_update_callback($instance, $new_instance) {
        $instance['my_classnames'] = $new_instance['my_classnames'];
        return $instance;
    }
    

    保存した値をフォームに表示するには、最初にインスタンス設定を取得する必要があります。

    function my_in_widget_form($instance) {
        $settings = $instance->get_settings();
        …
    

    widget_display_callback最後に、カスタムクラスを追加する最も簡単な方法は、ウィジェットが表示される前に実行されるフィルターを使用することだと思います。このフィルターからインスタンスを返すことしかできず、インスタンスはウィジェットのCSSクラスを制御しないため、ウィジェットを自分で表示する必要があります。

    function my_widget_display_callback($instance, $widget, $args) {
        if (!isset($instance['my_classnames'])) {
            return $instance;
        }
    
        $widget_classname = $widget->widget_options['classname'];
        $my_classnames = $instance['my_classnames'];
    
        $args['before_widget'] = str_replace($widget_classname, "{$widget_classname} {$my_classnames}", $args['before_widget']);
    
        $widget->widget($args, $instance);
    
        return false;
    }
    

ウィジェットに関連する利用可能なフックの詳細については、次の記事を参照してください:http ://shibashake.com/wordpress-theme/wordpress-widget-system

于 2012-09-10T15:53:35.410 に答える