我正在开发一个网络研讨会插件,它使用自定义帖子类型来显示网络研讨会页面。根据访客注册状态和当前网络研讨会状态,这些页面可以是注册、感谢、倒计时、直播等。
插件使用template_include
根据当前帖子状态和访问者状态(如果他们已注册或未注册)呈现内容的操作。
该插件允许用户为其中一个网络研讨会页面选择自定义页面,如自定义注册页面或自定义感谢页面。它向用户显示他们的WordPress页面列表,让他们选择一个,然后保存post_id
在里面wp_post_meta
.
在里面template_include
我得到了$custom_page_id
从…起wp_post_meta
如果设置了,我会将访问者重定向到template_include
使用类似的方法:
$redirect_url = get_permalink($custom_page_id);
wp_redirect($redirect_url);
因此访问者可以访问我的自定义帖子url:
https://example.com/my-post-type/mypost
然后重定向到:
https://example.com/some-other-post
我真正想做的是渲染
$custom_page_id
无需重定向,理想情况下可以传入一些元数据,如原始帖子ID。
有什么方法可以呈现$custom_page_id
(包括主题页眉和页脚)而不必重定向,以便访问者停留在https://example.com/my-post-type/mypost
但是看到完全相同的内容,就像他们重定向了一样?
最合适的回答,由SO网友:Kudratullah 整理而成
这对解决你的问题来说有点棘手。这个template_include
主查询处理当前请求后执行的筛选器。如果您可以筛选当前请求(query\\u vars)并相应地更新它,WordPress将显示您想要的任何帖子/页面。。。只需过滤query_vars
使用request
滤器检查以下代码段。但这样做可能会对SEO产生不良影响。
add_filter( \'request\', function( $query_vars ) {
if( is_admin() ) return $query_vars;
$_post = null;
// find the queried post
if( isset( $query_vars[\'post_type\'], $query_vars[\'your-post-type\'] ) && $query_vars[\'post_type\'] == \'your-post-type\' ) {
// $query_vars[\'your-post-type\'] will contains the post slug
$_post = get_page_by_path( $query_vars[\'your-post-type\'], OBJECT, $query_vars[\'post_type\'] );
} else if( isset( $query_vars[\'p\'] ) ) {
$_post = get_post( $query_vars[\'p\'] );
if( $_post != \'your-post-type\' ) $_post = null;
}
if( $_post ) { // post found
// get the redirect to page id
$custom_page_id = get_post_meta( $_post->ID, \'custom_page_id\', true );
$custom_page = get_post( $custom_page_id );
if( $custom_page ) { // valid page/post found.
// set the query vars to display the page/post
$query_vars[$custom_page->post_type] = $custom_page->post_name;
$query_vars[\'name\'] = $custom_page->post_name;
$query_vars[\'post_type\'] = $custom_page->post_type;
}
}
return $query_vars;
}, 10 );
SO网友:cjbj
的想法template_include
就是截取正常的模板过程,并根据某些条件将模板替换为另一个模板。现在要做的是重定向到另一个url,该url将通过正常的模板过程生成所需的模板。
你可以通过简单的template_include
做它的本意。由于我不知道您是如何存储数据的,所以我无法给出精确的代码,但它看起来是这样的:
add_filter (\'template_include\',\'wpse352621_custom_template\',10);
function wpse352621_custom_template ($template) {
if (\'webinar\' == get_post_type()) { // assuming this is the name of your cpt
// now, with $custom_page_id, you must not retrieve the url, but the template.
// you have asked the user which template he wants and stored it somewhere,
// presumably as user data (*)
wp_get_current_user();
$user_template = $current_user->user_template // assuming this is where you stored it
// now, just to be sure check if that template exists, then assign it
$template_path = path.to.plugin.or.theme.directory . $user_template;
if (file_exists ($template_path)) $template = $template_path;
}
return $template;
}
(*)如果网站的每个用户都可以在此时选择自己喜欢的模板,情况就是这样。如果你的意思是管理员可以选择,那么你可以将其作为元数据存储到帖子中。或者你甚至可以在插件的某个地方有一个单独的表
$custom_page_id
\'s到模板。这并不能从根本上改变你需要做的事情。