title: "选择器字典" post_status: publish comment_status: open taxonomy: category: - elementor-developers-docs post_tag: - Editor Controls - Src - Repos


选择器字典

在某些情况下,您可能需要更新特定控件的值。但这样做可能会破坏现有网站,因为这些网站将旧值存储在数据库中。针对这些情况,Elementor 提供了一个字典,帮助开发者在代码使用前将旧值转换为新值。

选择器字典参数

使用 selectors_dictionary 参数将旧值替换为新值。

```php{6-9} $this->add_control( 'text-align', [ 'label' => esc_html__( 'Control Label', 'textdomain' ), 'type' => \Elementor\Controls_Manager::SELECT, 'selectors_dictionary' => [ 'old-value-1' => 'new-value-1', 'old-value-2' => 'new-value-2', ], ] );

## 选择器字典示例

### 使用选择控件的字典

让我们看看如何更新控件值,并将控件从"**物理 CSS 属性**"迁移到"[逻辑 CSS 属性](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Logical_Properties)"。我们希望将 `text-align: right|center|left;` 替换为 `text-align: start|center|end;`。

原始控件在数据库中保存了三个值之一 - `right`、`center` 或 `left`:

```php{8,12,16}
$this->add_control(
    'text-align',
    [
        'label' => esc_html__( 'Alignment', 'textdomain' ),
        'type' => \Elementor\Controls_Manager::CHOOSE,
        'default' => 'center',
        'options' => [
            'left' => [
                'title' => esc_html__( 'Left', 'textdomain' ),
                'icon' => 'eicon-text-align-left',
            ],
            'center' => [
                'title' => esc_html__( 'Center', 'textdomain' ),
                'icon' => 'eicon-text-align-center',
            ],
            'right' => [
                'title' => esc_html__( 'Right', 'textdomain' ),
                'icon' => 'eicon-text-align-right',
            ],
        ],
        'selectors' => [
            '{{WRAPPER}} .some-class' => 'text-align: {{VALUE}};',
        ],
    ]
);

现在,我们希望将这些值替换为 startcenterend。但是,为了向后兼容,我们必须提供一个解决方案,考虑到数据库中保存的旧值。

我们可以使用 selectors_dictionary 来解决这个问题:

```php{8-11,16-19,21-24} $this->add_control( 'text-align', [ 'label' => esc_html__( 'Alignment', 'textdomain' ), 'type' => \Elementor\Controls_Manager::CHOOSE, 'default' => 'center', 'options' => [ 'end' => [ 'title' => esc_html__( 'End', 'textdomain' ), 'icon' => 'eicon-text-align-' . ( is_rtl() ? 'right' : 'left' ), ], 'center' => [ 'title' => esc_html__( 'Center', 'textdomain' ), 'icon' => 'eicon-text-align-center', ], 'start' => [ 'title' => esc_html__( 'Start', 'textdomain' ), 'icon' => 'eicon-text-align-' . ( is_rtl() ? 'left' : 'right' ), ], ], 'selectors_dictionary' => [ 'left' => is_rtl() ? 'end' : 'start', 'right' => is_rtl() ? 'start' : 'end', ], 'selectors' => [ '{{WRAPPER}} .some-class' => 'text-align: {{VALUE}};', ], ] );

### 带选择控件的字典

让我们看看如何将 `selectors_dictionary` 与选择控件结合使用。在这个案例中,一个流行的插件曾使用前缀类来保存 `border-style` 值。该插件为每种边框样式类型定义了 5 个 CSS 类:

```php
$this->add_control(
    'border_style',
    [
        'label' => esc_html__( 'Border Style', 'textdomain' ),
        'type' => \Elementor\Controls_Manager::SELECT,
        'options' => [
            '' => esc_html__( 'Default', 'textdomain' ),
            '1' => esc_html__( 'None', 'textdomain' ),
            '2' => esc_html__( 'Solid', 'textdomain' ),
            '3' => esc_html__( 'Double', 'textdomain' ),
            '4' => esc_html__( 'Dotted', 'textdomain' ),
            '5' => esc_html__( 'Dashed', 'textdomain' ),
        ],
        'prefix_class' => 'border-style-',
    ]
);

为了解决这个问题,并移除所有不必要的 CSS 类,我们可以按如下方式使用 selectors_dictionary

php{14-20} $this->add_control( 'border_style', [ 'label' => esc_html__( 'Border Style', 'textdomain' ), 'type' => \Elementor\Controls_Manager::SELECT, 'options' => [ '' => esc_html__( 'Default', 'textdomain' ), '1' => esc_html__( 'None', 'textdomain' ), '2' => esc_html__( 'Solid', 'textdomain' ), '3' => esc_html__( 'Double', 'textdomain' ), '4' => esc_html__( 'Dotted', 'textdomain' ), '5' => esc_html__( 'Dashed', 'textdomain' ), ], 'selectors_dictionary' => [ '1' => 'none', '2' => 'solid', '3' => 'double', '4' => 'dotted', '5' => 'dashed', ], 'selectors' => [ '{{WRAPPER}}' => 'border-style: {{VALUE}};', ], ] );

在这种情况下,用 selectors 替换 prefix_class 效率更高。此外,我们不会破坏向后兼容性。selectors_dictionary 有助于将旧值转换为新值。

注意事项

必须牢记:selectors_dictionary 参数仅适用于返回简单 string 值的控件。它不适用于多值控件、单位控件、分组控件或中继器,这些控件都返回 array 值。