Gutenberg maakt het gemakkelijk om met blokken content op te bouwen, maar soms heb je controle nodig over welke blokken beschikbaar zijn. Misschien werk je aan een site van een klant en wil je voorkomen dat ze bepaalde blokken gaan gebruiken. Of misschien wil je de bewerkingservaring stroomlijnen door overbodige opties te verwijderen.

In deze gids bekijken we verschillende manieren om Gutenberg blokken uit te schakelen, waaronder:

  • De WordPress gebruikersinterface (UI) gebruiken om blokken in de inserter te verbergen
  • Blokken vergrendelen om te voorkomen dat ze verplaatst of verwijderd worden
  • Afdwingen van blokbeperkingen met PHP, inclusief op rollen gebaseerde toegang

Dat gezegd hebbende, zullen we niet ingaan op de zichtbaarheid van blokken (inhoud tonen/verbergen op basis van voorwaarden) of het uitschakelen van specifieke blokinstellingen zoals tekst of achtergrondkleuren, wat wordt afgehandeld in theme.json. We zullen het echter wel hebben over blokvergrendeling, omdat dit nauw verwant is aan het uitschakelen van blokken.

Alle methoden in deze gids werken zonder plugins en zijn van toepassing op elk thema dat op blokken is gebaseerd. Tijd om aan de slag te gaan!

Blokken uitschakelen met de WordPress UI

Het verwijderen van onnodige blokken helpt bij het stroomlijnen van de bewerkingservaring en kan de backend prestaties enigszins verbeteren, omdat uitgeschakelde blokken niet in het geheugen worden geladen.

Elke gebruiker kan blokken uitschakelen via het Preferences menu in de blokkeneditor. Je kunt dit doen door te klikken op het menu Setting (⋮) met drie puntjes in de rechterbovenhoek om de voorkeuren van de editor te openen. Vervolgens kunnen gebruikers onder het tabblad Blocks elk blok uitvinken om het te verwijderen uit de blok inserter.

Je kunt bijvoorbeeld het blok Quote uitschakelen door het vakje simpelweg uit te vinken, zoals hieronder te zien is.

Quote blok uitgeschakeld in Preferences
Deze Preferences popup toont dat het Quote blok is uitgeschakeld.

Als je meer wil, kun je zelfs een hele blokcategorie uitschakelen. Als je bijvoorbeeld de categorie Text uitschakelt, worden alle tekstgerelateerde blokken uit de invoegtoepassing verwijderd, zodat ze niet langer beschikbaar zijn voor gebruik. Dit kan handig zijn om de editor te stroomlijnen en om te voorkomen dat gebruikers onnodige blokken gebruiken.

Een weergave van het voorkeurenvenster voor blokken laat zien dat de categorie Text is uitgeschakeld.
Een weergave van het voorkeurenvenster voor blokken laat zien dat de categorie Text is uitgeschakeld.

Blokken uitschakelen met PHP

Er zijn twee fundamentele en zeer verschillende benaderingen om het gebruik van een blok toe te staan of te voorkomen met WordPress. Afhankelijk van je behoeften kun je ervoor kiezen om toe te staan of te weigeren dat een blok beschikbaar is in de inserter.

Beide benaderingen kunnen worden geïmplementeerd met PHP of JavaScript, elk met zijn eigen voor- en nadelen. PHP is over het algemeen eenvoudiger voor het toestaan van blokken, terwijl JavaScript vaak efficiënter is voor het weigeren van blokken.

We gebruiken PHP voor al onze voorbeelden om verschillende gebruikssituaties te demonstreren.

Blokken toestaan

Om alleen specifieke blokken toe te staan in de inserter, gebruik je het volgende filter. Dit zorgt ervoor dat alleen de aangewezen blokken beschikbaar zijn voor alle gebruikers:

add_filter('allowed_block_types_all', 'allowed_block_types_all_users', 10, 2 );

function allowed_block_types_all_users( $allowed_blocks, $block_editor_context ) {
    return array(
        'core/paragraph',
        'core/heading',
        'core/image',
        'core/cover',
        'core/list',
        'core/list-item'
    );
}

Deze code moet worden toegevoegd aan het functions.php bestand van een childthema om te voorkomen dat wijzigingen verloren gaan wanneer het thema wordt bijgewerkt.

Als je deze methode gebruikt, zorg er dan voor dat alle benodigde childblokken zijn opgenomen. Als je bijvoorbeeld het blok core/list toestaat, moet je ook core/list-item opnemen om fouten te voorkomen.

