Наверняка вы уже пользовались Настройщиком тем, или Кастомайзером, как его называют в соответствии с английским вариантом Customizer. И, возможно, уже добавляли свои настройки (опции) для самописной темы.
Плагин Advanced Custom Fields (ACF) отлично себя зарекомендовал в плане добавления различных полей для использования на страницах, в шаблонах или записях. Но что делать, если данные отдельных полей должны быть доступны на любой странице?
В этом случае вам пригодится страница настроек. Для ее создания существуют специальные функции:
- acf_add_options_page() - создает страницу основных настроек;
- acf_add_options_sub_page() - создает подстраницы настроек.
В официальной документации рекомендуется создавать страницу настроек с помощью такого кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | if( function_exists('acf_add_options_page') ) { acf_add_options_page(array( 'page_title' => 'Theme General Settings', 'menu_title' => 'Theme Settings', 'menu_slug' => 'theme-general-settings', 'capability' => 'edit_posts', 'redirect' => false )); acf_add_options_sub_page(array( 'page_title' => 'Theme Header Settings', 'menu_title' => 'Header', 'parent_slug' => 'theme-general-settings', )); acf_add_options_sub_page(array( 'page_title' => 'Theme Footer Settings', 'menu_title' => 'Footer', 'parent_slug' => 'theme-general-settings', )); } |
Обратите внимание, что для подстраниц, созданных функцией acf_add_options_sub_page()
обязательно нужно указать родительскую страницу в параметре 'parent_slug' => 'theme-general-settings'
, чтобы эти страницы были связаны.
После того, как вы добавили этот код в function.php, в меню админки WordPress появится пункт Theme General Settings. Название берется из параметра 'page_title'
.
Для того чтобы затем получить значение какого-либо поля с этой страницы, необходимо создать группу полей, связанных с этой страницей. Предложение сделать это вы найдете на созданной странице настроек.
После того, как вы создали такие поля, вы можете использовать их в функциях get_field('field_name')
для того, чтобы записать значение поля в переменную, или the_field('field_name')
для вывода значения этого поля на странице. Однако важным моментом является то, что в случае полей со страницы настроек этого будет недостаточно. Нужно еще добавить второй параметр 'option'
:
1 2 3 | <?php $phone = get_field('phone', 'option'); ?> <?php the_field('header_title', 'option'); ?> |
Создание страниц настроек с id
В том случае, если вы хотите сделать страницу настроек уникальной, вы можете задать параметр post_id
. Его можно указать для обеих функций. Если вы назначаете этот параметр, то и обращаться потом необходимо к нему при выводе полей настроек на странице темы.
Кроме того, можно использовать дополнительные параметры, связанные с другими плагинами. Например, для мультиязычного сайта, созданного с помощью плагина Polylang, можно сделать несколько подстраниц настроек для разных языков.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php if( function_exists('acf_add_options_page') ) { $option_page = acf_add_options_page(array( 'page_title' => 'Theme General Settings', 'menu_title' => 'Theme General Settings', 'menu_slug' => 'theme-general-settings', 'capability' => 'edit_posts', 'post_id' => 'theme-options', 'redirect' => false )); $languages = array( 'en','ru', 'ua' ); foreach ( $languages as $lang ) { acf_add_options_sub_page( array( 'page_title' => 'Genaral Settings (' . strtoupper( $lang ) . ')', 'menu_title' => 'Genaral Settings (' . strtoupper( $lang ) . ')', 'menu_slug' => "options-${lang}", 'post_id' => "theme-options-${lang}", 'parent' => 'theme-general-settings' ) ); } } |
Например, к общим настройкам могут относиться ссылки на социальные сети. Если вы задавали их в основных настройках, то и для вывода используйте имя поля (слаг) и второй параметр - id настроек. В примере это 'theme-options'
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php $facebook = get_field("facebook_link", 'theme-options'); $instagram = get_field("instagram_link", 'theme-options'); $youtube = get_field("youtube_link", 'theme-options'); ?> <?php if(!empty($facebook_link)): ?> <a class="social" href="<?php echo $facebook_link ?>"> <i class="fa-brands fa-facebook"></i> </a> <?php endif; if(!empty($instagram_link)): ?> <a class="social" href="<?php echo $instagram_link ?>" <i class="fa-brands fa-square-instagram"></i> </a> <?php endif; if(!empty($youtube_link)): ?> <a class="social" href="<?php echo $youtube_link ?>" <i class="fa-brands fa-youtube"></i> </a> <?php endif; ?> |
В том случае, если вы используете значения полей с подстраницы, то вам нужно указывать id той подстраницы, поля с которой вы выводите во FrontEnd.
В случае страниц с мультиязычного сайта определить язык, который был был задан в id страниц, можно с помощью функции pll_current_language( 'slug' )
:
1 2 3 4 5 6 | <?php $current_lang = pll_current_language( 'slug' ); $post_id = 'theme-options-'.$current_lang; ?> <p>Address: <?php the_field("address_".$current_lang, $post_id); ?></p> |
В группе полей для каждого языка должны быть поля с определеными именами (слагами, которые используются при выводе значения поля). В примере к каждому слагу добавляется слаг языка.
Затем на странице настроек для каждого языка вводим разную информацию:
На страницах сайта вы также увидите разную информацию для разных языков, хотя шаблон для вывода используется один.