如何仅在某些页面或页面上自定义小部件的一部分

时间:2019-01-17 作者:avocadoras

我使用的是2019个默认Wordpress主题,但我想知道如何删除这一行<?php get_template_part( \'template-parts/footer/footer\', \'widgets\' ); ?> 仅在中的某些页面上footer.php. 类似于此帖子:How to add a specific widget to only 1 page?. 基本上,我想知道如何在某些页面上更改子主题中的小部件部分。

1 个回复
SO网友:Loren Rosen

我认为没有一种简单的方法可以强制WordPress排除模板部分,或加载不同的模板部分。看见12 对于某些堆栈交换讨论和解决方法。但是在widget的特殊情况下,您可以实现一个过滤器(即,widget_display_callback) 您可以在其中检查小部件的显示位置,以及它可能显示在什么类型的页面上,并告诉WordPress不要显示它(通过返回FALSE). 查看Stack Exchange的更多信息3 和WordPress代码参考4.

就解决方法而言,最简单的方法可能是使用CSSdisplay: none 要使浏览器不在某些页面上显示小部件(或者可能是整个小部件区域)(如果需要,可以通过简单的方法来增加body标记的CSS类,以指示它是什么类型的页面)。

Edit: addition

考虑到你会想做一个儿童主题,而第219个主题组织得很好,我想到了几个选择,应该很简单
具有特殊模板部分的子主题
在子主题中,制作template-parts 目录,生成footer 目录,然后复制template-parts/footer/footer-widgets.php 从二一九主题到你孩子主题的相应位置。修改副本以添加您的条件;像这样的
if ( is_active_sidebar( \'sidebar-1\' ) ) : ?>

    <aside class="widget-area" role="complementary" aria-label="<?php esc_attr_e( \'Footer\', \'twentynineteen\' ); ?>">
        <?php
            $cats = get_the_category();
            $cat_name = $cats[0]->name;
            print_r($cat_name);

            if ( is_active_sidebar( \'sidebar-1\' ) and
                (strcasecmp(\'category with no footer widgets\', $cat_name) == 0)) {
                ?>
                    <div class="widget-column footer-widget-1">
                        <?php dynamic_sidebar( \'sidebar-1\' ); ?>
                    </div>
                <?php
            }
        ?>
    </aside><!-- .widget-area -->

<?php endif; ?>
侧栏\\u窗口小部件过滤器使用sidebars_widgets 过滤以完全删除小部件区域。类似于add\\u filter(\'sidebars\\u widgets\',\'remove\\u footer\\u widget\\u area\');

function remove_footer_widget_area( $sidebars_widgets ) {
                $cats = get_the_category();
                $cat_name = $cats[0]->name;
                if( (strcasecmp(\'category with no footer widgets\', $cat_name) == 0) ) { 
                    unset($sidebars_widgets[\'sidebar-1\']);
                }
                return $sidebars_widgets;
            }
请参见5

一些注意事项:我假设是否显示小部件的测试取决于页面的类别,而页面仅在一个类别中。根据需要进行修改
-由于历史原因,\'sidebars\' 这里真的意味着\'widget areas\'. WordPress充满了这样的时代错误
-另一个错误是函数名get_the_category(), 它获取一个类别数组。所以它真的应该被称为get_the_categories().
-第二种方法从父主题复制和修改模板文件。但模板很小,不太可能改变。