从主题编辑器中排除文件

时间:2015-09-05 作者:Mattia Del Franco

是否可以排除在主题编辑器中查看和修改某些文件?

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

一般来说,我不建议以这种方式编辑文件,只建议使用已知的DISALLOW_FILE_EDITDISALLOW_FILE_MODSmap_meta_cap() 作用

但不管怎样,看看我们是否能找到一种从主题编辑器中排除文件的方法是很有趣的。以下是一些想法:

主题编辑器中使用的允许文件似乎没有明确的过滤器:

$allowed_files = $theme->get_files( \'php\', 1 );
$has_templates = ! empty( $allowed_files );
$style_files = $theme->get_files( \'css\' );
$allowed_files[\'style.css\'] = $style_files[\'style.css\'];
$allowed_files += $style_files;
但我们可以通过以下方式阻止文件更新:

示例#1

add_action( \'check_admin_referer\', function( $action, $result )
{   
    // Edit this to your needs
    $locked_file  = \'404.php\';
    $locked_theme = \'twentyfifteen\';

    // Disallow editing for this file
    if( 
           false !== strpos( $action, \'edit-theme_\' ) 
        && false !== strpos( $action, $locked_theme . \'/\' . $locked_file ) 
    ) 
        wp_die( __( "Sorry, you can\'t edit this file!" ) );

}, 10, 2 );
请注意,我在这里对文件/主题检查比较懒惰,因此可以改进;-)

现在,只有在编辑文件并按下

更新文件按钮。这可能会让用户体验受挫。

我们可以在单击文件编辑链接时立即停止屏幕输出。这也不是很好的用户体验,但比另一种更好。

因此,我们可以在前面的示例中添加以下内容:

示例#2

这里我们禁用edit_theme 针对所有用户,在theme-editor.php 屏幕,当获取参数时filetheme 具有特定值。

add_action( \'load-theme-editor.php\', function()
{   
    add_filter( \'user_has_cap\', function( $allcaps, $caps, $args, $wp_user )
    {
        // Edit this to your needs
        $locked_file  = \'404.php\';
        $locked_theme = \'twentyfifteen\';

        // Disallow editing for this file
        $file   = filter_input( INPUT_GET, \'file\', FILTER_SANITIZE_STRING );
        $theme  = filter_input( INPUT_GET, \'theme\', FILTER_SANITIZE_STRING );       
        if( 
               isset( $allcaps[\'edit_themes\'] ) 
            && $locked_file === $file 
            && $locked_theme === $theme 
            && isset( $args[0] ) 
            && \'edit_themes\' === $args[0] 
            && isset( $args[1] ) 
            && 1 == $args[1] 
        )
            $allcaps[\'edit_themes\'] = 0;

        return $allcaps;
    }, 10, 4 );
});
或使用map_meta_cap 改为过滤。但这看起来相当复杂,所以让我们把它简化为:

add_action( \'load-theme-editor.php\', function()
{   
    // Edit this to your needs
    $locked_file  = \'404.php\';
    $locked_theme = \'twentyfifteen\';

    // Disallow editing for this file
    $file   = filter_input( INPUT_GET, \'file\', FILTER_SANITIZE_STRING );
    $theme  = filter_input( INPUT_GET, \'theme\', FILTER_SANITIZE_STRING );

    if( 
          $locked_file === $file 
        && $locked_theme === $theme 
    )
        wp_die( __( "Sorry, you can\'t edit this file!" ) );

});
另一种方法是使用Javascript从选择框中删除文件。

相关推荐

Swap themes locally

我有一个问题,我的“添加新插件”按钮不起作用,它也不会出现在普通菜单上。我在线搜索,建议的解决方案是交换主题,以检查主题是否冲突或禁用了一些wp核心。我有这个网站已经在生产中,我想改变它本地到另一个主题只是为了测试。我该怎么做?我尽量避免发布登台环境,因为它非常耗时,我只需要调试这一个问题。提前谢谢。