Jak rozszerzyć WP_Customize_Control

27

Szukam sposobu, aby dodać nowy rodzaj kontroli do dostosowanego panelu podglądu na żywo . Widziałem, jak dodawać nowe sekcje do panelu za pomocą add_action( 'customize_register'...

Kontrola, którą chcę wdrożyć, to inny rodzaj próbnika kolorów. W poprzednim poście widzimy, jak rozszerzyć podstawowe klasy, aby dodać widżety, ale brakuje mi tutaj haka, który pozwoli mi przenieść mój obiekt w zakres - WP_Customize_Palette_Control. W

Tutaj możesz zobaczyć początki kodu . Ten kod znajduje się w functions.phppliku mojego motywu.

Dziękuję za wszelką pomoc. Obrabować

Właśnie zaktualizowałem kod. Teraz muszę require_oncewprowadzić klasy. Więc teraz nie mam błędów PHP, ale mój nowy kontrolny HTML nie pojawia się.

<?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' );
Obrabować
źródło
3
Drobny punkt, ale jeśli twoja kontrola nie przechodzi do rdzenia WordPress, nie używaj prefiksu WP_. Użyj własnej nazwy wtyczki / motywu jako prefiksu nazwy klasy.
Otto,

Odpowiedzi:

14

Przykład i klasa użycia

Możesz zobaczyć na moim obecnym temacie, jak można to wykorzystać. Możesz także skorzystać z klasy. Zobacz tę klasę w Github i sprawdź, czy to functions.phpobejmuje.

Start i init

Możesz zarejestrować własne ustawienia dostosowywania motywu za pomocą customize_register haka:

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

}

Użycie w temacie:

Użyj go, jak w poniższym przykładzie ↓:

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

Korekty

Możesz także zmienić kontrolę:

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

Domyślny typ kontrolny to text. Tworzy formant pola tekstowego. Innym typem kontrolnym jest dropdown-pagestworzenie listy rozwijanej stron WordPress.

Ale to nie wszystko. Jest ich jeszcze kilka, ale ponieważ są tak niestandardowe, że deklaruje się je inaczej.

Ten korzysta z 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]',
    ) )
);

Dodatkowe uwagi:

  • WP_Customize_Upload_Control- To daje ci pole do przesyłania plików. Jednak prawdopodobnie nie użyjesz tego bezpośrednio, będziesz chciał rozszerzyć go na inne rzeczy ... na przykład: WP_Customize_Image_Control- Daje to selektor obrazów i pole do przesyłania. Rozszerza kontroler wysyłania. Możesz zobaczyć to w akcji na niestandardowym kawałku tła, gdzie użytkownik może przesłać nowy plik, który będzie obrazem tła.
  • WP_Customize_Header_Image_Control- Ze względu na zmianę rozmiaru nagłówka wymaga on trochę specjalnej obsługi i wyświetlania, więc WP_Customize_Header_Image_Controlrozszerza
  • WP_Customize_Image_Controlaby dodać tę funkcjonalność. Możesz zobaczyć to w akcji na niestandardowym nagłówku, gdzie użytkownik może przesłać nowy plik, który będzie obrazem nagłówka.

Więcej informacji na temat „Dostosowywania motywów” można znaleźć na blogu ottos .

Aktualizacja 11/06/2012

Przykład na żywo dla możliwości odczytu i więcej przykładów, zobacz otwarte repozytorium dla źródła i doku.

Aktualizacja 15.01.2013

Stworzyliśmy repo na github z niestandardową klasą, aby z niego korzystać, łatwo i gotowe. Może możesz go użyć lub rozwinąć swoje pomysły i rozwiązania.

bueltge
źródło
4

Ok, oto jak to zrobić. Rozdziel swoje klasy kontrolne na jeden lub więcej nowych plików.

Masz funkcję lub metodę uzależnioną od customize_register, prawda? W tej funkcji lub metodzie wymagają raz nowe pliki tuż przed dodaniem niestandardowych formantów. Wtedy PHP nie będzie narzekać na przedefiniowanie klas.

Uwaga: To nie zadziała po wyjęciu z pudełka, ale pokazuje lewę.

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
Géza Mikló
źródło
3

Nigdy nie korzystasz z klasy. Spróbuj przekazać nową instancję swojej klasy do metody 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);

Nie sądzę też, aby WP wiedziała, że ​​nazwa opcji dla twojego ustawienia jest częścią tablicy. Może lepiej mieć themename_theme_options_color_schemezamiast themename_theme_options[color_scheme].

Klasa, którą rozszerzasz, należy do kontrolki przesyłania obrazu. Jeśli tworzysz próbnik kolorów, prawdopodobnie powinieneś rozszerzyć klasę WP_Customize_Control .

onetrickpony
źródło
1

Dla kompletności: przykład dodawania pola liczbowego do Dostosowywania motywu.

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
    }
}
kajzer
źródło
Nie sądzę, żeby to było konieczne, możesz po prostu przekazać numberjako typedomyślną Kontrolę i użyć input_attrsdo przekazania stepitp.
Ian Dunn
@IanDunn Czy możesz dodać przykład jako dodatkową odpowiedź? Dzięki!
kaiser
0

Myślę, że musisz dodać ukośnik odwrotny przed WP_Customize. Tak będzie

class WP_Customize_Palette_Control extends \WP_Customize_Image_Control

, Ponieważ ukośnik odwrotny zakładał, że WP_Customize_Image_Control nie pochodzi z tej samej przestrzeni nazw

Daj mi znać, czy to pomogło

ipp
źródło