Как расширить WP_Customize_Control

27

Я ищу способ добавить новый вид элемента управления на панель предварительного просмотра в реальном времени . Я видел, как добавить новые разделы на панель с помощью add_action( 'customize_register'...

Элемент управления, который я хочу реализовать, представляет собой другой вид палитры цветов. В предыдущем посте мы увидели, как расширить базовые классы для добавления виджетов, но здесь мне не хватает ловушки, которая позволит мне перенести мой объект в область видимости - WP_Customize_Palette_Control. В

Вы можете увидеть начало кода здесь . Этот код находится в functions.phpфайле моей темы.

Спасибо за любую помощь. обкрадывать

Только что обновил код. Теперь я должен require_onceпринести на занятия. Так что теперь у меня нет ошибок PHP, но мой новый контрольный HTML не появляется.

<?php

require_once( ABSPATH . WPINC . '/class-wp-customize-setting.php' );
require_once( ABSPATH . WPINC . '/class-wp-customize-section.php' );
require_once( ABSPATH . WPINC . '/class-wp-customize-control.php' );

class WP_Customize_Palette_Control extends WP_Customize_Image_Control {  
        public $type    = 'palette';
        public $removed = '';
        public $context;

        public function enqueue() {
                //wp_enqueue_script( 'wp-plupload' );
        }

        public function to_json() {
                parent::to_json();

                $this->json['removed'] = $this->removed;

                if ( $this->context )
                        $this->json['context'] = $this->context;
        }

        public function render_content() {
                ?>
                <label>
                        <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
                        <div>
                                <a href="#" class="button-secondary upload"><?php _e( 'Upload' ); ?></a>
                                <a href="#" class="remove"><?php _e( 'Remove' ); ?></a>
                        </div>
                </label>
                <?php
        }
}

//new WP_Customize_Palette_Control();


//add_action('customize_controls_init', 'WP_Customize_Palette_Control');

// add an option to the customize panel

function sci_customize_controls_init($wp_customize) {
    $wp_customize->add_section( 'themename_color_scheme', array(
        'title'          => __( 'Color Scheme', 'themename' ),
        'priority'       => 35,
    ) );

    $wp_customize->add_setting( 'themename_theme_options[color_scheme]', array(
    'default'        => 'some-default-value',
    'type'           => 'option',
    'capability'     => 'edit_theme_options',
) );


$wp_customize->add_control( 'themename_color_scheme', array(
    'label'      => __( 'Color Scheme', 'themename' ),
    'section'    => 'themename_color_scheme',
    'settings'   => 'themename_theme_options[color_scheme]',
    'type'       => 'palette',
    'choices'    => array(
        'value1' => 'Choice 1',
        'value2' => 'Choice 2',
        'value3' => 'Choice 3',
        ),
) );

}

add_action( 'customize_register', 'sci_customize_controls_init' );
обкрадывать
источник
3
Незначительный момент, но если ваш контроль не входит в ядро ​​WordPress, не используйте префикс WP_. Используйте свой собственный плагин / название темы в качестве префикса для имени класса.
Отто

Ответы:

14

Пример и класс для использования

Вы можете видеть на моей текущей теме, как возможно использовать это. Также вы можете использовать класс. Смотрите этот класс на Github и проверьте, functions.phpчтобы включить это.

Start & init

Вы можете зарегистрировать свои пользовательские настройки для настройщика темы через customize_register хук:

add_action( 'customize_register', 'themedemo_customize' );
function themedemo_customize($wp_customize) {

    $wp_customize->add_section( 'themedemo_demo_settings', array(
        'title'          => 'Demonstration Stuff',
        'priority'       => 35,
    ) );

    $wp_customize->add_setting( 'some_setting', array(
        'default'        => 'default_value',
    ) );

    $wp_customize->add_control( 'some_setting', array(
        'label'   => 'Text Setting',
        'section' => 'themedemo_demo_settings',
        'type'    => 'text',
    ) );

    $wp_customize->add_setting( 'some_other_setting', array(
        'default'        => '#000000',
    ) );

    $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'some_other_setting', array(
        'label'   => 'Color Setting',
        'section' => 'themedemo_demo_settings',
        'settings'   => 'some_other_setting',
    ) ) );

}

Использование в теме:

Используйте его, как в примере ниже ↓:

echo 'some_setting => ' .get_theme_mod( 'some_setting', 'default_value' )."\n";
echo 'some_other_setting => ' .get_theme_mod( 'some_other_setting', '#000000' )."\n";
echo 'non_existent_setting => '.get_theme_mod( 'non_existent_setting', 'default_value' )."\n";

корректировок

Вы также можете изменить элемент управления:

$wp_customize->add_control( 'themename_color_scheme', array(
    'label'      => __( 'Color Scheme', 'themename' ),
    'section'    => 'themename_color_scheme',
    'settings'   => 'themename_theme_options[color_scheme]',
    'type'       => 'radio',
    'choices'    => array(
        'value1' => 'Choice 1',
        'value2' => 'Choice 2',
        'value3' => 'Choice 3',
        ),
) );

