我如何才能看到使用我的定制Gutenberg块的页面和帖子的列表?

时间:2021-07-16 作者:Jonathan L Clark

背景:创建自定义古腾堡块和不断变化的挑战我对创建自定义古腾堡块(每个块都是一个单独的插件)很陌生,最近在更新块代码时遇到了不断变化的问题。我学会了block depreciation 可以帮助解决破坏代码更改的问题,但我仍然面临着找到使用这些块的特定页面和帖子的挑战

问题原因:要查找自定义gutenberg块的所有实例并加快质量控制过程,我正在寻找一种方法来查看已使用的帖子和页面列表,以便验证升级路径是否适用于所有人们想出的不同用例。。。无需手动浏览每个页面,然后滚动查看是否使用了我的某个块。一些网站有数百个页面和帖子。我想让它成为一个更有效的过程,只找到使用自定义块的页面和帖子。

2 个回复
最合适的回答,由SO网友:birgire 整理而成

通用块名搜索可以在/wp-admin 后端以在存储块的帖子内容中查找一些文本:

我们可以搜索带前缀的块名称wp:my-plugin/my-block 在岗位内:

example.com/wp-admin/edit.php
?s=wp:my-plugin%2Fmy-block%20&post_type=post
我们有一个额外的空间(url编码为%20和/作为%2F) 在块的名称之后,它的第一部分将存储为<!-- wp:my-plugin/my-block --> 或具有属性<!-- wp:my-plugin/my-block {...} --> 在帖子的内容中。

前端搜索也可以工作,但没有后端的帖子类型过滤(除非使用插件进行调整):

example.com
?s=wp:my-plugin%2Fmy-block%20
这种块搜索可能不是百分之百准确的(例如,如果你在博客上写块名),但在大多数情况下,它可能会给你一个足够好的估计。

More accurate searching

我们注意到<!-- wp:my-plugin/my-block 使用:

example.com
?s=<%21--%20wp:my-plugin%2Fmy-block%20
将在生成的SQL中拆分为两个单词:

WHERE 1=1
AND (((wp_posts.post_title LIKE \'%<!--%\')
OR (wp_posts.post_excerpt LIKE \'%<!--%\')
OR (wp_posts.post_content LIKE \'%<!--%\'))
AND ((wp_posts.post_title LIKE \'%wp:my-plugin/my-block %\')
OR (wp_posts.post_excerpt LIKE \'%wp:my-plugin/my-block %\')
OR (wp_posts.post_content LIKE \'%wp:my-plugin/my-block %\')))
...
但我们可以通过sentence 参数:

example.com
?s=<%21--%20wp:my-plugin%2Fmy-block&sentence=1
并获得如下搜索查询:

WHERE 1=1
AND (((wp_posts.post_title LIKE \'%<!-- wp:my-plugin/my-block %\')
OR (wp_posts.post_excerpt LIKE \'%<!-- wp:my-plugin/my-block %\')
OR (wp_posts.post_content LIKE \'%<!-- wp:my-plugin/my-block %\')))
...
或者,我们可以使用自定义WP_Query 搜索方式:

WP_Query( array( 
    \'s\'         => \'<!-- wp:my-plugin/my-block \', 
    \'sentence\'  => 1, 
    \'post_type\' => array( \'post\', \'page\' ),
) );
或运行has_block( \'my-plugin/my-block\', $post_content ) 关于给定块名称或使用的所有相关帖子内容parse_blocks( $post_content ) 如果你需要更多的信息。

可重用块我们应该注意,可重用块的存储方式如下:

<!-- wp:block {"ref":23495} /-->
在帖子的内容中,所以我们可以研究wp_block 存储它的帖子类型:

example.com/wp-admin/edit.php
?s=<%21--%20wp:my-plugin%2Fmy-block%20&post_status=all&post_type=wp_block&sentence=1
简单块类型搜索插件为了简化操作,我创建了一个插件,在管理中的每个列表下为注册的块类型添加了下拉过滤器:

要简化筛选时自动添加的搜索,请执行以下操作:

创建插件文件并激活:

<?php 
/* Plugin Name: Simple Block Type Search
 * Plugin URI: https://wordpress.stackexchange.com/a/392175/26350 
 */
add_action( \'restrict_manage_posts\', \'simple_block_type_search\', 10, 2 );

function simple_block_type_search ( $post_type, $which ) {
    if ( ! use_block_editor_for_post_type ( $post_type ) ) {
        return;
    } 
    $block_types = \\WP_Block_Type_Registry::get_instance()->get_all_registered();
    $options = array_reduce( $block_types, function( $options, $block_type ) {
        $val = \'!-- wp:\' . str_replace( \'core/\', \'\', $block_type->name ) . \' \';
        return $options . sprintf ( \'<option value="%s" %s>%s</option>\',
            esc_attr( $val ),
            selected( get_query_var( \'s\' ), $val, false ),
            esc_html( $block_type->name )
        );
    }, \'\' );
    printf ( \'<select name="s"><option value="">%s</option>%s</select>
              <input type="hidden" name="sentence" value="1"/>\', 
         esc_html__( \'Block Type Search\', \'simple_block_type_search\' ),
         $options            
    );
}
要获取所有注册的块类型,我们used:

\\WP_Block_Type_Registry::get_instance()->get_all_registered()
为了只显示支持的帖子类型的下拉列表,我们used:

use_block_editor_for_post_type()
在这里,我们使用了内置的搜索功能和管理后端的用户界面。这就是为什么插件的代码行数如此之少。

SO网友:mparraud

我是WordPress用户,有时我会安装块包,这些块包附带一些类似于核心块的块。

当我尝试查找某些块的使用位置时,我会使用以下插件:https://wordpress.org/plugins/find-my-blocks/