redirect if shortcode exists

时间:2018-05-07 作者:now_world

WordPress初学者。我试图检查用户请求的页面中是否存在短代码,如果存在,则在用户未登录时重定向。

function redirect_to_home() {
  if (has_shortcode(get_the_content(), \'shortcode\')) {
    if(!is_admin() && !is_user_logged_in()) {
      //redirect
      exit();
    }
  }
}
add_action(\'template_redirect\', \'redirect_to_home\');
离这里近吗?目前,该代码位于函数中。php文件,是否正确?

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

如果您查看add_shortcode 您将看到这个函数只不过是将短代码的名称存储在一个全局数组中。因此,检查短代码是否存在意味着在数组中查找它。

因此,如果要在the_content 您必须确保已在需要时添加了短代码。其他的has_shortcode 会说它不存在。

幸运的是hook order, 你看template_redirect 之后执行after_setup_theme, 加载主题相关内容的默认挂钩。如果您使用该挂钩添加您的短代码(在functions.php), 当您到达时,您可以确保您的短代码存在template_redirect.

所以,是的,你在正确的轨道上。您使用的是正确的钩子,您需要的数据在WP的执行顺序中的该点可用。

SO网友:Rick Hellewell

我想你已经看过这些文件了:https://codex.wordpress.org/Shortcode_API

。。。这将向您显示检查短代码的正确代码。假设您的短代码叫做“redirectme”。因此,您将在函数中使用的代码。php类似于:

// redirect for the [redirectme] shortcode
function redirect_me( $atts ){
    // do something if the shortcode is found
}
add_shortcode( \'redirectme\', \'redirect_me\' );
如果短代码[redirectme] 已找到。然后修改该函数以执行所需的重定向。

例如,如果要重定向到http://example.com/the-new-page , 您可以将其放入redirect\\u me函数中

$url = \'http://example.com/the-new-page\';
wp_redirect( $url );
exit;
查看上的文档wp_redirect 功能:https://developer.wordpress.org/reference/functions/wp_redirect/ . 请注意exit ,否则将执行该页的其余代码。

Added

正如对此答案的评论中所述wp_redirect() 无法工作-这将导致“Headers ready sent”(标头已发送)错误。这是因为在wp_redirect() 函数是通过内容中出现的短代码来调用的。

因此,您必须在WP开始发送输出之前缓冲输出。您可以使用以下代码执行此操作:

function app_output_buffer() {
    ob_start();
}  
add_action(\'init\', \'app_output_buffer\');
。。。我从这里得到的https://tommcfarlin.com/wp_redirect-headers-already-sent/ (更多信息请参见)。可能也有类似的参考文献ob_start() 在这里由于该功能将在WP输出开始之前“启动”,因此wp_redirect() 如果由短代码激发,则将工作。

因此,将上述代码添加到函数中。php文件,您将能够wp_redirect() WP开始输出后。

另一种方法是更改用于帖子/页面的模板,以检查用户是否有效登录,如果用户尚未登录,则重定向。您可能仍然需要ob_start() 函数,具体取决于检查用户登录的位置。

结束

相关推荐

Filter content in shortcode

所以,我对这个短代码有点陌生,但我现在几乎已经完成了我需要的工作。(检查下面的代码)我想在我的短代码中过滤我的内容,我有一个由ACF插件添加字段的CPT。现在我需要的是,当我放置[speaker\\u overview\\u 2017 year=2017]时,它只显示2017年有价值的项目,当我做[speaker\\u overview\\u 2017 year=2018]时,它只显示2018年,当我做[speaker\\u overview\\u 2017]时,它显示所有项目。这是我的短代码,有人能帮我