Blokken uit de lijst toestaan.
Blokken uit de lijst toestaan.

Het allowed_block_types_all filter geeft ontwikkelaars controle over de blokken die beschikbaar zijn in de inserter. Het accepteert twee parameters:

  • $allowed_block_types – Een array of boolean die de toegestane blokken definieert (standaard: true).
  • $block_editor_context – Geeft informatie over de huidige status van de blokeditor, inclusief het bericht dat wordt bewerkt.

Specifieke blokken toestaan voor contributors en auteurs

De volgende code beperkt de beschikbare blokken voor gebruikers zonder de mogelijkheid publish_pages (contributors en auteurs):

add_filter('allowed_block_types_all', 'allowed_block_types_for_non_admins', 10, 2);

function allowed_block_types_for_non_admins($allowed_blocks, $block_editor_context) {
    // Apply restrictions if the user does not have the 'publish_pages' capability
    if (!current_user_can('publish_pages')) {
        // Define the allowed blocks for users without 'publish_pages' capability
        $allowed_blocks = array(
            'core/paragraph',
            'core/heading',
            'core/image',
            'core/cover',
            'core/list',
            'core/list-item'
        );
    }
    return $allowed_blocks;
}

In het bovenstaande voorbeeld kunnen contributors en auteurs alleen de blokken Paragraph, Heading, Image, Cover, List en List Item gebruiken.

Blokken toestaan voor specifieke berichttypen en gebruikers

De volgende code voegt het Shortcode blok toe aan de inserter bij het bewerken van een pagina, maar houdt het onbeschikbaar voor andere berichttypen:

add_filter('allowed_block_types_all', 'allowed_block_types', 25, 2);

function allowed_block_types($allowed_blocks, $editor_context) {
    $allowed_blocks = array(
        'core/paragraph',   
        'core/heading',    
        'core/image',      
        'core/cover',      
        'core/list',       
        'core/list-item'
    );

    // Check if the editor context has a post object and if its type is 'page'
    if (!empty($editor_context->post) && 'page' === $editor_context->post->post_type) {
        $allowed_blocks[] = 'core/shortcode';
    }

    return $allowed_blocks;
}

Houd er rekening mee dat, omdat contributors en auteurs geen pagina’s kunnen maken of wijzigen, het resultaat alleen in een bericht zal verschijnen.

Alle gebruikers zien alleen zes blokken, maar administrators en redacteuren zien ook het shortcodeblok dat alleen beschikbaar is voor een pagina.

Het shortcodeblok is alleen beschikbaar voor administrators en redacteuren voor een pagina.
Het shortcodeblok is alleen beschikbaar voor administrators en redacteuren voor een pagina.

In ons voorbeeld is de invloed hiervan op contributors en auteurs nihil, omdat zij standaard geen nieuwe pagina’s kunnen toevoegen. Het gebruik van een Role Manager plugin zou die mogelijkheid echter kunnen veranderen.

Blokken toestaan op basis van bericht-ID

Als er gevallen zijn waarin je een set blokken alleen wilt toestaan voor bepaalde berichten, dan kun je dat hier doen:

add_filter('allowed_block_types_all', 'allowed_block_types', 10, 2);

function allowed_block_types($allowed_blocks, $editor_context) {
    // Check if the editor context has a post object
    if (!empty($editor_context->post)) {
        $post_id = $editor_context->post->ID;

        // Define allowed blocks for specific post IDs
        $allowed_blocks_by_post = array(
            2 => array('core/paragraph', 'core/heading', 'core/image'),
            3 => array('core/paragraph', 'core/heading', 'core/image')
        );

        // Check if the current post ID has a defined allowed blocks array
        if (array_key_exists($post_id, $allowed_blocks_by_post)) {
            return $allowed_blocks_by_post[$post_id];
        }
    }
    return $allowed_blocks;
}

In dit voorbeeld zullen alleen Paragraph, Heading en Image blokken beschikbaar zijn voor post-ID’s 2 en 3.

Deze drie blokken zijn alleen beschikbaar voor twee ID's.
Deze drie blokken zijn alleen beschikbaar voor twee ID’s.

Dit is prima voor een kleine set post-ID’s. Maar als je een dynamische situatie hebt waarin voortdurend pagina’s of berichten worden toegevoegd, overweeg dan om te filteren op taxonomieën en aangepaste velden.

Blokken weigeren

