如何覆盖Siteorigin中的现有字段?

苏坎塔·保罗(Sukanta Paul)

我想为现有字段类型color(Siteorigin小部件捆绑包中的默认值)创建一个自定义字段基本上,我需要为color字段类型创建自己的UI和后端逻辑

由于此字段在很多地方都使用过,因此如果我可以直接覆盖字段类型,它将自动在每个地方工作。

我搜索了很多次,还浏览了小部件捆绑包和SO本身的源代码,但是找不到我需要的东西,即使我尝试0优先(最高)加载我的fields文件夹也没有用。它仍然显示默认的颜色字段类型。

有人可以指出一些操作或过滤器,以便我可以注销并重新注册相同类型的color吗?或是否有其他解决方法?


更新

我的问题重点是Siteorigin Widgets Bundle插件

我不想只覆盖任何样式变量,而是想覆盖现有字段。经过一些研究,我发现了2个可以用来覆盖现有字段的过滤器:

// Give other plugins a way to modify this form.
$form_options = apply_filters( 'siteorigin_widgets_form_options', $form_options, $this );
$form_options = apply_filters( 'siteorigin_widgets_form_options_' . $this->id_base, $form_options, $this );

这两个过滤器form_options()在类中的方法被调用,SiteOrigin_Widget但该方法的调用方式如下:

public function form( $instance, $form_type = 'widget' ) {

    if( $form_type == 'widget' ) {
        if( empty( $this->form_options ) ) {
            $this->form_options = $this->form_options();
        }
        $form_options = $this->form_options;
    }

...
...

}

但是它看起来$this->form_options永远不会为空,因此$this->form_options()永远不会调用method ,从而再也不会应用过滤器siteorigin_widgets_form_optionssiteorigin_widgets_form_options_<id_base>

因此,zero使用此方法可以修改表单字段

我基本上需要的是例如。有一个现有的领域color,我还有一个自定义的领域adv-color现在,挑战在于将color字段的所有实例覆盖adv-color,因此字段的每个实例都被覆盖。但是,这仍然是一个希望。

如果我的方法有误或有其他解决方法,请告诉我。实例是非常期望的。

用户名

有人可以指出一些操作或过滤器,以便我可以注销并重新注册相同类型的color吗?或是否有其他解决方法?

我看不到注销和重新注册color字段类型(或生成器)的方法。

但是,如果您想自定义字段的用户界面(或甚至完全改变它的外观N”的感觉),你可以创建一个PHPclass延伸这些之一classES: SiteOrigin_Widget_Field_BaseSiteOrigin_Widget_Field_Text_Input_BaseSiteOrigin_Widget_Field_Color请参见下面的简单示例:

// File: class-my-siteorigin-widget-field-color.php
class My_SiteOrigin_Widget_Field_Color extends SiteOrigin_Widget_Field_Color {

    public function enqueue_scripts() {
        // Enqueues custom CSS and/or JS files, if any.

        wp_enqueue_script( 'my-script', 'path/to/file.js', [ 'jquery' ], '20180601' );
        wp_enqueue_style( 'my-custom-stylesheet', 'path/to/file.css', [], '20180601' );
    }

    // Here you can modify the field's UI to your liking. Even a totally new UI.
    protected function render_field( $value, $instance ) {
        ?>
        <b>Text before</b>
        <input type="<?php echo esc_attr( $this->input_type ) ?>"
               name="<?php echo esc_attr( $this->element_name ) ?>"
               id="<?php echo esc_attr( $this->element_id ) ?>"
                 value="<?php echo esc_attr( $value ) ?>"
                 <?php $this->render_data_attributes( $this->get_input_data_attributes() ) ?>
                 <?php $this->render_CSS_classes( $this->get_input_classes() ) ?>
            <?php if ( ! empty( $this->placeholder ) ) echo 'placeholder="' . esc_attr( $this->placeholder ) . '"' ?>
            <?php if( ! empty( $this->readonly ) ) echo 'readonly' ?> />
        <i>Text after</i>
        <?php
    }

    // See `SiteOrigin_Widget_Field_Base` for all the properties and methods you
    // can extend. See also `SiteOrigin_Widget_Field_Text_Input_Base`, which is
    // being extended by `SiteOrigin_Widget_Field_Color`.
}

然后,您应该加载class的过程中/init在WordPress挂钩。例:

add_action( 'init', function(){
    require_once __DIR__ . '/includes/class-my-siteorigin-widget-field-color.php';
} );

然后,要强制color字段使用自定义class(上面),请下面添加class名称前缀$prefixes array

add_filter( 'siteorigin_widgets_field_class_prefixes', function( $prefixes ){
    return array_merge( [ 'My_SiteOrigin_Widget_Field_' ], $prefixes );
} );

不幸的是,您不能列表中unset删除或删除列表,因为上述过滤器仅允许您过滤名称前缀SiteOrigin_Widget_Field_Colorclassclass

但是在上面的示例回调中,自定义My_SiteOrigin_Widget_Field_Color将首先由SiteOrigin Widgets Bundle插件“查看”;因此,color字段将使用自定义class代替默认自定义(即)SiteOrigin_Widget_Field_Color

有关更多信息,请参见SiteOrigin_Widget_Field_Factory::get_class_prefixes()和整个SiteOrigin_Widget_Field_Factory源代码。SiteOrigin_Widget::form()

也可以看看:

更新

但是它看起来$this->form_options永远不会为空,因此$this->form_options()永远不会调用method ,从而再也不会应用过滤器siteorigin_widgets_form_optionssiteorigin_widgets_form_options_<id_base>

因此,zero使用此方法可以修改表单字段

以下示例可能会为您提供帮助:(或更确切地说,对我来说效果很好)

// Extends the fields for the Button widget.
// @see SiteOrigin_Widget_Button_Widget::get_widget_form()
// @see SiteOrigin_Widget::form_options()
add_filter( 'siteorigin_widgets_form_options_sow-button', function( $form_options, $widget ){
    if ( isset( $form_options['button_icon'] ) ) {
        // `icon_color` is an existing/built-in field for the Button widget. So
        // in this example, we change the `label` from 'Icon color' to 'Icon
        // default color'.
        $form_options['button_icon']['fields']['icon_color']['label'] = 'Icon default color';

        // Or you could completely override the field:
        /*
        $form_options['button_icon']['fields']['icon_color'] = [
            'type'  => 'custom_type_here',
            'label' => 'Icon color',
        ];
        */

        // And here, we add a new field: A color for the button's `hover` state.
        $form_options['button_icon']['fields']['icon_hover_color'] = [
            'type'  => 'color',
            'label' => 'Icon hover color',
        ];
    }

    return $form_options;
}, 10, 2 );

// Callback to handle the `icon_hover_color`.
add_action( 'siteorigin_widgets_after_widget_sow-button', function( $instance, $widget ){
    if ( isset( $instance['button_icon'], $instance['button_icon']['icon_hover_color'] ) ) {
        $selector = $widget->is_preview( $instance ) ?
            '.so-widget-sow-button' : '#' . $widget->id;
        ?>
            <style>
                <?= $selector ?> a:hover .sow-icon-fontawesome {
                    color: <?= $instance['button_icon']['icon_hover_color'] ?> !important;
                }
            </style>
        <?php
    }
}, 10, 2 );

但是,即使您将color字段设置为其他type(例如adv_color),您仍然需要创建适当的PHP class,然后通过挂钩添加class名称前缀siteorigin_widgets_field_class_prefixes

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章