gpt4 book ai didi

php - WP 管理员 : Include custom post type archive in link search results

转载 作者:行者123 更新时间:2023-12-04 15:24:55 24 4
gpt4 key购买 nike

我一直在网上和通过关于过滤器的 WP 文档搜索这个例子,但我找不到合适的钩子(Hook),所以很抱歉发布一个没有我想要做的好例子的问题!

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

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

enter image description here

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

我试图写一些代码,但我不相信我有正确的钩子(Hook):

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' );

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

最佳答案

RichText 工具栏中的链接格式使用搜索 REST API 端点 /wp/v2/search ,因此尽管该端点不提供用于过滤响应的专门 Hook ,但您可以使用 rest_post_dispatch 向通过 /wp/v2/search 返回的搜索结果添加自定义链接.
所以在下面的例子中,我正在检查路线是否是 /wp/v2/search如果是这样,那么我们添加(自定义)帖子类型的存档链接。另请注意,您应该提供一个包含 here 中提到的项目的数组。 (链接格式使用的 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;
}
示例输出(对于上面的第二个示例)
Sample output for the second example
注:以上是真实回复截图,不过我特意(通过PHP)把域名改成了 example.com (即实际域名不同)。
这些示例都在 WordPress 5.5.1(撰写本文时的最新版本)上进行了尝试和测试。此外,您可以排除默认 post帖子类型,如果你愿意。
补充说明
  • 应该注意的是,这些示例没有考虑分页,这意味着,如果有 10 个帖子类型与搜索关键字匹配,那么它们将始终包含在响应中(在第 1、2、3 页等)。 )。因此,您可能只想使用第一个示例,因为至少它始终只包含最多 1 个帖子类型。但是,对于第二个示例,您实际上可以限制 $extra_data比方说,5 个项目(每页 - 但如何分配每页项目取决于您)。
  • 您还可以使用自定义搜索处理程序类,例如一个扩展默认类( WP_REST_Post_Search_Handler )并使用 wp_rest_search_handlers hook将您的类(class)添加到列表中。这是一个非常基本的例子......
    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;
    }
  • 关于php - WP 管理员 : Include custom post type archive in link search results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62472641/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com