Allow-listing is impliciet een vorm van deny-listing, omdat blokken die niet beschikbaar zijn worden geweigerd. Maar je kunt een omgekeerde benadering gebruiken als je liever de meeste blokken toestaat, behalve een paar. In dit voorbeeld zijn de blokken Heading en Cover niet langer beschikbaar voor gebruikers.

add_filter('allowed_block_types_all', 'deny_blocks');

function deny_blocks($allowed_blocks) {
    // Get all registered blocks
    $blocks = WP_Block_Type_Registry::get_instance()->get_all_registered();

    // Disable two specific blocks
    unset($blocks['core/heading']);
    unset($blocks['core/cover']);

    return array_keys($blocks);
}

In feite vinden we alle geregistreerde blokken en verwijderen dan de blokken Heading en Cover.

Wees voorzichtig als je denkt dat je elk blok met deze methode kunt verwijderen. Als een blok – core of anders – is geregistreerd met JavaScript, moet je het afmelden met JavaScript.

Gehele blokcategorieën weigeren

Als je hele categorieën blokken wilt verwijderen, zoals Widgets, Embeds of Theme blokken, gebruik dan deze aanpak:

add_filter('allowed_block_types_all', 'disable_blocks_by_categories', 10, 2);

function disable_blocks_by_categories($allowed_blocks, $editor_context) {
    // Get all registered blocks
    $registered_blocks = WP_Block_Type_Registry::get_instance()->get_all_registered();

    // Specify the categories to disable
    $categories_to_disable = array('widgets', 'embed', 'theme');

    // Initialize an array to hold allowed block names
    $allowed_block_names = array();

    // Loop through registered blocks
    foreach ($registered_blocks as $block_name => $block_type) {
        // Check if the block has categories defined
        if (isset($block_type->category)) {
            // If the block's category is NOT in the disabled list, allow it
            if (!in_array($block_type->category, $categories_to_disable, true)) {
                $allowed_block_names[] = $block_name;
            }
        } else {
            // If the block has no category defined, allow it by default
            $allowed_block_names[] = $block_name;
        }
    }
    return $allowed_block_names;
}

Deze aanpak filtert hele categorieën blokken uit, wat de ervaring van de blokkeneditor vereenvoudigt.

Widgets, embedden en thema blokken categorieën zijn verwijderd.
Widgets, embedden en thema blokken categorieën zijn verwijderd.

Blokken vergrendelen met de WordPress UI

Door een blok te vergrendelen voorkom je dat het verplaatst of verwijderd kan worden, terwijl het nog steeds mogelijk is om content te bewerken. Elke gebruiker kan een blok op elk moment vergrendelen of ontgrendelen met de Lock optie in de blokkentoolbar.

Om een blok te vergrendelen of te ontgrendelen, klik je op de drie-punt Settings (⋮) op het blok, klik je op Lock en vervolgens selecteer je de optie Lock all om automatisch zowel Verplaatsen als Verwijderen te voorkomen, maar deze opties kunnen ook afzonderlijk worden toegepast.

De Lock modal toont de beschikbare opties voor een enkel blok.
De Lock modal toont de beschikbare opties voor een enkel blok.

Het is belangrijk om te weten dat zelfs als een blok is vergrendeld, gebruikers nog steeds de inhoud en stijl ervan kunnen wijzigen, tenzij er verdere beperkingen worden toegepast.

Het voorkomen van stylingwijzigingen is niet mogelijk met de Lock feature. Om de styling van een blok te beperken, moeten er wijzigingen worden aangebracht in het theme.json bestand.

Voor blokken die nested elementen bevatten, is er een extra optie om alleen het bovenliggende blok te blokkeren of ook alle binnenliggende blokken te blokkeren. Dit zorgt ervoor dat gegroepeerde elementen gestructureerd blijven, terwijl er toch gecontroleerde bewerkingen binnen mogelijk zijn.

De Lock modal toont de beschikbare opties voor een parent blok.
De Lock modal toont de beschikbare opties voor een parent blok.

Blokken vergrendelen met PHP

Hoewel de WordPress UI simpele blokvergrendeling biedt, legt het geen beperkingen op voor de hele site. Elke gebruiker met editor-toegang kan een blok ontgrendelen, waardoor het gemakkelijk is om vergrendelde inhoud te overschrijven. Om het blokkeren van blokken permanent te beperken, is PHP de beste oplossing.

