WordPress无限侧边栏

时间:2015-11-07 11:44:11

标签: wordpress wordpress-theming sidebar

只是想知道是否有人可以就如何为WordPress主题创建无限的侧边栏给我一些建议。

所以,基本上我正在考虑在帖子和页面上添加一个元框,其中包含所有可用侧边栏的下拉列表,然后用户可以为任何帖子或页面选择特定的侧边栏。这部分我已经想到了,但是我还想在这里添加功能,以允许用户为任何帖子或页面创建自定义侧边栏。因此,基本上用户可以为任何帖子或页面选择任何侧边栏,或者为任何帖子或页面创建新的侧边栏,然后可以在窗口小部件页面上填充小部件。

我在那里,只是不确定如何创建创建新侧边栏的功能。

2 个答案:

答案 0 :(得分:0)

给用户选择侧边栏的选项很好,但我不认为给他们创建自己的侧边栏的功能是一个好主意。您将很快遇到这样的问题:您的小部件区域中的每个侧边栏都有不同的帖子。

但是如果我在你的情况下,我会创建一个侧边栏,然后根据正在查看的帖子动态添加小部件到这个侧边栏。对于最终用户,两者看起来都是一样的。无论如何,这里没有正确或错误的答案,这取决于你想如何处理这种情况。

答案 1 :(得分:0)

有一种方法可以做到,但它有点冗长。

创建自定义程序控件以添加多个侧边栏

最简单的方法是从here获取名为多输入字段的自定义控件。此外,请务必添加此自定义控件以及随附的所有jQuery功能(在.js文件中)。

使用它,添加到您的自定义文件(或者如果您没有专用的自定义文件,则添加到您的functions.php文件)

if(!function_exists('yourtheme_text_sanitization')){
    function yourtheme_text_sanitization($input){
        return wp_kses_post( force_balance_tags($input) );
    }
}


/**
------------------------------------------------------------
SECTION: Sidebars
------------------------------------------------------------
**/
$wp_customize->add_section('section_sidebars', array(
    'title'     => esc_html__('Sidebars', 'yourtheme'),
    'priority'  => 0,
));


    /**
    Sidebars
    **/
    $wp_customize->add_setting('sidebars', array(
        'default'     => '',
        'sanitize_callback' => 'yourtheme_text_sanitization',
    ));
    $wp_customize->add_control(new Multi_Input_Custom_control($wp_customize, 'sidebars', array(
        'label'         => esc_html__( 'Sidebars', 'yourtheme' ),
        'description'   => esc_html__( 'Add as many custom sidebars as you need', 'yourtheme' ),
        'settings'      => 'sidebars',
        'section'       => 'section_sidebars',
    )));

第一个功能是定制器清理回调的清理功能。

所以现在你的外观>中应该有'Sidebars'自定义菜单。

动态创建侧边栏

但是现在你需要添加你的侧边栏。如果您有一个专门的侧边栏文件,例如sidebars.php,您可以在其中注册主题侧边栏,您可以将其放在那里,或放在functions.php文件中

if ( function_exists( 'register_sidebar' ) ) {
    $sidebars=get_theme_mod('sidebars','');
    if($sidebars!=''){
        $sidebars = explode('|', $sidebars);
        $i = 0;
        foreach($sidebars as $sidebar){
            $i++;
            register_sidebar(array(
                'name'=>$sidebar,
                'id' => 'sidebar-'.$i,
                'before_widget' => '<div id="%1$s" class="widget %2$s">',
                'after_widget' => '</div>',
                'before_title' => '<div class="sidebar-widget-heading"><h3>',
                'after_title' => '</h3></div>',
            ));
        }
    }
}

这是您需要的最小值,以便您可以在主题中添加多个侧边栏,它们应显示在外观&gt;窗口小部件。

添加侧边栏元数据

现在添加元数据框以显示它们相对容易。在您的functions.php或单独的文件中,您可以在帖子/网页/ CPT中添加元数据,添加

// Add metabox
add_action('admin_init', 'yourtheme_post_add_meta');
if ( ! function_exists( 'yourtheme_post_add_meta' ) ){
    function yourtheme_post_add_meta(){
        add_meta_box('post-sidebar', esc_html__('Select Sidebar', 'yourtheme'), 'yourtheme_post_sidebar_meta_box', 'post');
    }
}

//Metabox
if ( ! function_exists( 'yourtheme_post_sidebar_meta_box' ) ){
    function yourtheme_post_sidebar_meta_box( $post ){
        $values = get_post_custom( $post->ID );
        $custom_sidebar = (isset($values['custom_sidebar'][0])) ? $values['custom_sidebar'][0] : '';
        wp_nonce_field( 'my_meta_box_sidebar_nonce', 'meta_box_sidebar_nonce' );
        ?>
        <p>
            <select name="custom_sidebar" id="custom_sidebar">
                <?php
                global $wp_registered_sidebars;
                $sidebar_replacements = $wp_registered_sidebars;
                if(is_array($sidebar_replacements) && !empty($sidebar_replacements)){
                    foreach($sidebar_replacements as $sidebar){
                        echo "<option value='{$sidebar['name']}'".selected($sidebar['name'], $custom_sidebar, false).">{$sidebar['name']}</option>";
                    }
                }
                ?>
            </select>
        </p>
        <?php
    }
}

//Save Metabox
add_action( 'save_post', 'yourtheme_post_save_sidebar_meta_box' );
if ( ! function_exists( 'yourtheme_post_save_sidebar_meta_box' ) ){
    function yourtheme_post_save_sidebar_meta_box( $post_id ){
        if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ){
            return;
        }
        if( !isset( $_POST['custom_sidebar'] ) || !wp_verify_nonce( $_POST['meta_box_sidebar_nonce'], 'my_meta_box_sidebar_nonce' ) ) {
            return;
        }
        if( !current_user_can( 'edit_pages' ) ) {
            return;
        }
        if( isset( $_POST['custom_sidebar'] ) ){
            update_post_meta( $post_id, 'custom_sidebar', wp_kses( $_POST['custom_sidebar'] ,'') );
        }
    }
}

这应该是它。有点冗长,但可以根据需要为主题添加多个侧边栏:)

希望它有所帮助。