Контроль типа по умолчанию text. Создает текстовое поле управления. Другой тип dropdown-pagesэлемента управления , который создает раскрывающийся список страниц WordPress.

Но это не все. На самом деле их еще несколько, но поскольку они такие обычайные, они объявлены по-другому.

Этот использует ООП:

$wp_customize->add_control(
    new WP_Customize_Color_Control( $wp_customize, 'link_color', array(
        'label'    => __( 'Link Color', 'themename' ),
        'section'  => 'themename_color_scheme',
        'settings' => 'themename_theme_options[link_color]',
    ) )
);

Дополнительные замечания:

  • WP_Customize_Upload_Control- Это дает вам окно для загрузки файлов. Однако, вы, вероятно, не будете использовать это напрямую, вы захотите расширить его для других вещей, например: WP_Customize_Image_Control- Это даст вам средство выбора изображений и окно загрузки. Это расширяет контроллер загрузки. Вы можете увидеть это в действии на пользовательском фрагменте фона, где пользователь может загрузить новый файл в качестве фонового изображения.
  • WP_Customize_Header_Image_Control- Из - за изменения размера действия части заголовка, то нужно немного специальной обработки и отображения, таким образом , WP_Customize_Header_Image_Controlрасширяет
  • WP_Customize_Image_Controlчтобы добавить эту функциональность. Вы можете увидеть это в действии на пользовательском заголовке, где пользователь может загрузить новый файл в качестве изображения заголовка.

Вы можете найти больше информации о «Настройщике тем» в блоге ottos .

Обновление 11/06/2012

Живой пример для возможности чтения и другие примеры, см. Открытый репозиторий для источника и доку.

Обновление 15.01.2013

Мы создали репозиторий на github с пользовательским классом, чтобы использовать его, легко и готово. Может быть, вы можете использовать его или продвигать свои идеи и решения.

bueltge
источник
4

Хорошо, вот как это сделать. Разделите ваш класс (ы) управления на один или несколько новых файлов.

У вас есть функция или метод, подключенный к customize_register, верно? В этой функции или методе требуется один раз новые файлы непосредственно перед добавлением пользовательских элементов управления. Тогда PHP не будет жаловаться на переопределение классов.

Примечание: это не будет работать из коробки, но показывает хитрость.

add_action('customize_register', array('myAddControl', 'customize_register') );

class myAddControl{
public function customize_register()
{
    global $wp_customize;


            //This will do the trick
    require_once(dirname(__FILE__).'/class-gctfw-theme-control.php');


    $wp_customize->add_section( 'gctfw_switch_theme' , array(
        'title'      => 'Switch theme',
        'priority'   => 25,
    ) );

    $wp_customize->add_setting( 'gctfw_select_theme' , array(
        'default'     => $wp_customize->theme()->get('Name'),
        'transport'   => 'refresh',
        'capabilities' => 'manage_options'
    ) );

    $myControl = new gctfw_Theme_Control( $wp_customize, 'gctfw_select_theme', array(
        'label'        => __( 'Select theme', 'mytheme' ),
        'section'    => 'gctfw_switch_theme',
        'settings'   => 'gctfw_select_theme',
    ) ) ;
    $wp_customize->add_control( $myControl );
    }
}//class
Геза Микло
источник
3

Вы никогда не используете свой класс. Попробуйте передать новый экземпляр вашего класса методу add_control:

$control_args = array(
  // your args here
); 

$my_control = new WP_Customize_Palette_Control(
                $wp_customize, 'themename_color_scheme', $control_args);

$wp_customize->add_control($my_control);

Кроме того, я не думаю, что WP знает, что имя опции для вашей настройки является частью массива. Может быть, лучше иметь themename_theme_options_color_schemeвместо themename_theme_options[color_scheme].

Класс вашего расширения принадлежит элементу управления загрузкой изображений. Если вы создаете палитру цветов, вам, вероятно, следует расширить класс WP_Customize_Control .

onetrickpony
источник
Настройщик знает о многомерных настройках .
Йен Данн
1

Просто для полноты: пример того, как добавить числовое поле в Theme Customizer.

class Customize_Number_Control extends WP_Customize_Control
{
    public $type = 'number';

    public function render_content()
    {
        ?>
        <label>
            <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span>
            <input type="number" size="2" step="1" min="0" value="<?php echo esc_attr(  $this->value() ); ?>" />
        </label>
        <?php
    }
}
кайзер
источник
Я не думаю, что это необходимо, вы можете просто пройти numberв качестве typeконтроля по умолчанию и использовать input_attrsдля передачи stepи т. Д.
Ян Данн
@IanDunn Можете ли вы добавить пример в качестве дополнительного ответа? Благодарность!
Кайзер
0

Я думаю, что вы должны добавить обратную косую черту перед WP_Customize. Итак, это будет

class WP_Customize_Palette_Control extends \WP_Customize_Image_Control

, Потому что обратный слеш предполагал, что WP_Customize_Image_Control не из того же пространства имен

Дайте мне знать, если это помогло

IPP
источник