首页 > 解决方案 > 如何覆盖 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实例,因此该字段的每个实例都被覆盖。但是,这仍然是一个希望。

请让我知道我的方法是否错误或是否有其他方法可以解决此问题。非常期待示例。

标签: wordpresssiteorigin

解决方案


(注意:此答案是针对最初提出的问题。在发布此答案后,该问题已被修改,因此下面的答案在当前状态下可能看起来不是该问题的正确答案。)

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

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

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

为了覆盖这些小部件的变量,您有几个不同的过滤器可供选择(请参阅siteorigin-widget.class.php插件文件、get_instance_css方法,从第 816 行开始查看执行此操作的代码)。仅供参考,你会想要在这个级别上做,因为这是所有单个小部件的“基础”类。

过滤器 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 变量已经“写入”到 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 “缓存”它构建的 CSS 7 天。这意味着如果您已经设置了小部件,并且您更改了默认颜色,那么在以某种方式清除缓存之前,这些更改将不会反映。

SiteOrigin 代码中有一个实用方法,您可以在需要时使用它来“清除”缓存。我建议您在保存/更新“默认”颜色时执行以下操作:

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

推荐阅读