替换自定义帖子类型上的边栏内容

时间:2021-08-08 作者:Tioata

抱歉,如果这是一个愚蠢的问题,但我对php和wordpress开发相对较新。

我正在编写一个带有自定义帖子类型(课程)的插件,其中父页面是课程概述,子页面是课程。

现在,我的目标是替换侧栏的内容。如果页面是父cpt,则应显示侧栏a的内容。如果页面是子cpt,则应显示侧栏B的内容。

所以我要做的是停止加载普通主题侧栏的小部件,并用侧栏a或b中的小部件替换它们。

I was able to:

  • create a dropdown in the backend, where the sidebar which should be replaced can be selected.
  • register two new sidebars (在design>;widgets中)(带有register\\u侧栏)
  • check if the page is a parent cpt or a child ctp
    if(单数(\'courses\')&&$发布->;post\\u父级(&U)&;是活动的\\u侧边栏(\'课程侧边栏\')还是if(是单数(\'课程\')&&$发布->;post\\u父级(&U)&;是否处于活动状态\\u侧栏(“课程概述侧栏”)

But what I do not understand is, how to tell WordPress to stop loading the widgets from the normal sidebar, but from one of the new sidebars!?

我尝试了很多方法,并认为我找到了一个解决方案,在之前使用dynamic\\u sidebar\\u注入小部件,然后使用“停止渲染普通侧栏”;退出“;,但这会导致不必要的问题(例如,移动菜单不再可见等)

顺便说一下:我需要独立于主题的解决方案:)

我真的希望有人能帮助我!提前非常感谢!顺致敬意,蒂奥塔

1 个回复
最合适的回答,由SO网友:Tioata 整理而成

经过大量的尝试和测试,我想我找到了一个解决方案:

add_filter( \'sidebars_widgets\', \'exchange_sidebars\', 10);

function exchange_sidebars( $sidebars_widgets ){
    global $post;
    // Define the sidebar which should be exchanged
    $selected_sidebar = \'sidebar-1\'

    // IF we are on a custom post type
    // AND it is a Child Page (= page has post_parent)
    // THEN change selected sidebare with courses-lessons sidebar
    if ( is_singular(\'courses\') && $post->post_parent && $sidebars_widgets[\'courses-lessons-sidebar\'] ) {
        $sidebars_widgets[$selected_sidebar] = $sidebars_widgets[\'courses-lessons-sidebar\'];

    // IF we are on a custom post type
    // AND it is a Parent Page (= page has no post_parent)
    // THEN change selected sidebare with courses-overview sidebar
    }elseif( is_singular(\'courses\') && !$post->post_parent && $sidebars_widgets[\'courses-overview-sidebar\'] ) {
        $sidebars_widgets[$selected_sidebar] = $sidebars_widgets[\'courses-overview-sidebar\'];
    }
    return $sidebars_widgets;
}
以防其他人对解决方案感兴趣;)

相关推荐

My widgets do not save

每次我保存我的小部件并离开页面时,我的小部件都会消失。侧边栏已完全清空,不会保存任何更改。控制台或PHP日志中没有任何错误。如果我将小部件直接复制并保存在数据库中widgets_text, 它们将被显示,但我仍然无法在侧边栏中添加或删除任何内容。这只发生在我的右侧边栏上,左侧边栏工作正常,但它们都以相同的方式注册。这是我注册侧边栏的方式:function my_widgets_init() { register_sidebar( array ( \'name\'