Spis treści
Na początek, przypomnijmy sobie, gdzie jesteśmy z kodem. Szczególnie dopóki jest niezbyt długi i nie tracimy na przypominanie sobie ani miejsca, ani czasu. Kod się będzie rozrastał i będziemy go modyfikować, aby go upraszczać i skracać. Ale o tym trochę później.
Teraz źródło:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php /* Plugin Name: Test opcje Plugin URI: https://wpkurs.pl/ Description: Wtyczka, która pokazuje jak stworzyć Ustawienia za pomocą WordPress API Author: Łukasz Nowicki Version: 0.1.1 Author URI: https://lukasznowicki.info/ Requires at least: 5.4 Tested up to: 5.4 Requires PHP: 7.4 */ add_action( 'admin_init', function () { add_settings_field( 'to_blog_motto', '<label for="to_blog_motto">Motto bloga</label>', function ( $args ) { echo '<input name="' . $args['id'] . '" type="text" id="' . $args['id'] . '" value="' . esc_attr( get_option( $args['id'], '' ) ) . '" class="regular-text" />'; }, 'general', 'default', [ 'id' => 'to_blog_motto' ] ); register_setting( 'general', 'to_blog_motto' ); } ); |
To dobry początek, mamy już jedno ustawienie. Zróbmy sobie kolejne!
Pisanie – sekcje
Na tej stronie mamy więcej sekcji, niż tylko domyślną („default”), dlatego napisałem, że będzie więcej zabawy. Ale, uwaga! Sekcje inne niż default występują w pojedynczej instancji WordPressa. Jeżeli używasz multisite network – czyli wielu witryn na jednym WordPressie, nie zobaczysz tych sekcji. A to nie koniec niespodzianek… No dobrze, na początek – co to za sekcje? Ano, jest domyślna, „default”. Kolejna to publikacja przez e-mail „post_via_email” a ostatnia to usługi aktualizacji „remote_publishing”. I ta ostatnia to niespodzianka taka, że ta sekcja oznaczona jest jako „deprecated” i jak spróbujemy do niej coś dopisać to… wyświetli się to w sekcji „default”. Ale i tak to zrobimy, żeby było widać, co WordPress zrobi z nieobecną sekcją, nie musicie mi wierzyć na słowo.
Co możemy tam dodać?
Co chcemy, to jasne. Ja postanowiłem, że na potrzeby naszego wpisu, dodamy trzy proste pola tekstowe. W sekcji domyślnej będzie to „Domyślny początek”, czyli lead naszego artykułu, będzie to textarea a nie input text, więc poznamy coś nowego (w pewnym sensie, oczywiście), dla publikacji przez e-mail dodamy domyślny dodatek do tytułu a dla usług aktualizacji dodamy pole na adres e-mail na który, po wykonanej usłudze aktualizacji, WordPress wyśle informację o tym, że to zrobił.
Zabieramy się za programowanie! Dodajemy pola:
1 2 3 4 5 6 7 8 9 |
add_settings_field( 'to_default_lead', '<label for="to_default_lead">Domyślny wstęp artykułów:</label>', function ( $args ) { echo '<textarea name="' . $args['id'] . '" id="' . $args['id'] . '" rows="5" cols="50" class="large-text">' . esc_textarea( get_option( $args['id'], '' ) ) . '</textarea>'; }, 'writing', 'default', [ 'id' => 'to_default_lead' ] ); add_settings_field( 'to_title_tag', '<label for="to_title_tag">Dodatek do tytułu:</label>', function ( $args ) { echo '<input name="' . $args['id'] . '" type="text" id="' . $args['id'] . '" value="' . esc_attr( get_option( $args['id'], '' ) ) . '" class="regular-text">'; }, 'writing', 'post_via_email', [ 'id' => 'to_title_tag' ] ); add_settings_field( 'to_after_email', '<label for="to_after_email">Powiadom po aktualizacji:</label>', function ( $args ) { echo '<input name="' . $args['id'] . '" type="email" id="' . $args['id'] . '" value="' . esc_attr( get_option( $args['id'], '' ) ) . '" class="regular-text">'; }, 'writing', 'remote_publishing', [ 'id' => 'to_after_email' ] ); |
I je rejestrujemy:
1 2 3 |
register_setting( 'writing', 'to_default_lead' ); register_setting( 'writing', 'to_title_tag' ); register_setting( 'writing', 'to_after_email' ); |
Nasza anonimowa funkcja przy dodawaniu akcji mocno się rozrosła…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
add_action( 'admin_init', function () { add_settings_field( 'to_blog_motto', '<label for="to_blog_motto">Motto bloga</label>', function ( $args ) { echo '<input name="' . $args['id'] . '" type="text" id="' . $args['id'] . '" value="' . esc_attr( get_option( $args['id'], '' ) ) . '" class="regular-text">'; }, 'general', 'default', [ 'id' => 'to_blog_motto' ] ); add_settings_field( 'to_default_lead', '<label for="to_default_lead">Domyślny wstęp artykułów:</label>', function ( $args ) { echo '<textarea name="' . $args['id'] . '" id="' . $args['id'] . '" rows="5" cols="50" class="large-text">' . esc_textarea( get_option( $args['id'], '' ) ) . '</textarea>'; }, 'writing', 'default', [ 'id' => 'to_default_lead' ] ); add_settings_field( 'to_title_tag', '<label for="to_title_tag">Dodatek do tytułu:</label>', function ( $args ) { echo '<input name="' . $args['id'] . '" type="text" id="' . $args['id'] . '" value="' . esc_attr( get_option( $args['id'], '' ) ) . '" class="regular-text">'; }, 'writing', 'post_via_email', [ 'id' => 'to_title_tag' ] ); add_settings_field( 'to_after_email', '<label for="to_after_email">Powiadom po aktualizacji:</label>', function ( $args ) { echo '<input name="' . $args['id'] . '" type="email" id="' . $args['id'] . '" value="' . esc_attr( get_option( $args['id'], '' ) ) . '" class="regular-text">'; }, 'writing', 'remote_publishing', [ 'id' => 'to_after_email' ] ); register_setting( 'general', 'to_blog_motto' ); register_setting( 'writing', 'to_default_lead' ); register_setting( 'writing', 'to_title_tag' ); register_setting( 'writing', 'to_after_email' ); } ); |
Możemy zauważyć tu pewną powtarzalność. Wyświetlanie pola tekstowego wygląda identycznie… więc nieco to przebudujemy, wydzielając funkcję dla pola tekstowego. Od razu wydzielimy też funkcję dla textarea, bo niby czemu nie? I dodamy sobie funkcję, która zwróci nam tytuł dla znacznika label razem z ID. Bo możemy. I teraz całość wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php /* Plugin Name: Test opcje Plugin URI: https://wpkurs.pl/ Description: Wtyczka, która pokazuje jak stworzyć Ustawienia za pomocą WordPress API Author: Łukasz Nowicki Version: 0.1.1 Author URI: https://lukasznowicki.info/ Requires at least: 5.4 Tested up to: 5.4 Requires PHP: 7.4 */ function toAddInputText( $args ) { echo '<input name="' . $args['id'] . '" type="text" id="' . $args['id'] . '" value="' . esc_attr( get_option( $args['id'], '' ) ) . '" class="regular-text">'; } function toAddTextarea( $args ) { echo '<textarea name="' . $args['id'] . '" id="' . $args['id'] . '" rows="5" cols="50" class="large-text">' . esc_textarea( get_option( $args['id'], '' ) ) . '</textarea>'; } function titleWithLabel( $id, $title ) { return '<label for="' . $id . '">' . $title . '</label>'; } add_action( 'admin_init', function () { add_settings_field( 'to_blog_motto', titleWithLabel( 'to_blog_motto', 'Motto bloga' ), 'toAddInputText', 'general', 'default', [ 'id' => 'to_blog_motto' ] ); add_settings_field( 'to_default_lead', titleWithLabel( 'to_default_lead', 'Domyślny wstęp artykułów' ), 'toAddTextarea', 'writing', 'default', [ 'id' => 'to_default_lead' ] ); add_settings_field( 'to_title_tag', titleWithLabel( 'to_title_tag', 'Dodatek do tytułu' ), 'toAddInputText', 'writing', 'post_via_email', [ 'id' => 'to_title_tag' ] ); add_settings_field( 'to_after_email', titleWithLabel( 'to_after_email', 'Powiadom po aktualizacji' ), 'toAddInputText', 'writing', 'remote_publishing', [ 'id' => 'to_after_email' ] ); register_setting( 'general', 'to_blog_motto' ); register_setting( 'writing', 'to_default_lead' ); register_setting( 'writing', 'to_title_tag' ); register_setting( 'writing', 'to_after_email' ); } ); |
A jak wygląda wynik naszego kodu? Ano tak:
Zwróćcie uwagę na to, że pojawiły się wszystkie trzy dodatkowe pola, ale pole, które miało się pojawić w sekcji „remote_publishing” trafiło do sekcji „default” ponieważ twórcy WordPress określili sekcję „remote_publishing” jako przestarzałą (deprecated) i już jej nie używamy. Ale pole nam nie zginie i, co najważniejsze, nadal poprawnie działa, zapisując i odczytując wartości.
A można to jeszcze bardziej uprościć?
No jasne, że tak! Akurat w tym przypadku możemy zrobić coś takiego:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?php /* Plugin Name: Test opcje Plugin URI: https://wpkurs.pl/ Description: Wtyczka, która pokazuje jak stworzyć Ustawienia za pomocą WordPress API Author: Łukasz Nowicki Version: 0.1.1 Author URI: https://lukasznowicki.info/ Requires at least: 5.4 Tested up to: 5.4 Requires PHP: 7.4 */ function toAddField( $id, $title, $callback, $page, $section ) { add_settings_field( $id, titleWithLabel( $id, $title ), $callback, $page, $section, [ 'id' => $id ] ); register_setting( $page, $id ); } function toAddTextField( $id, $title, $page, $section ) { toAddField( $id, $title, 'toAddInputText', $page, $section ); } function toAddTextareaField( $id, $title, $page, $section ) { toAddField( $id, $title, 'toAddTextarea', $page, $section ); } function toAddInputText( $args ) { echo '<input name="' . $args['id'] . '" type="text" id="' . $args['id'] . '" value="' . esc_attr( get_option( $args['id'], '' ) ) . '" class="regular-text">'; } function toAddTextarea( $args ) { echo '<textarea name="' . $args['id'] . '" id="' . $args['id'] . '" rows="5" cols="50" class="large-text">' . esc_textarea( get_option( $args['id'], '' ) ) . '</textarea>'; } function titleWithLabel( $id, $title ) { return '<label for="' . $id . '">' . $title . '</label>'; } add_action( 'admin_init', function () { toAddTextField( 'to_blog_motto', 'Motto bloga', 'general', 'default' ); toAddTextareaField( 'to_default_lead', 'Domyślny wstęp artykułów', 'writing', 'default' ); toAddTextField( 'to_title_tag', 'Dodatek do tytułu', 'writing', 'post_via_email' ); toAddTextField( 'to_after_email', 'Powiadom po aktualizacji', 'writing', 'remote_publishing' ); } ); |
Rezultat jest identyczny a odczytać łatwiej. I łatwiej znaleźć co się gdzie dodaje. No i nie zapomnimy o rejestracji zmiennej. Upraszcza to wiele. Więc przejdźmy do następnej części, gdzie obsłużymy resztę stron w Ustawieniach.