我想为现有字段类型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_options
和siteorigin_widgets_form_options_<id_base>
因此,zero
使用此方法可以修改表单字段。
我基本上需要的是例如。有一个现有的领域color
,我还有一个自定义的领域adv-color
。现在,挑战在于将color
字段的所有实例覆盖到adv-color
,因此字段的每个实例都被覆盖。但是,这仍然是一个希望。
如果我的方法有误或有其他解决方法,请告诉我。实例是非常期望的。
有人可以指出一些操作或过滤器,以便我可以注销并重新注册相同类型的
color
吗?或是否有其他解决方法?
我看不到注销和重新注册color
字段类型(或生成器)的方法。
但是,如果您想自定义字段的用户界面(或甚至完全改变它的外观N”的感觉),你可以创建一个PHPclass
延伸这些之一class
ES: SiteOrigin_Widget_Field_Base
,SiteOrigin_Widget_Field_Text_Input_Base
或SiteOrigin_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_Color
class
class
但是在上面的示例回调中,自定义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_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
(例如adv_color
),您仍然需要创建适当的PHP class
,然后通过挂钩添加class
名称前缀siteorigin_widgets_field_class_prefixes
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句