Vérifiez quels blocs Gutenberg sont dans post_content

19

Je travaille sur un design qui a un style différent si un certain bloc Gutenberg est présent sur une page. En d'autres termes, si le premier bloc est un bloc Gutenberg personnalisé, le post_title est rendu ailleurs en raison des choix de conception effectués.

Existe-t-il une fonction dans WordPress pour obtenir une liste de tous les blocs Gutenberg présents dans le post_content?

Jeffrey von Grumbkow
la source
Il existe un site Web whichblocks.com Lorsque vous saisissez l'url d'une page Web, il scanne la page et découvre les blocs gutenberg utilisés dans la page.
Teena Babu

Réponses:

27

WordPress 5.0+ a une fonction pour cela: parse_blocks(). Pour voir si le premier bloc de la publication est le bloc d'en-tête, procédez comme suit:

$post = get_post(); 

if ( has_blocks( $post->post_content ) ) {
    $blocks = parse_blocks( $post->post_content );

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}
Jacob Peattie
la source
Merci! Je n'ai pas pu trouver cette fonction. Curieusement, mon code personnalisé fait essentiellement la même chose mais avec beaucoup moins de code! Quoi qu'il en soit, marqué comme accepté car c'est la fonction intégrée appropriée.
Jeffrey von Grumbkow
3
Cette fonction est obsolète (mais seulement renommée), vous devez utiliser à la has_blocks($blockName)place: github.com/WordPress/gutenberg/pull/8631/commits/… . Il y a aussi has_block()(sans "s").
Nico Prat
@NicoPrat nous avons mis à jour la réponse pour refléter les méthodes correctes
Jeffrey von Grumbkow
Gardez à l'esprit qu'il existe un problème connu en ce moment où parse_blocks()renvoie des blocs inexistants en tant qu'éléments de tableau NULL - core.trac.wordpress.org/ticket/45312
Lee
2

La solution que j'utilise au moment de l'écriture vérifie le post_content pour les commentaires HTML de Gutenberg. En raison des modifications futures de Gutenberg, cela pourrait ne pas fonctionner à l'avenir.

<?php    
$post_content = get_the_content( get_the_ID() ); // Get the post_content
preg_match_all('<!-- /wp:(.*?) -->', $post_content, $blocks); // Get all matches in between <!-- /wp: --> strings

// $blocks[1] contains the names of all the blocks present in the post_content
if ( in_array( 'heading', $blocks[1] ) ) {
    // Post content contains a wp:heading block
}
else {
    // Post content does not contain a wp:heading block
}
Jeffrey von Grumbkow
la source
0

Depuis la sortie de la version 5.0, ces fonctions sont obsolètes, Gutenberg étant désormais intégré au noyau. J'imagine, mais je n'ai pas confirmé que ces fonctions existent toujours dans le plugin autonome Gutenberg.

Au lieu d' gutenberg_content_has_blocksutilisationhas_blocks

Au lieu d' gutenberg_parse_blocksutilisationparse_blocks

ian-hoyte
la source
2
@JeffreyvonGrumbkow est, ian-hoyte doit avoir un faible représentant pour éditer ou commenter =)
honk31