Hollands Spoor

The Notebooks

  • Vastgestelde Paginering

    Samenvatting: een gebruikelijke manier om paginering weer te geven is om de link ‘vorige pagina’ aan de linkerkant van de bladspiegel uit te lijnen, de link ‘volgende pagina’ aan de rechterkant en de pagina nummers ergens in het midden. Dit kan bereikt worden door in de taakbalk van het paginering-blok te kiezen voor ‘Wijzig uitvulling van items’ en dan voor ‘Afstand tussen items’. Deze layout houdt evenwel geen stand als de eerste of laatste pagina van de Query loop bereikt wordt. Dan worden de elementen ‘vorige pagina’ respectievelijk ‘volgende pagina’ niet weergegeven en zal de uitlijning van de items plotseling veranderen. In deze notitie worden twee pragmatische oplossingen voorgesteld.

    Het Gutenberg paginering-blok kan in een Query loop-block worden opgenomen en bevat zelf drie blokken: een blok dat een link toont naar de vorige pagina, een blok met een link naar de volgende pagina en een blok met pagina nummers. De blokken ‘vorige’ en ‘volgende’ kunnen een pijl tonen, een tekst of allebei.

    Een voor de hand liggende weergave hiervan is om de pijl naar links uit te lijnen met de linkermarge, de pijl naar rechts met de rechtermarge en de paginanummers er in het midden tussen te zetten. Om dat te bereiken kies je in de taakbalk van het paginering-blok voor ‘Wijzig uitvulling van items’ en vervolgens voor ‘Afstand tussen items’.

    Dit werkt, maar deze uitlijning houdt geen stand op de eerste en laatste pagina van de getoonde berichten. Dit komt doordat het blok ‘Vorige pagina’ niet als een leeg item wordt getoond als er geen vorige pagina is, maar in het geheel niet. Dan heeft het paginering-blok opeens nog maar twee items en die worden dan anders uitgevuld: de paginanummer verhuizen naar de linkermarge.

    Ikzelf vind het in de meeste gevallen wenselijk dat die navigatie-elementen op een vaste plaats blijven staan en niet verspringen als je bladert.

    Een eerste gedachte om dit te bereiken was om de drie sub-blokken van het paginering-blok los te gebruiken. Ik maakte een kolom-blok met drie kolommen met de bedoeling in iedere kolom een van de paginering-elementen te plaatsen. Op die manier zou, bij afwezigheid van een van de paginering-elementen, de layout in stand blijven want de kolommen blijven op hun plaats.

    Ik nam daarbij aan dat deze sub-blokken zelfstandig kunnen functioneren doordat ze hun context ontvangen van het Query-loop block. Helaas bleek het niet mogelijk de paginering-onderdelen los te gebruiken.


    In het block-metabestand (block.json) van het query-pagination-previous blok is te zien dat alleen het pagination blok is toegestaan als moederblok:

    {
    	"$schema": "https://schemas.wp.org/trunk/block.json",
    	"apiVersion": 3,
    	"name": "core/query-pagination-previous",
    	"title": "Previous Page",
    	"category": "theme",
    	"parent": [ "core/query-pagination" ],
    	"description": "Displays the previous posts page link.",

    Je kunt het Vorige-pagina blok niet het paginering-blok uit slepen naar bijvoorbeeld een leeg kolom-blok of naar een ander blok om de positie te fixeren.

    Oplossing 1

    Je kunt sub-blokken dus niet van het paginering-blok naar een ander blok slepen, maar je kunt wel zo’n sub-blok verwijderen. Daarnaast kun je meerdere paginering-blokken per pagina plaatsen. Wat je kunt doen is dus drie paginering-blokken met daarin telkens alleen maar één van de drie sub-blokken. Dus een paginering blok waarin ‘paginanummers’ en ‘volgende pagina’ zijn verwijderd. Een paginering-blok waarin alleen ‘volgende pagina’ is blijven staan en een paginering-blok met alleen de pagina-nummers. Deze drie pagineringblokken kun je vervolgens in een rij plaatsen en op de gewenste manier uitvullen.

    Ik heb niet onderzocht wat de server-belasting van deze oplossing is, waarschijnlijk niet eens zo hoog want de paginering-blokken zijn onderdeel van één en hetzelfde query loop-block. Er zal niet telkens een nieuwe query worden gedaan. Het is geen elegante oplossing, maar het werkt.

    Oplossing 2

    De blokken ‘vorige pagina’ en ‘volgende pagina’ leveren bij de render-functie van WordPress lege inhoud op als ze niet van toepassing zijn. Maar na de render-functie wordt alle resulterende inhoud wel door een aantal filters gehaald, óók als die inhoud leeg is.

    Een filter toevoegen aan het render-resultaat van de sub-blokken maakt het mogelijk om in plaats van lege inhoud, een leeg, plaatsvervangend element aan het paginering-blok toe te voegen. Voor het gemak kan dan wat inline-style worden toegevoegd om de marges in overeenstemming met het oorspronkelijk blok te houden. Dit kan natuurlijk ook bereikt worden door wat class-namen en css toe te voegen *

    add_filter('render_block_core/query-pagination-previous', function(  $block_content, $parsed_block, $block_object ) {
        if( '' === $block_content) {
            $block_content = '<span class="wp-block-query-pagination-previous" style="margin-inline-end: auto;"></span>';
        }
        return $block_content;
    }, 10, 3 );
    
    add_filter('render_block_core/query-pagination-next', function(  $block_content, $parsed_block, $block_object ) {
        if( '' === $block_content) {
            $block_content = '<span class="wp-block-query-pagination-next" style="margin-inline-start: auto;"></span>';
        }
        return $block_content;
    }, 10, 3 );

    Aangezien het hier om een vorm-aanpassing gaat, ligt het voor de hand deze filters aan het thema toe te voegen, dus in functions.php of bestand dat daardoor wordt aangeroepen.

    Conclusie

    Twee pragmatische oplossingen: een waarbij geen code hoeft te worden toegevoegd en een die wat minder belastend is en die de opmaak in de blok-editor wat rustiger houdt.

    * Je kunt copilot hierom vragen maar dat heb ik ook al gedaan. Ik kreeg er wat toegankelijkheids verbetering bij cadeau:

    Voor functions.php:

    <?php
    add_filter( 'render_block_core/query-pagination-previous', function( $block_content, $parsed_block, $block ) {
        if ( '' === trim( $block_content ) ) {
            return '<span class="my-pagination-placeholder pagination-previous" aria-hidden="true" role="presentation"></span>';
        }
        return $block_content;
    }, 10, 3 );
    
    add_filter( 'render_block_core/query-pagination-next', function( $block_content, $parsed_block, $block ) {
        if ( '' === trim( $block_content ) ) {
            return '<span class="my-pagination-placeholder pagination-next" aria-hidden="true" role="presentation"></span>';
        }
        return $block_content;
    }, 10, 3 );

    Voor style.css:

    .my-pagination-placeholder {
      display: inline-block;
      width: 1rem; /* reserve horizontal space, tune as needed */
      height: 1em;
      vertical-align: middle;
    }
    .wp-block-query-pagination { /* ensure flex layout remains */
      display: flex;
      align-items: center;
    }
    .pagination-previous { margin-inline-end: auto; }
    .pagination-next { margin-inline-start: auto; }

  • Asanoha, seigaiha en meer.

    Asanoha, seigaiha en meer.

    Ik had achtergronden nodig met behangpatronen die je naadloos naast elkaar kunt plakken zoals bijvoorbeeld deze:

    Er genoeg voorbeelden te vinden als je zoekt op iets als ‘seamless pattern images’. Als de licentie het toestaat, kun je ze als achtergrond gebruiken van bijvoorbeeld een Gutenberg Groupblock of Coverblock. (In de instellingsdialogen voor de achtergrond van deze blokken kun je aangeven dat de afbeelding niet moet worden opgerekt maar als tegels vullend naast elkaar gelegd, resulterend in daartoe strekkende CSS background-size en background-repeat regels).

    Dit soort patronen wil je naar eigen smaak aanpassen: kleur, lijndikte, vorm, omvang van het herhaalde basiselement, etc. Je kunt natuurlijk ook zelf iets tekenen/maken in bijvoorbeeld Illustrator of Inkscape (die laatste heeft de voorkeur ivm de opvattingen over geestelijk eigendom die Adobe zijn gebruikers laat onderschrijven). Er zijn ook online generatoren te vinden die dit soort patronen voortbrengen (voeg de woorden ‘online generator’ toe bij het zoeken).

    Hoe dan ook zou het beter zijn als je deze functionaliteit binnen de WordPress blockeditor hebt. Dan hoef je niet steeds te schakelen tussen de generator en WordPress en je hoeft niet steeds patronen te down- en uploaden ( en daarbij eventueel nog exporteren naar een bruikbaar formaat). Hiermee zou je bovendien de gebruiker die dit allemaal te omslachtig vindt van dienst kunnen zijn als deze nieuwe of aangepaste patronen nodig heeft.

    Wat dus eigenlijk wenselijk is, is zo’n online svg-patroongenerator, maar dan als onderdeel van de Gutenberg editor. Om dit te bereiken doorliep ik een aantal stappen waarbij ik om te beginnen uitging van onderstaand achtergrond-patroon:

    Met dit patroon in gedachten doorliep ik de volgende acht stappen:

    1. SVG Maken
    2. JSON maken
    3. JSON doorgeven aan Block Editor
    4. Extra functies toevoegen
    5. Inspector Controls toevoegen aan de block-editor
    6. Renderer maken met template, parameters en functie-resultaten
    7. Voorinstellingen
    8. SVG in de achtergrond van het blok plaatsen

    Ten slotte maakte ik wat extra patronen met verschillende voorinstellingen van de parameters. Aan het eind staat daarvan een overzicht.

    1. SVG Maken

    2. JSON aanmaken

    3. JSON doorgeven aan Block Editor

    4. Functies toevoegen om te rekenen met parameters

    5. Inspector Controls toevoegen aan de Block-editor

    6. Renderer maken voor template, parameters en functieresultaten

    7. Voorinstellingen

    8. SVG in een block plaatsen

    Patronen en voorinstellingen

    Asanoha

    Dark Night

    Black River

    Star Blazer

    Soup

    Beach

    Red

    Blue

    Gump

    Free

    Crates

    Metalic

    Anatomy

    Fragile

    Ant

    Diamond

    Cardinal

    Leaves

    Polka

    Candy

    Rings

    Elegant

    Horrible 70

    Awefull 80

    Store

    Seigaiha

    Pink

    Pink Gradiënt

    Lime

    Classic 2

    Geometrisch

    Nr.1

    Nr. 2

    Nr. 3

    Nr. 4