Intereting Posts
Https и Http для iFrame Пользовательский тип сообщения, постоянные ссылки, таксономии и сообщения в блоге Условное изменение результатов запроса Использование управления вставкой изображения в коде Объявляя новый тип продукта woo commerce, я получаю эту ошибку WP 4.5 скрывает основные разделы Разбивка страницы для страницы, созданной с помощью короткого кода «Продукт», Если ваш блог был приложением на Facebook call_user_func_array () ожидает, что параметр 1 будет действительным обратным вызовом Перенаправить, если не войти в систему? Есть ли какая-либо инфраструктура разработки плагинов Multisite: использовать носители с одного сайта или копировать один и тот же носитель на все языковые сайты? Исключение сообщений из определенной категории из следующих и предыдущих сообщений Как загрузить плагин перед wordpress jquery? Пользовательская таксономия WooCommerce как мета?

Как разрешить администраторам создавать боковую панель от администратора

Я создаю тему WordPress, и я заметил, что множество премиальных тем позволяют пользователям перейти в Appearance-> Sidebars и создать новую боковую панель, просто указав ей имя. Затем пользователь может перейти к виджетам и назначить разные виджеты этой боковой панели, а также добавить пользовательские меню. Это, я считаю, отличная функция, так как позволяет пользователям иметь разные боковые панели на разных страницах.

Теперь я знаком с настройками Custom Post Type и Theme и знаю, как я хочу, чтобы люди выбирали другую боковую панель для разных страниц, но у меня просто возникают проблемы с созданием первого шага, который позволяет людям создавать боковую панель на их. Мне нужно создать CPT для этого? или есть какой-то другой способ?

Я много искал, и лучшее, что я натолкнулся, это плагин, который имеет много кода и делает слишком много вещей и для которого я даже не могу найти информацию о лицензии.

Поэтому, пожалуйста, совет, как я могу создать что-то подобное и спасибо вам большое.

Создайте функцию, которая регистрирует боковые панели, используя register_sidebar , начиная с опции:

 add_action('widgets_init', 'my_custom_sidebars'); function my_custom_sidebars() { $sidebars = get_option('my_theme_sidebars'); // get all the sidebars names if ( ! empty($sidebars) ) { // add a sidebar for every sidebar name foreach ( $sidebars as $sidebar ) { if ( empty($sidebar) ) continue; register_sidebar(array( 'name' => $sidebar, 'id' => sanitize_title($sidebar), 'before_title' => '<h1>', 'after_title' => '</h1>' )); } } } 

Теперь вам нужно сохранить опцию 'my_theme_sidebars' которая содержит массив имени боковых панелей. Здесь я публикую код, который создает страницу с 10 текстовыми вводами, где добавляется имя боковой панели. (Я буду использовать add_theme_page ). Вы можете улучшить его, добавив javascript в динамические поля добавления.

 add_action('admin_menu', 'my_custom_sidebars_page'); function my_custom_sidebars_page() { add_theme_page( 'Sidebars', 'Sidebars', 'edit_theme_options', 'my_custom_sidebars', 'my_custom_sidebars_page_print' ); // save the form if submitted $nonce = filter_input(INPUT_POST, 'my_custom_sidebars_nonce', FILTER_SANITIZE_STRING); if ( ! empty($nonce) && wp_verify_nonce($nonce, 'my_custom_sidebars') ) { $sidebars = (array) $_POST['custom_sidebars']; update_option('my_theme_sidebars', $sidebars); add_action('admin_notices', 'my_custom_sidebars_notice'); } } function my_custom_sidebars_page_print() { if (! current_user_can('edit_theme_options') ) return; ?> <div class="wrap"> <h2>Sidebars</h2> <form id="sidebars" method="post"> <?php wp_nonce_field('my_custom_sidebars', 'my_custom_sidebars_nonce'); $saved = get_option('my_theme_sidebars'); for ($i=0; $i<10; $i++) { $value = isset( $saved[$i] ) ? esc_attr($saved[$i]) : ''; ?> <input type="text" name="custom_sidebars[]" value="<?php echo $value;?>" /> <?php } ?> <p class="submit"> <input name="submit" class="button button-primary" value="Save" type="submit"> </p> </form> </div> <?php } function my_custom_sidebars_notice() { echo '<div class="updated"><p>Updated.</p></div>'; } 

Теперь вы разрешили пользователям выбирать боковые панели для определенной страницы. Для этого вы можете добавить обмен. (См. Документы add_meta_box ).

 add_action( 'add_meta_boxes', 'my_custom_sidebar_metabox' ); function my_custom_sidebar_metabox() { $screens = array( 'post', 'page' ); // add the metabox for pages and post foreach ( $screens as $screen ) { add_meta_box('my_custom_sidebar', 'Select a Sidebar','my_custom_sidebar_box', $screen); } } function my_custom_sidebar_box( $post ) { $sidebars = get_option('my_theme_sidebars'); // get all the sidebars names if ( empty($sidebars) ) { echo 'No custom sidebars registered.'; return; } wp_nonce_field( 'my_custom_sidebar', 'my_custom_sidebar_box_nonce' ); $value = get_post_meta( $post->ID, '_custom_sidebar', true ); // actual value echo '<label>Select a Sidebar</label> '; echo '<select name="custom_sidebar">'; // default option echo '<option value=""' . selected('', $value, false) . '>Default</option>'; // an option for every sidebar foreach ($sidebars as $sidebar) { if ( empty($sidebar) ) continue; $v = sanitize_title($sidebar); $n = esc_html($sidebar); echo '<option value="' . $v . '"' . selected($v, $value) .'>' .$n .'</option>'; } echo '<select>'; } По add_action( 'add_meta_boxes', 'my_custom_sidebar_metabox' ); function my_custom_sidebar_metabox() { $screens = array( 'post', 'page' ); // add the metabox for pages and post foreach ( $screens as $screen ) { add_meta_box('my_custom_sidebar', 'Select a Sidebar','my_custom_sidebar_box', $screen); } } function my_custom_sidebar_box( $post ) { $sidebars = get_option('my_theme_sidebars'); // get all the sidebars names if ( empty($sidebars) ) { echo 'No custom sidebars registered.'; return; } wp_nonce_field( 'my_custom_sidebar', 'my_custom_sidebar_box_nonce' ); $value = get_post_meta( $post->ID, '_custom_sidebar', true ); // actual value echo '<label>Select a Sidebar</label> '; echo '<select name="custom_sidebar">'; // default option echo '<option value=""' . selected('', $value, false) . '>Default</option>'; // an option for every sidebar foreach ($sidebars as $sidebar) { if ( empty($sidebar) ) continue; $v = sanitize_title($sidebar); $n = esc_html($sidebar); echo '<option value="' . $v . '"' . selected($v, $value) .'>' .$n .'</option>'; } echo '<select>'; } 

Затем добавьте функцию для сохранения метаболизма:

 add_action( 'save_post', 'my_custom_sidebar_metabox_save' ); function my_custom_sidebar_metabox_save( $post_id ) { // If this is an autosave, our form has not been submitted, do nothing. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; // check nonce $nonce = filter_input(INPUT_POST, 'my_custom_sidebar_box_nonce', FILTER_SANITIZE_STRING); if ( empty($nonce) || ! wp_verify_nonce( $nonce, 'my_custom_sidebar' ) ) return; $type = get_post_type($post_id); // Check the user's permissions. $cap = ( 'page' === $type ) ? 'edit_page' : 'edit_post'; if ( ! current_user_can( $cap, $post_id ) ) return; $custom = filter_input(INPUT_POST, 'custom_sidebar', FILTER_SANITIZE_STRING); // Update the meta field in the database. if ( empty($custom) ) { delete_post_meta( $post_id, '_custom_sidebar'); } else { update_post_meta( $post_id, '_custom_sidebar', $custom ); } } 

Таким образом, ваши пользователи могут выбрать пользовательскую панель для каждой публикации или страницы. Он сохраняется в мета-поле « _custom_sidebar' .

Чтобы отобразить пользовательскую боковую панель, ваш sidebar.php должен содержать что-то вроде:

 // change the following according to your defaults sidebar if exists $sidebar = 'main_sidebar'; // if in singular post/page check for saved custom sidebar if ( is_singular() ) { $id = get_queried_object_id(); // get current post/page id $custom = get_post_meta( $id, '_custom_sidebar', true ); // get selected sidebar if ( ! empty($custom) ) $sidebar = $custom; } if ( is_active_sidebar( $sidebar ) ) { ?> <ul id="sidebar"><?php dynamic_sidebar( $sidebar ); ?></ul> <?php } ?> 

Наконец, на ваших страницах и сообщениях просто позвоните get_sidebar(); как обычно.

КОД ОБНОВЛЕНО = ДОБАВИТЬ НЕОГРАНИЧЕННУЮ СУББОТУ (JavaScript)

Создайте функцию, которая регистрирует боковые панели, используя [ register_sidebar ] [1], начиная с опции:

 add_action('widgets_init', 'my_custom_sidebars'); function my_custom_sidebars() { $sidebars = get_option('my_theme_sidebars'); // get all the sidebars names if ( ! empty($sidebars) ) { // add a sidebar for every sidebar name foreach ( $sidebars as $sidebar ) { if ( empty($sidebar) ) continue; register_sidebar(array( 'name' => $sidebar, 'id' => sanitize_title($sidebar), 'before_title' => '<h1>', 'after_title' => '</h1>' )); } } } 

ОБНОВЛЕНО: теперь вам нужно сохранить опцию 'my_theme_sidebars' которая содержит массив имени боковых панелей. Здесь я публикую код, который создает страницу с 10 текстовыми вводами, где добавляется имя боковой панели. (Я буду использовать [ add_theme_page ] [2]). Вы можете улучшить его добавление javascript в динамические поля добавления. Добавьте неограниченную страницу администратора боковых панелей.

 add_action( 'admin_menu', 'my_sidebar_plugin_menu' ); function my_sidebar_plugin_menu() { add_theme_page( 'sidebar Plugin Options', 'Add Sidebar', 'manage_options', 'my-sidebar-unique-identifier', 'my_sidebar_plugin_options' ); $nonce = filter_input(INPUT_POST, 'my_custom_sidebars_nonce', FILTER_SANITIZE_STRING); if ( ! empty($nonce) && wp_verify_nonce($nonce, 'my_custom_sidebars') ) { $sidebars = (array) $_POST['custom_sidebars']; update_option('my_theme_sidebars', $sidebars); add_action('admin_notices', 'my_custom_sidebars_notice'); } } function my_sidebar_plugin_options() { wp_enqueue_script('jquery'); wp_enqueue_script('custom_sidebar-js', get_template_directory_uri() . '/js/custom_sidebar.js'); if ( !current_user_can( 'manage_options' ) ) { wp_die( __( 'You do not have sufficient permissions to access this page.' ) ); } ?> <div class="my-form"> <div class="wrap"> <h2>Add Custom Sidebars</h2> <form id="sidebars" method="post"> <?php wp_nonce_field('my_custom_sidebars', 'my_custom_sidebars_nonce'); $saved = get_option('my_theme_sidebars'); $xx=get_option('my_theme_sidebars'); //print_r($xx); $no=count($xx); ?> <div id="append"> <p class="text-box"> <label for="box1">Sidebar-<span class="box-number">1</span></label> <input type="text" name="custom_sidebars[]" value="<?php echo $xx[0]; ?>" id="box1" /> <a href="#" class="remove-box">Remove</a> </p> <?php if($no>1){ for($i=1;$i<$no;$i++){ ?> <p class="text-box"><label for="box' + n + '">Sidebar-<span class="box-number"><?php echo $i+1; ?></span></label> <input type="text" name="custom_sidebars[]" value="<?php echo $xx[$i]; ?>" id="box' + n + '" /> <a href="#" class="remove-box">Remove</a> </p> <?php } } ?></div> <!--<a class="add-box" href="#">Add More</a>--> <button type="button" class="add-box">Add New Sidebar</button> </table> <input type="hidden" name="action" value="update" /> <input type="hidden" name="page_options" value="no_of_sidebar,sidebar_names,boxes" /> <p class="submit"> <input type="submit" class="button-primary clsSubmit" value="<?php _e('Save Changes') ?>" /> </p> </form> </div> </div> <?php } function my_custom_sidebars_notice() { echo '<div class="updated"><p>Sidebar(s) Updated.</p></div>'; } 

Теперь вы разрешили пользователям выбирать боковые панели для определенной страницы. Для этого вы можете добавить обмен. (См. [ add_meta_box ] [3] docs).

 add_action( 'add_meta_boxes', 'my_custom_sidebar_metabox' ); function my_custom_sidebar_metabox() { $screens = array( 'post', 'page' ); // add the metabox for pages and post foreach ( $screens as $screen ) { add_meta_box('my_custom_sidebar', 'Select a Sidebar','my_custom_sidebar_box', $screen); } } function my_custom_sidebar_box( $post ) { $sidebars = get_option('my_theme_sidebars'); // get all the sidebars names if ( empty($sidebars) ) { echo 'No custom sidebars registered.'; return; } wp_nonce_field( 'my_custom_sidebar', 'my_custom_sidebar_box_nonce' ); $value = get_post_meta( $post->ID, '_custom_sidebar', true ); // actual value echo '<label>Select a Sidebar</label> '; echo '<select name="custom_sidebar">'; // default option echo '<option value=""' . selected('', $value, false) . '>Default</option>'; // an option for every sidebar foreach ($sidebars as $sidebar) { if ( empty($sidebar) ) continue; $v = sanitize_title($sidebar); $n = esc_html($sidebar); echo '<option value="' . $v . '"' . selected($v, $value) .'>' .$n .'</option>'; } echo '<select>'; } По add_action( 'add_meta_boxes', 'my_custom_sidebar_metabox' ); function my_custom_sidebar_metabox() { $screens = array( 'post', 'page' ); // add the metabox for pages and post foreach ( $screens as $screen ) { add_meta_box('my_custom_sidebar', 'Select a Sidebar','my_custom_sidebar_box', $screen); } } function my_custom_sidebar_box( $post ) { $sidebars = get_option('my_theme_sidebars'); // get all the sidebars names if ( empty($sidebars) ) { echo 'No custom sidebars registered.'; return; } wp_nonce_field( 'my_custom_sidebar', 'my_custom_sidebar_box_nonce' ); $value = get_post_meta( $post->ID, '_custom_sidebar', true ); // actual value echo '<label>Select a Sidebar</label> '; echo '<select name="custom_sidebar">'; // default option echo '<option value=""' . selected('', $value, false) . '>Default</option>'; // an option for every sidebar foreach ($sidebars as $sidebar) { if ( empty($sidebar) ) continue; $v = sanitize_title($sidebar); $n = esc_html($sidebar); echo '<option value="' . $v . '"' . selected($v, $value) .'>' .$n .'</option>'; } echo '<select>'; } 

Затем добавьте функцию для сохранения метаболизма:

 add_action( 'save_post', 'my_custom_sidebar_metabox_save' ); function my_custom_sidebar_metabox_save( $post_id ) { // If this is an autosave, our form has not been submitted, do nothing. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return; // check nonce $nonce = filter_input(INPUT_POST, 'my_custom_sidebar_box_nonce', FILTER_SANITIZE_STRING); if ( empty($nonce) || ! wp_verify_nonce( $nonce, 'my_custom_sidebar' ) ) return; $type = get_post_type($post_id); // Check the user's permissions. $cap = ( 'page' === $type ) ? 'edit_page' : 'edit_post'; if ( ! current_user_can( $cap, $post_id ) ) return; $custom = filter_input(INPUT_POST, 'custom_sidebar', FILTER_SANITIZE_STRING); // Update the meta field in the database. if ( empty($custom) ) { delete_post_meta( $post_id, '_custom_sidebar'); } else { update_post_meta( $post_id, '_custom_sidebar', $custom ); } } 

Таким образом, ваши пользователи могут выбрать пользовательскую панель для каждой публикации или страницы. Он сохраняется в мета-поле « _custom_sidebar' .

Чтобы отобразить пользовательскую боковую панель, ваш sidebar.php должен содержать что-то вроде:

 // change the following according to your defaults sidebar if exists $sidebar = 'main_sidebar'; // if in singular post/page check for saved custom sidebar if ( is_singular() ) { $id = get_queried_object_id(); // get current post/page id $custom = get_post_meta( $id, '_custom_sidebar', true ); // get selected sidebar if ( ! empty($custom) ) $sidebar = $custom; } if ( is_active_sidebar( $sidebar ) ) { ?> <ul id="sidebar"><?php dynamic_sidebar( $sidebar ); ?></ul> <?php } ?> 

Наконец, на ваших страницах и сообщениях просто позвоните get_sidebar(); как обычно.

ОБНОВЛЕНО: создайте новый файл JavaScript для нескольких боковых панелей js / custom_sidebar.js

 ( function( $ ) { $('.my-form .add-box').click(function(){ var n = $('.text-box').length + 1; var box_html = $('<p class="text-box"><label for="box' + n + '">Sidebar-<span class="box-number">' + n + '</span></label> <input type="text" name="custom_sidebars[]" value="" id="box' + n + '" /> <a href="#" class="remove-box">Remove</a></p>'); box_html.hide(); $('#append').append(box_html); box_html.fadeIn('slow'); return false; }); $('.my-form').on('click', '.remove-box', function(){ $(this).parent().css( 'background-color', '#FF6C6C' ); $(this).parent().fadeOut("slow", function() { $(this).remove(); $('.box-number').each(function(index){ $(this).text( index + 1 ); }); }); return false; }); $('.clsSubmit').click(function(){ var m = $('.text-box').length; if(m==0){alert("press OK to Reset");} }); 

Наконец, на ваших страницах и сообщениях просто позвоните get_sidebar(); как обычно.