Como estender o WP_Customize_Control


27

Estou procurando uma maneira de adicionar um novo tipo de controle ao painel de visualização ao vivo de personalização . Eu vi como adicionar novas seções ao painel usando add_action( 'customize_register'...

O controle que quero implementar é um tipo diferente de seletor de cores. Em uma postagem anterior , vemos como estender as classes principais para adicionar widgets, mas o que me falta aqui é um gancho que me permitirá colocar meu objeto no escopo - WP_Customize_Palette_Control. At

Você pode ver o início do código aqui . Este código está no functions.phparquivo do meu tema.

Obrigado por qualquer ajuda. Roubar

Apenas atualizei o código. Agora eu tenho require_onceque trazer as aulas. Portanto, agora não tenho erros de PHP, mas meu novo controle HTML não aparece.

<?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
Ponto secundário, mas, a menos que seu controle esteja no núcleo do WordPress, não use o prefixo WP_. Use seu próprio nome de plugin / tema como prefixo para o nome da classe.
Otto

Respostas:


14

Exemplo e classe para uso

Você pode ver no meu tema atual, como é possível usar isso. Além disso, você pode usar a classe. Veja esta classe no Github e verifique a opção functions.phpfor include this.

Iniciar e iniciar

Você pode registrar suas configurações personalizadas para o personalizador de temas através do customize_register gancho:

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',
    ) ) );

}

Uso no tema:

Use-o, como no exemplo abaixo ↓:

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";

Ajustes

Você também pode alterar o controle:

$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',
        ),
) );

O padrão de controle do tipo é text. Ele cria um controle de caixa de texto. Outro tipo de controle é o dropdown-pagesque cria uma lista suspensa das páginas do WordPress.

Mas isso não é tudo. Na verdade, existem vários outros, mas, por serem tão personalizados, são declarados de maneira diferente.

Este usa o OOP:

$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]',
    ) )
);

Notas Adicionais:

  • WP_Customize_Upload_Control- Isso fornece uma caixa de upload para arquivos. No entanto, você provavelmente não usará isso diretamente, desejará estendê-lo para outras coisas ... como: WP_Customize_Image_Control- Isso fornece o seletor de imagens e a caixa do remetente. Estende o controlador de upload. Você pode vê-lo em ação na parte de plano de fundo personalizada, onde um usuário pode fazer upload de um novo arquivo para ser a imagem de plano de fundo.
  • WP_Customize_Header_Image_Control- Por causa da ação redimensionamento da peça de cabeçalho, ele precisa de um pouco de tratamento especial e exibição, de modo que o WP_Customize_Header_Image_Controlestende a
  • WP_Customize_Image_Controlpara adicionar essa funcionalidade. Você pode vê-lo em ação na parte do cabeçalho personalizada, onde um usuário pode fazer upload de um novo arquivo para ser a imagem do cabeçalho.

Você pode encontrar mais informações sobre o "Theme Customizer" no blog da ottos .

Atualização 11/06/2012

Exemplo ao vivo para possibilidades de leitura e mais exemplos, consulte o repositório aberto da fonte e do doku.

Atualização 15/01/2013

Criamos um repositório no github com classe personalizada para usá-lo, fácil e pronto. Talvez você só possa usá-lo ou avançar com suas idéias e soluções.


4

Ok, aqui está como fazer isso. Separe suas classes de controle para um ou mais novos arquivos.

Você tem uma função ou método viciado em customize_register, certo? Nessa função ou método, exija uma vez seus novos arquivos antes de adicionar seus controles personalizados. Então o PHP não se queixará de redefinir classes.

Nota: Isso não funcionará imediatamente, mas mostra o truque.

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

Você nunca está usando sua classe. Tente passar uma nova instância da sua classe para o método 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);

Além disso, não acho que o WP saiba que o nome da opção para sua configuração faz parte de uma matriz. Talvez seja melhor ter em themename_theme_options_color_schemevez de themename_theme_options[color_scheme].

A classe que você está estendendo pertence ao controle de upload de imagens. Se você estiver criando um seletor de cores, provavelmente deverá estender a classe WP_Customize_Control .



1

Apenas para completar: um exemplo de como adicionar um campo numérico ao 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
    }
}

Eu não acho que isso é necessário, você pode apenas passar numbercomo o typede padrão de controle, e usar input_attrsa passar step, etc.
Ian Dunn

@IanDunn Deseja adicionar um exemplo como resposta adicional? Obrigado!
kaiser

0

Eu acho que você precisa adicionar uma barra invertida antes do WP_Customize. Então, será

class WP_Customize_Palette_Control extends \WP_Customize_Image_Control

, Como a barra invertida assumiu que o WP_Customize_Image_Control não era do mesmo Namespace

Deixe-me saber se ajudou

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.