Peut-on exclure l'affichage et la modification de certains fichiers dans l'éditeur de thème?
En général, je ne recommanderais pas de modifier les fichiers de cette façon et de simplement le désactiver avec les constantes bien connues DISALLOW_FILE_EDIT
ou DISALLOW_FILE_MODS
, vérifiées dans la fonction map_meta_cap()
.
Quoi qu'il en soit, il est intéressant de voir si nous pouvons trouver un moyen d'exclure des fichiers de l'éditeur de thèmes. Voici quelques idées:
Il ne semble pas y avoir de filtre explicite sur les fichiers autorisés utilisés dans l'éditeur de thème:
$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;
Mais nous pourrions empêcher la mise à jour du fichier avec:
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 );
Notez que je suis plutôt paresseux ici avec la vérification de fichier/thème, alors cela pourrait être amélioré ;-)
Maintenant, le message d'erreur ne s'affiche que lorsque nous avons modifié le fichier et appuyé sur le bouton
Update File bouton. Cela pourrait être une expérience utilisateur frustrée.
Nous pourrions à la place arrêter la sortie de l'écran dès que nous cliquons sur le lien de modification de fichier. Ce n’est pas non plus une excellente expérience utilisateur, mais meilleur que l’autre.
Nous pourrions donc ajouter ceci à l'exemple précédent:
Ici, nous désactivons la fonctionnalité edit_theme
, pour tous les utilisateurs, sur l'écran theme-editor.php
, lorsque les paramètres GET file
et theme
ont certaines valeurs.
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 );
});
ou utilisez plutôt le filtre map_meta_cap
. Mais cela semble plutôt compliqué, alors simplifions cela:
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!" ) );
});
Une autre approche consisterait à supprimer les fichiers de la zone de sélection avec Javascript.