Met PHP kun je de mogelijkheid om blokken te vergrendelen en te ontgrendelen volledig verwijderen, zodat geen enkele gebruiker de beperkingen kan omzeilen. Dit is hoe WordPress werkte voor de release van WordPress 5.9, toen blokvergrendeling werd geïntroduceerd.

Blokvergrendeling is nuttig in veel scenario’s, vooral bij het onderhouden van gestructureerde inhoud. Door blokbeperkingen af te dwingen met PHP kun je:

  • De integriteit van het ontwerp behouden door te voorkomen dat gebruikers belangrijke blokken wijzigen.
  • Onbedoelde bewerkingen voorkomen die lay-outs kunnen afbreken.
  • Het maken van inhoud stroomlijnen door onnodige opties te beperken.
  • Zorgen voor consistentie in patronen en sjablonen, vooral voor klantprojecten.

Blokkeerfunctie verwijderen voor alle gebruikers

Het volgende PHP fragment schakelt blokvergrendeling volledig uit, zodat geen enkele gebruiker blokken kan vergrendelen of ontgrendelen:

add_filter('block_editor_settings_all', 'example_disable_block_locking', 10, 2);

function example_disable_block_locking($settings, $context) {
   $settings['canLockBlocks'] = false; 
   return $settings;
}

Als dit wordt toegepast, wordt de blokvergrendelingsfeature volledig verwijderd uit de blokeditor. Gebruikers zien de vergrendelopties niet en niemand, ongeacht zijn rol, kan blokken vergrendelen of ontgrendelen.

Voor gebruikers die hun site hosten bij Kinsta is het aanbrengen van wijzigingen in themabestanden eenvoudig en veilig met SFTP, dat standaard is ingeschakeld voor alle WordPress sites.

Blokvergrendeling beperken op basis van gebruikersrollen

In plaats van blokvergrendeling helemaal te verwijderen, wil je misschien beperken wie blokken kan vergrendelen en ontgrendelen. Met het volgende PHP fragment kunnen alleen administrators en redacteuren blokvergrendelingen wijzigen, terwijl auteurs en contributors geen blok kunnen ontgrendelen dat door een administrator of redacteur is ingesteld.

add_filter('block_editor_settings_all', 'example_disable_block', 10, 2);

function example_disable_block ($settings, $context ) {
   if (
       isset( $context->post ) &&
       'post' === $context->post->post_type &&
       ! current_user_can( 'edit_theme_options' )
   ) {
       $settings['canLockBlocks'] = false; 
       $settings['codeEditingEnabled'] = false;   
   }
   return $settings;
}

Deze aanpak beperkt de blokcontrole tot gebruikers met de mogelijkheid edit_theme_options, meestal beheerders en bewerkers. Auteurs en medewerkers kunnen geen blokken ontgrendelen die zijn ingesteld door gebruikers van een hoger niveau.

Daarnaast is de toegang tot de Code Editor uitgeschakeld, zodat gebruikers niet handmatig blokmarkeringen kunnen wijzigen om beperkingen te omzeilen. Dit zorgt ervoor dat vergrendelde blokken onveranderd blijven, zelfs door gebruikers met codeerkennis.

Samenvatting

De keuze om blokken toe te staan of te weigeren – of een combinatie van beide – hangt af van je specifieke behoeften. Misschien wil je bepaalde blokken beperken voor een strakkere bewerkingservaring, ontwerpconsistentie afdwingen of toegang regelen op basis van gebruikersrollen.

Over gebruikersrollen gesproken: mogelijkheden kunnen worden aangepast om verder aan te passen hoe blokken worden beheerd. Dit opent nog meer mogelijkheden dan wat we hier hebben behandeld.

Houd in gedachten dat WordPress in de loop van de tijd evolueert. Toekomstige updates kunnen nieuwe manieren introduceren om blokken te beheren of bestaande functionaliteit aanpassen, dus op de hoogte blijven van de ontwikkelingen van WordPress is belangrijk om ervoor te zorgen dat je aanpak effectief blijft.

Ben je op zoek naar een veilige en ontwikkelaarvriendelijke hostingoplossing? Kinsta maakt het eenvoudig om je WordPress bestanden te beheren, inclusief het bewerken van themabestanden via SFTP, zodat je veilige en naadloze aanpassingen kunt doen zonder de stabiliteit van je site in gevaar te brengen.

Bud Kraus

Bud Kraus has been working with WordPress as an in-class and online instructor, site developer, and content creator since 2009. He has produced instructional videos and written many articles for WordPress businesses.