Kiểm tra các khối Gutenberg trong post_content


19

Tôi đang làm việc trên một thiết kế có kiểu dáng khác nếu một khối Gutenberg nào đó hiện diện trên một trang. Nói cách khác, nếu khối đầu tiên là khối Gutenberg được xây dựng tùy chỉnh, post_title được hiển thị ở nơi khác do lựa chọn thiết kế được thực hiện.

Có bất kỳ chức năng nào trong WordPress để có được danh sách tất cả các khối Gutenberg có trong post_content không?

Câu trả lời:


27

WordPress 5.0+ có chức năng này : parse_blocks(). Để xem khối đầu tiên trong bài có phải là khối Heading không, bạn sẽ làm điều này:

$post = get_post(); 

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

    if ( $blocks[0]['blockName'] === 'core/heading' ) {
    }
}

Cảm ơn! Tôi không thể tìm thấy chức năng này. Vui thay, mã tùy chỉnh của tôi về cơ bản là điều tương tự nhưng với mã ít hơn rất nhiều! Dù sao, được đánh dấu là chấp nhận vì đó là chức năng tích hợp đúng.
Jeffrey von Grumbkow

3
Hàm này không được dùng nữa (nhưng chỉ được đổi tên), bạn nên sử dụng has_blocks($blockName)thay thế: github.com/WordPress/gutenberg/pull/8631/commits/ Lỗi . Cũng có has_block()(không có "s").
Nico Prat

@NicoPrat chúng tôi đã cập nhật câu trả lời để phản ánh các phương pháp chính xác
Jeffrey von Grumbkow

Hãy nhớ rằng có một vấn đề được biết đến tại thời điểm parse_blocks()trả về các khối không tồn tại dưới dạng các phần tử mảng NULL - core.trac.wordpress.org/ticket/45312
Lee

2

Giải pháp tôi đang sử dụng khi viết bài kiểm tra post_content cho các nhận xét HTML của Gutenberg. Do những thay đổi trong tương lai của Gutenberg, điều này có thể không hoạt động trong tương lai.

<?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
}

0

Kể từ khi phát hành 5.0, các chức năng này đã không còn được sử dụng nữa với Gutenberg hiện được tích hợp vào lõi. Tôi tưởng tượng, nhưng chưa xác nhận rằng các chức năng này vẫn tồn tại trong plugin độc lập Gutenberg.

Thay vì gutenberg_content_has_blockssử dụnghas_blocks

Thay vì gutenberg_parse_blockssử dụngparse_blocks


2
@JeffreyvonGrumbkow điều là, ian-hoyte phải hạ thấp để chỉnh sửa hoặc bình luận =)
honk31
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.