Как выбирать сайдбар при публикации записи WP?

Здравствуйте!

Подскажите пожалуйста, как сделать следующее:

У нас есть 8 сайбдабров с разным набором виджетов, и для разных записей необходим свой комплект виджетов (сайдбар)...вот как можно сделать выбор сайдбара при публикации...пока сделал путем привязки к категории - но это вариант не подходит, возможно можно вывести блок выбора шаблона записи ..или еще как?
  • Вопрос задан
  • 54 просмотра
Решения вопроса 1
DELUX
@DELUX Автор вопроса
В общем, вдруг кому понадобится:

1. В funtions.php добавляем это: (+ здесь я закомментировал кусок кода, который выводит весь список зарегистрированных сайдбаров, а в замен вывел список сайдбаров вручную - мне так нужно было..а вы уж сами смотрите..поэтому выкладываю весь код)
/**
 * Register meta boxes.
 */
function hcf_register_meta_boxes() {
    add_meta_box( 'hcf-1', __( 'Сайдбар для данной записи', 'hcf' ), 'wporg_custom_box_html', 'post', 'side' );
}
add_action( 'add_meta_boxes', 'hcf_register_meta_boxes' );



function wporg_custom_box_html($post)
{
    $value = get_post_meta($post->ID, '_wporg_meta_key', true);

 /* format setting outer wrapper */
    echo '<div class="format-setting type-sidebar-select ' . ( $has_desc ? 'has-desc' : 'no-desc' ) . '">';

      /* description */
      echo $has_desc ? '<div class="description">' . htmlspecialchars_decode( $field_desc ) . '</div>' : '';

      /* format setting inner wrapper */
      echo '<div class="format-setting-inner">';

        /* build page select */
        echo '<label for="clinics_sidebar">Выберите Сайдбар</label><select name="clinics_sidebar" id="clinics_sidebar" class="components-select-control__input">';

// Кастомный список
        echo '<option value="">-- ' . __( 'Выберите сайдбар', 'dart' ) . ' --</option>';
        echo '<option value="sidebar-1" id="sidebar-1"' . selected($value, 'sidebar-1') . '>' . __( 'Сайдбар #1', 'dart' ) . '</option>';
        echo '<option value="sidebar-2" id="sidebar-2"' . selected($value, 'sidebar-2') . '>' . __( 'Сайдбар #2', 'dart' ) . '</option>';
        echo '<option value="sidebar-3" id="sidebar-3"' . selected($value, 'sidebar-3') . '>' . __( 'Сайдбар #3', 'dart' ) . '</option>';
        echo '<option value="sidebar-4" id="sidebar-4"' . selected($value, 'sidebar-4') . '>' . __( 'Сайдбар #4', 'dart' ) . '</option>';
        echo '<option value="sidebar-5" id="sidebar-5"' . selected($value, 'sidebar-5') . '>' . __( 'Сайдбар #5', 'dart' ) . '</option>';
        echo '<option value="sidebar-6" id="sidebar-6"' . selected($value, 'sidebar-6') . '>' . __( 'Сайдбар #6', 'dart' ) . '</option>';
        echo '<option value="sidebar-7" id="sidebar-7"' . selected($value, 'sidebar-7') . '>' . __( 'Сайдбар #7', 'dart' ) . '</option>';
        echo '<option value="sidebar-8" id="sidebar-8"' . selected($value, 'sidebar-8') . '>' . __( 'Сайдбар #8', 'dart' ) . '</option>';
        echo '<option value="no-sidebar" id="no-sidebar"' . selected($value, 'no-sidebar') . '>' . __( 'Без сайдбара', 'dart' ) . '</option>';
// Кастомный список

        // /* get the registered sidebars */
        // global $wp_registered_sidebars;

        // $sidebars = array();
        // foreach( $wp_registered_sidebars as $id=>$sidebar ) {
        //   $sidebars[ $id ] = $sidebar[ 'name' ];
        // }

        // /* filters to restrict which sidebars are allowed to be selected, for example we can restrict footer sidebars to be selectable on a blog page */
        // $sidebars = apply_filters( 'recognized_sidebars', $sidebars );
        // $sidebars = apply_filters( 'recognized_sidebars_' . $field_id, $sidebars );

        // /* has sidebars */
        // if ( count( $sidebars ) ) {
        //   echo '<option value="">-- ' . __( 'Выберите сайдбар', 'dart' ) . ' --</option>';
        //   foreach ( $sidebars as $id => $sidebar ) {
        //     echo '<option value="' . esc_attr( $id ) . '"' . selected( $value, $id, false ) . '>' . esc_attr( $sidebar ) . '</option>';
        //   }
        // } else {
        //   echo '<option value="">' . __( 'No Sidebars', 'dart' ) . '</option>';
        // }

        echo '</select>';

      echo '</div>';

    echo '</div>';

    ?>
    <?php
}


