Intereting Posts
$ update всегда верно в save_post Как я могу сделать работу с формой входа Ajax с включенным FORCE_SSL_ADMIN? Показать изменения за пределами консоли администратора Отображать только дочерние страницы определенной страницы в результатах поиска Войдите в систему с OpenID, аналогично сайтам Stack Exchange? Пользовательская страница входа с настраиваемыми переадресациями для каждого пользователя? Как добавить страницы в пользовательские меню «на лету» Лучший способ добавить поля пользовательских / магических / флаттеров в RSS-канал Более эффективный запрос для отображения сообщений в одной и той же подкатегории? как случайным образом перечислить 5 авторов с не менее чем 3 опубликованными сообщениями Как изменить текст предыдущей / следующей кнопки на голландский? имена файлов get_template_part и шаблонов Последние сообщения Проблема с wp_handle_upload Условное внутреннее выражение результата поиска

Customiser `active_callback` не работает над управлением с помощью метода postMessage.

У меня есть 4x пользовательских настроек в пределах 2-х пользовательских разделов, а второй параметр в каждом разделе, основанный на active_callback показывает / скрывает его.

В обоих случаях active_callback проверяет значение первого настраиваемого параметра из этого раздела, и он отлично работает, пока я не начал использовать transport => postMessage для первого параметра (все настройки ниже, так как их проще показать, чем объяснять их ).

Нет ошибок JS, поэтому я предполагаю, что это должно быть связано с тем, как активируется активный обратный вызов (т. Е. Возможно, это не когда используется postMessage ).

Хотя я могу добавить некоторые дополнительные JS для покрытия моих требований, мне было бы интересно узнать, будет ли это ожидаемое поведение, и если да, то есть ли способ исправить мою проблему.

Вот настройки (зарегистрированные с помощью customize_register action hook) …

 /** * Create the custom 'Archive Pages' section and register settings */ function register_settings_archive_template($wp_customise){ $wp_customise->add_section('section_template_archive' , array( 'title' => __('Archive Pages', TEXT_DOMAIN), 'priority' => 60 )); /** * Link tile size (overrides General setting) */ $wp_customise->add_setting('archive_link_tile_size', array( 'default' => 'default', 'transport' => 'postMessage' )); $wp_customise->add_control('archive_link_tile_size', array( 'label' => __('Link tile size', TEXT_DOMAIN), 'section' => 'section_template_archive', 'type' => 'radio', 'choices' => array( 'default' => __('Default', TEXT_DOMAIN), 'large' => __('Large', TEXT_DOMAIN), 'small' => __('Small', TEXT_DOMAIN) ), 'description' => __('The size of link tile that you wish to dsipay on archive pages.', TEXT_DOMAIN), )); /** * Show 'More...' link */ $wp_customise->add_setting('archive_show_more_link', array( 'default' => false, 'transport' => 'postMessage' )); $wp_customise->add_control('archive_show_more_link', array( 'label' => __('Show link to Link/Post', TEXT_DOMAIN), 'section' => 'section_template_archive', 'type' => 'checkbox', 'description' => __('Whether or not to show the \'More...\' link underneath a large link tile on archive pages. Note that links cannot be displayed in conjunction with \'Small\' Link Tiles.', TEXT_DOMAIN), 'active_callback' => '_check_is_link_tile_size_large' )); } /** * Create the custom 'Search Results' section and register settings */ function register_settings_search_template($wp_customise){ $wp_customise->add_section('section_template_search' , array( 'title' => __('Search Results', TEXT_DOMAIN), 'priority' => 60 )); /** * Link tile size (overrides General setting) */ $wp_customise->add_setting('search_link_tile_size', array( 'default' => 'default', 'transport' => 'postMessage' )); $wp_customise->add_control('search_link_tile_size', array( 'label' => __('Link tile size', TEXT_DOMAIN), 'section' => 'section_template_search', 'type' => 'radio', 'choices' => array( 'default' => __('Default', TEXT_DOMAIN), 'large' => __('Large', TEXT_DOMAIN), 'small' => __('Small', TEXT_DOMAIN) ), 'description' => __('The size of link tile that you wish to dsipay on the search results page.', TEXT_DOMAIN) )); /** * Show 'More...' link */ $wp_customise->add_setting('search_show_more_link', array( 'default' => false, 'transport' => 'postMessage' )); $wp_customise->add_control('search_show_more_link', array( 'label' => __('Show link to Link/Post', TEXT_DOMAIN), 'section' => 'section_template_search', 'type' => 'checkbox', 'description' => __('Whether or not to show the \'More...\' link underneath a large link tile on the search results page. Note that links cannot be displayed in conjunction with \'Small\' Link Tiles.', TEXT_DOMAIN), 'active_callback' => '_check_is_link_tile_size_large' )); } 

