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_options
和siteorigin_widgets_form_options_<id_base>
因此,我修改表单字段的机会就变成zero
了这种方法。
我基本上需要的是例如。有一个现有字段color
,我有另一个自定义字段adv-color
。现在,挑战是覆盖所有color
字段adv-color
实例,因此该字段的每个实例都被覆盖。但是,这仍然是一个希望。
请让我知道我的方法是否错误或是否有其他方法可以解决此问题。非常期待示例。
解决方案
(注意:此答案是针对最初提出的问题。在发布此答案后,该问题已被修改,因此下面的答案在当前状态下可能看起来不是该问题的正确答案。)
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 );
}
推荐阅读
- nmap - 无需使用 nmap 即可检索远程操作系统信息的 Python 脚本
- haskell - `undefined` 的类型签名在 Haskell 中是什么意思?
- python-3.x - SourceFileLoader 相对导入失败
- spring - Rest Controller 如何同时处理单个实例应用程序的多个请求?
- angular - 如何在不调用 ngOnInit 的情况下更改角度 ui-router 上的路由?
- css - 单击引导按钮后删除颜色变化
- swift - 所有出口都是正确的,这个类不符合键 listTitle 的键值编码
- css - 在分页媒体中运行页脚“元素(页脚)”仅出现在最后一页
- php - 是否需要在车页中添加取件日期和归还日期?
- elasticsearch - 弹性搜索子字符串匹配