function wporg_save_postdata($post_id)
{
    if (array_key_exists('clinics_sidebar', $_POST)) {
        update_post_meta(
            $post_id,
            '_wporg_meta_key',
            $_POST['clinics_sidebar']
        );
    }
}
add_action('save_post', 'wporg_save_postdata');


Теперь у вас на странице публикации записи в колонке справа появился блок "Сайдбар для данной записи"

И теперь, в шаблоне страницы записи - -single.php выводим следующий код:
<?php  
$custom_sidebar = esc_attr( get_post_meta( get_the_ID(), '_wporg_meta_key', true ) );

if($custom_sidebar == 'sidebar-1'){ 
?>

<nav id="sidebar" class="course">
   	<div>
	<?php if ( function_exists('dynamic_sidebar') )
				dynamic_sidebar('sidebar-1'); ?>
   		</div>
    </nav>

<?php 
 } elseif ($custom_sidebar == 'sidebar-2') {
?>
<nav id="sidebar" class="course">
   	<div>
	<?php if ( function_exists('dynamic_sidebar') )
				dynamic_sidebar('sidebar-2'); ?>
   		</div>
    </nav>

<?php 
 } elseif ($custom_sidebar == 'sidebar-3') {
?>
<nav id="sidebar" class="course">
   	<div>
	<?php if ( function_exists('dynamic_sidebar') )
				dynamic_sidebar('sidebar-3'); ?>
   		</div>
    </nav>

<?php 
 } elseif ($custom_sidebar == 'sidebar-4') {
?>
<nav id="sidebar" class="course">
   	<div>
	<?php if ( function_exists('dynamic_sidebar') )
				dynamic_sidebar('sidebar-4'); ?>
   		</div>
    </nav>

<?php 
 } elseif ($custom_sidebar == 'sidebar-5') {
?>
<nav id="sidebar" class="course">
   	<div>
	<?php if ( function_exists('dynamic_sidebar') )
				dynamic_sidebar('sidebar-5'); ?>
   		</div>
    </nav>

<?php 
 } elseif ($custom_sidebar == 'sidebar-6') {
?>
<nav id="sidebar" class="course">
   	<div>
	<?php if ( function_exists('dynamic_sidebar') )
				dynamic_sidebar('sidebar-6'); ?>
   		</div>
    </nav>

<?php 
 } elseif ($custom_sidebar == 'sidebar-7') {
?>
<nav id="sidebar" class="course">
   	<div>
	<?php if ( function_exists('dynamic_sidebar') )
				dynamic_sidebar('sidebar-7'); ?>
   		</div>
    </nav>

<?php 
 } elseif ($custom_sidebar == 'sidebar-8') {
?>
<nav id="sidebar" class="course">
   	<div>
	<?php if ( function_exists('dynamic_sidebar') )
				dynamic_sidebar('sidebar-8'); ?>
   		</div>
    </nav>

<?php  } else { ?>	
 <nav id="sidebar" class="course">
   	<div>
		<?php if ( function_exists('dynamic_sidebar') )
						dynamic_sidebar('news-sidebar'); ?>
   		</div>
    </nav>
<?php 
 }?>


У меня это идеально работает, может и вам поможет)
P.S yarovikov Тебе отдельное спасибо, в правильную сторону направил)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@weart
Написать метабокс, где вывести сайдбары в виде радио-батонов, и юзер будет отмечать нужный. Этот способ посложнее, но поинтереснее.
Вот тут информация к размышлению.
Ответ написан
Ну , вообще-то если у вас 8 типов записей то и 8 шаблонов может быть.
Отсюда, необходимо создать 8 шаблонов, в каждом указать свой сайдбар. Далее просто выбирать нужный шаблон в админке.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы