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

时间:2018-05-22 22:22:10

标签: wordpress siteorigin

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

由于此字段在很多地方使用,如果我可以直接覆盖字段类型,则会自动在每个地方使用。

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

任何人都可以指点我某些动作或过滤器,这样,我可以取消注册并重新注册相同类型color吗?或者,如果有其他可能的解决方法吗?

更新

我的问题重点是 Siteorigin Widgets Bundle Plugin

我不想只覆盖任何样式变量,而是想覆盖现有字段。经过一些研究,我找到了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(),而后者永远不会应用过滤器siteorigin_widgets_form_optionssiteorigin_widgets_form_options_<id_base>

因此,使用这种方法,我修改表单字段的机会变为zero

我基本上需要的是例如。现有字段color,我有另一个自定义字段adv-color。现在,挑战是将color字段的所有实例覆盖为adv-color,从而覆盖该字段的每个实例。但是,它仍然是一个希望。

如果我的方法有问题,或者有其他方法可以解决这个问题,请告诉我。非常期待实例。

2 个答案:

答案 0 :(得分:3)

(注意:此答案适用于question as originally asked。此问题在发布此答案后进行了修改,因此下面的答案似乎不是对其中问题的正确答案。现状。)

SiteOrigin Widget Bundle附带了各种各样的小部件。

每个小部件使用LESS变量编译它自己的css。

由于您可以为每个窗口小部件显式更改颜色,因此这些变量存储在数据库中,并为每个窗口小部件单独检索,然后编译为特定于窗口小部件的CSS文件。这发生在&#34; Save&#34;小部件,CSS缓存7天。

为了覆盖这些小部件的变量,您可以选择一些不同的过滤器(参考siteorigin-widget.class.php插件文件,get_instance_css方法,从第816行开始查看代码这样做)。仅供参考,你想要达到这个水平,因为这是一个&#34;基地&#34;所有单个小部件的类。

过滤1:

$vars = apply_filters( 'siteorigin_widgets_less_variables_' . $this->id_base, $this->get_less_variables( $instance ), $instance, $this );

这将是一个理想的地方,因为$vars是所有已定义颜色的数组,您可以轻松覆盖您喜欢的任何颜色。 然而,问题是这个过滤器难以利用,因为它会在窗口小部件的id_base中进行烘焙,从而产生像siteorigin_widgets_less_variables_sow-accordion这样的过滤器标记 - 但是,你理论上可以建立一个很长的过滤器列表,每个小部件一个,都通过相同的功能。

过滤器2:
在那之后不久有一个过滤器,但是LESS变量已经被写成&#34;&#34;进入LESS:

$less = apply_filters( 'siteorigin_widgets_styles', $less, $this->widget_class, $instance );

这是需要使用的过滤器,但您需要知道要替换的LESS变量名称。该列表(至少其中一些)是:

$vars = ‌array (
  'heading_background_color'       => '',
  'heading_background_hover_color' => '',
  'title_color'                    => '',
  'title_hover_color'              => '',
  'heading_border_color'           => '',
  'heading_border_hover_color'     => '',
  'heading_border_width'           => '',
  'has_heading_border_width'       => '',
  'panels_background_color'        => '',
  'panels_font_color'              => '',
  'panels_border_color'            => '',
  'panels_border_width'            => '',
  'has_panels_border_width'        => '',
  'panels_margin_bottom'           => '',
}

构建解决方案:
有了这些信息,我们可以应用如下过滤器:

function my_siteorigin_override_less( $less ) {
    // you'll need to load your override colors here.  that is outside the scope of this question / answer
    $my_colors = array(
      'heading_background_color'       => '#fff',
      'heading_background_hover_color' => '#ff0',
      'title_color'                    => '#000'
      // any other colors you want to include / override....
    );

    foreach( $my_colors as $name => $value ) {
        // Ignore empty string, false and null values (but keep '0')
        if( ! empty( $value ) ) {
            $less = preg_replace('/\@'.preg_quote($name).' *\:.*?;/', '@'.$name.': '.$value.';', $less);
        }
    }

    return $less;
}

add_filter( 'siteorigin_widgets_styles', 'my_siteorigin_override_less' );

上述代码经过测试,并证明可行。

备注:
SiteOrigin&#34;缓存&#34;它建立的CSS为7天。这意味着如果您已经设置了小部件,并且更改了默认颜色,则在以某种方式清除缓存之前,不会反映更改。

SiteOrigin代码中有一个实用程序方法,您可以使用它来清除&#34;清除&#34;需要时缓存。我建议您随时执行以下操作&#34;默认&#34;颜色被保存/更新:

if ( is_callable( 'SiteOrigin_Widget', 'clear_file_cache' ) ) {
    // pass TRUE to force delete
    SiteOrigin_Widget::clear_file_cache( TRUE );
}

答案 1 :(得分:3)

  

任何人都可以指出我的某些动作或过滤器,这样我就可以   取消注册并重新注册相同类型jeff@e-tech:~/exam/prime$ ./basprime.sh 2 10 #!/bin/bash value=$1 value2=$2 factor {"$value".."$value2"} | awk 'NF==2{print $2}' ?或者如果有的话   解决方法可能吗?

我没有找到取消注册并重新注册color字段类型(或生成器)的方法。

但是,如果您想自定义字段 UI (甚至完全改变其外观感觉),您可以创建扩展的PHP color其中一个class es:classSiteOrigin_Widget_Field_BaseSiteOrigin_Widget_Field_Text_Input_Base。请参阅下面的简单示例:

SiteOrigin_Widget_Field_Color

然后,您应该在WordPress中的// 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

然后,要强制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_Color,因为上述过滤条件仅允许您过滤class名称前缀

但是在上面的示例回调中,自定义class将被&#34;看到&#34;首先是SiteOrigin Widgets Bundle插件;因此,My_SiteOrigin_Widget_Field_Color字段会使用自定义color代替默认字段{ - {1}}。

有关详细信息,请参阅SiteOrigin_Widget_Field_Factory::get_class_prefixes()和整个class源代码。并SiteOrigin_Widget::form()

另见:

<强>更新

  

但看起来SiteOrigin_Widget_Field_Color永远不会是空的,所以,方法   永远不会调用SiteOrigin_Widget_Field_Factory,而永远不会调用$this->form_options   过滤器$this->form_options()和   siteorigin_widgets_form_options

     

因此,我修改表单字段的机会变为siteorigin_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),您仍然需要创建相应的PHP adv_color和然后通过class挂钩添加class名称​​前缀