И вот активный обратный вызов …

 public function _check_is_link_tile_size_large($control){ $control_id = $control->id; switch($control_id): case 'archive_show_more_link' : $validation_setting = 'archive_link_tile_size'; break; case 'search_show_more_link' : $validation_setting = 'search_link_tile_size'; break; endswitch; return ($control->manager->get_setting($validation_setting)->value() === 'large'); } 

Обновить

Я должен был добавить это в первую очередь, но вот JS, который я использую, чтобы обновить вышеуказанные настройки через postMessage

 (function($){ var api = wp.customize; CustomiseArchivePages(); // Customise settings in the Archive Pages section CustomiseSearchResults(); // Customise settings in the Search Results section /** * Customise settings in the Archive Pages section */ function CustomiseArchivePages(){ /** Link Tile size */ api('archive_link_tile_size', function(value){ value.bind(function(newval){ PreviewLinkTile(newval, api.get().archive_show_more_link); }); }); /** Show/hide 'More...' button */ api('archive_show_more_link', function(value){ value.bind(function(newval){ PreviewLinkTile(api.get().archive_link_tile_size, newval); }); }); } /** * Customise settings in the Search Results section */ function CustomiseSearchResults(){ /** Search box placeholder text */ api('search_box_placeholder', function(value){ value.bind(function(newval){ $('input.s').attr('placeholder', newval); }); }); /** Link Tile size */ api('search_link_tile_size', function(value){ value.bind(function(newval){ PreviewLinkTile(newval, api.get().search_show_more_link); }); }); /** Show/hide 'More...' button */ api('search_show_more_link', function(value){ value.bind(function(newval){ PreviewLinkTile(api.get().search_link_tile_size, newval); }); }); } /** * Set the link tile size and show/hide the 'More...' button on link tiles * * @param required string linkTileSize The size of the link tiles that are being displayed * @param required string showMoreInfoButton Whether or not to show the 'More...' button */ function PreviewLinkTile(linkTileSize, showMoreInfoButton){ var linksContainer = $('#links-container'), // The links container linkTiles = $('.link-tile', linksContainer); // Every individual link tile linkTileSize = (linkTileSize !== 'default') ? linkTileSize : api.get().general_link_tile_size; // If the new size is default, grab the default size /** * Set the link tile size */ switch(linkTileSize){ case 'large' : /** Set the links container classes */ linksContainer.removeClass('uk-grid-width-1-2 uk-grid-width-small-1-3 uk-grid-width-medium-1-4 uk-grid-width-large-1-5') .addClass('uk-grid-width-1-1 uk-grid-width-small-1-1 uk-grid-width-medium-1-2 uk-grid-width-large-1-3'); /** Set the link tile class */ linkTiles.removeClass('link-tile-small') .addClass('link-tile-large'); break; case 'small' : /** Set the links container classes */ linksContainer.removeClass('uk-grid-width-1-1 uk-grid-width-small-1-1 uk-grid-width-medium-1-2 uk-grid-width-large-1-3') .addClass('uk-grid-width-1-2 uk-grid-width-small-1-3 uk-grid-width-medium-1-4 uk-grid-width-large-1-5'); /** Set the link tile class */ linkTiles.removeClass('link-tile-large') .addClass('link-tile-small'); break; default : console.log('An unexpected error occured when customising the Link Tile size: The new size could not be determined.'); break; } /** * Show/hide the 'More...' button */ if(showMoreInfoButton && linkTileSize === 'large'){ linkTiles.addClass('show-more-button'); } else { linkTiles.removeClass('show-more-button'); } } })(jQuery); 

Поскольку postMessage полностью использует JavaScript, любой PHP active_callback не будет вызван, если предварительный просмотр не wp.customize.previewer.refresh() например, через wp.customize.previewer.refresh() ). Итак, что вам нужно сделать, это реализовать active обратный вызов в JavaScript, например:

 wp.customize.bind( 'ready', function () { wp.customize.control( 'archive_show_more_link', function( control ) { var setting = wp.customize( 'archive_link_tile_size' ); control.active.set( 'large' === setting.get() ); setting.bind( function( value ) { control.active.set( 'large' === value ); } ); } ); wp.customize.control( 'search_show_more_link', function( control ) { var setting = wp.customize( 'search_link_tile_size' ); control.active.set( 'large' === setting.get() ); setting.bind( function( value ) { control.active.set( 'large' === value ); } ); } ); } ); 

Убедитесь, что этот скрипт попадает в область Customizer, а не в предварительный просмотр. Другими словами, запустите JS в действии customize_controls_enqueue_scripts .