Periksa apakah blok Gutenberg ada di post_content

19

Saya sedang mengerjakan desain yang memiliki gaya berbeda jika ada blok Gutenberg tertentu pada halaman. Dengan kata lain, jika blok pertama adalah blok Gutenberg yang dibuat khusus, post_title diberikan di tempat lain karena pilihan desain yang dibuat.

Apakah ada fungsi di WordPress untuk mendapatkan daftar semua blok Gutenberg yang ada di post_content?

Jeffrey von Grumbkow
sumber

Jawaban:

27

WordPress 5.0+ memiliki fungsi untuk ini: parse_blocks(). Untuk melihat apakah blok pertama dalam posting adalah blok Heading, Anda akan melakukan ini:

$post = get_post(); 

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

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}
Jacob Peattie
sumber
Terima kasih! Saya tidak dapat menemukan fungsi ini. Lucunya kode kustom saya pada dasarnya melakukan hal yang sama tetapi dengan kode jauh lebih sedikit! Bagaimanapun, ditandai sebagai diterima sebagai fungsi bawaan yang tepat.
Jeffrey von Grumbkow
3
Fungsi ini telah ditinggalkan (tetapi hanya diganti namanya), Anda harus menggunakan has_blocks($blockName)sebagai gantinya: github.com/WordPress/gutenberg/pull/8631/commits/… . Ada juga has_block()(tanpa "s").
Nico Prat
@NicoPrat, kami telah memperbarui jawaban untuk mencerminkan metode yang benar
Jeffrey von Grumbkow
Ingatlah ada masalah yang diketahui saat ini di mana parse_blocks()mengembalikan blok yang tidak ada sebagai elemen array NULL - core.trac.wordpress.org/ticket/45312
Lee
2

Solusi yang saya gunakan pada penulisan memeriksa post_content untuk komentar HTML Gutenberg. Karena perubahan Gutenberg di masa depan, ini mungkin tidak berfungsi di masa depan.

<?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
sumber
0

Pada rilis 5.0 fungsi-fungsi ini telah ditinggalkan dengan Gutenberg sekarang diintegrasikan ke dalam inti. Saya bayangkan, tetapi belum mengkonfirmasi bahwa fungsi-fungsi ini masih ada di plugin mandiri Gutenberg.

Alih-alih gutenberg_content_has_blocksdigunakanhas_blocks

Alih-alih gutenberg_parse_blocksdigunakanparse_blocks

ian-hoyte
sumber
2
@JeffreyvonGrumbkow, ian-hoyte harus menurunkan perwakilan untuk mengedit atau berkomentar =)
honk31