WP Admin:在链接搜索结果中包含自定义帖子类型存档

我一直在网上搜索这方面的例子,并通过关于过滤器的 WP 文档,但我找不到合适的钩子,所以很抱歉在没有我正在尝试做的事情的好例子的情况下发布问题!

当您在编辑器中添加指向文本或按钮的链接时,您可以搜索要链接到的页面/帖子。您无法搜索的是帖子类型的存档链接。

我希望能够在搜索框中输入帖子类型的名称(如下图所示),并在搜索结果中包含帖子类型存档链接。members在这个例子中,我有一个我想链接到的帖子类型。

http://img.mukewang.com/648ed70400011cee03870423.jpg

我发现有很多需要这样做,而且我总是最终只是在/post-type-link框中输入内容并将其留在那儿,但我认为这不是一个优雅的解决方案并且对用户来说很笨重。


我试过写一些代码,但我不相信我有正确的钩子:


function include_cpt_search( $query ) {


    if ( is_admin() && is_single() ) {

        $query->set( 'post_type', array( 'services' ) );

    }


    return $query;


}

add_filter( 'pre_get_posts', 'include_cpt_search' ); 

有没有人这样做过?知道我可以使用的过滤器或挂钩吗?真的什么都有!


慕妹3146593
浏览 111回答 0
0回答

catspeake

RichText 工具栏中的链接格式使用位于 的搜索 REST API 端点/wp/v2/search,因此虽然该端点不提供用于过滤响应的专门挂钩,但您可以使用它rest_post_dispatch向通过 返回的搜索结果添加自定义链接/wp/v2/search。因此,在下面的示例中,我正在检查路由是否存在/wp/v2/search,如果是,则我们添加(自定义)帖子类型的存档链接。另请注意,您应该提供一个数组,其中包含此处提到的项目(LinkControl链接格式使用的组件)。基本示例仅包括其名称与搜索关键字完全匹配的(即一个)帖子类型。add_filter( 'rest_post_dispatch', 'so_62472641', 10, 3 );function so_62472641( $response, $server, $request ) {    // Don't modify the data if the REST API route is not /wp/v2/search    if ( 'post' !== $request->get_param( 'type' ) ||        '/wp/v2/search' !== $request->get_route() ) {        return $response;    }    // Let's see if there's a post type that matched the search keyword.    $search = $request->get_param( 'search' );    if ( ! $post_type = get_post_type_object( $search ) ) {        return $response;    }    // Now add the post type archive URL, if any, to the response data.    if ( $url = get_post_type_archive_link( $search ) ) {        $data = (array) $response->get_data();        $data[] = [            'id'    => 'post_type-' . $search,            'type'  => 'Post Type Archive',            'title' => $post_type->label,            'url'   => $url,        ];        $response->set_data( $data );    }    return $response;}扩展示例包括名称/标签与搜索关键字匹配的所有帖子类型。add_filter( 'rest_post_dispatch', 'so_62472641', 10, 3 );function so_62472641( $response, $server, $request ) {    // Don't modify the data if the REST API route is not /wp/v2/search    if ( 'post' !== $request->get_param( 'type' ) ||        '/wp/v2/search' !== $request->get_route() ) {        return $response;    }    $search = $request->get_param( 'search' );    $post_types = get_post_types( [], 'objects' );    $extra_data = [];    // Let's see if there's a post type that matched the search keyword.    foreach ( $post_types as $obj ) {        if ( $search === $obj->name ||            // look for the search keyword in the post type name/slug and labels (plural & singular)            false !== stripos( "{$obj->name} {$obj->label} {$obj->labels->singular_name}", $search )        ) {            if ( $url = get_post_type_archive_link( $obj->name ) ) {                $extra_data[] = [                    'id'    => 'post_type-' . $obj->name,                    'type'  => 'Post Type Archive',                    'title' => $obj->label,                    'url'   => $url,                ];            }        }    }    // Now add the post type archive links, if any, to the response data.    if ( ! empty( $extra_data ) ) {        $response->set_data( array_merge( (array) $response->get_data(), $extra_data ) );    }    return $response;}示例输出(对于上面的第二个示例)注:以上为真实响应截图,但我故意(通过PHP)将域名改为example.com(即实际域名不同)。这些示例都在 WordPress 5.5.1(撰写本文时的最新版本)上进行了尝试和测试。此外,post如果需要,您可以排除默认的帖子类型。补充笔记应该注意的是,这些示例没有考虑分页,这意味着,如果有 10 个帖子类型与搜索关键字匹配,那么它们将始终包含在响应中(在第 1、2、3 等页面上)。 ). 所以你可能只想使用第一个例子,因为至少它总是最多只包含一种帖子类型。但是,对于第二个示例,您实际上可以将项目限制$extra_data为 5 个(每页 - 但如何分配每页项目取决于您)。您还可以使用自定义搜索处理程序类,例如扩展默认类 ( WP_REST_Post_Search_Handler) 并使用wp_rest_search_handlers挂钩将您的类添加到列表中的类。这是一个非常基本的例子......在your-class.php:class My_WP_REST_Post_Search_Handler extends WP_REST_Post_Search_Handler {    // ... you'll need to actually write the code on your own..}return new My_WP_REST_Post_Search_Handler;在主题functions.php文件或插件中的某处:add_filter( 'wp_rest_search_handlers', 'my_wp_rest_search_handlers' );function my_wp_rest_search_handlers( $search_handlers ) {    $search_handlers[] = include_once '/path/to/the/your-class.php';    return $search_handlers;}
打开App,查看更多内容
随时随地看视频慕课网APP