需要CF7中的base_url()或home_url()的方法

时间:2016-03-01 作者:Craig Tucker

对于CF7中的重定向,on\\u sent\\u ok:“location.replace(\'https://www.mywebsite.com/pageid\')“在其他设置中运行良好,但我需要使我的网站更具可移植性。我想使用函数调用base\\u url()或home\\u url()。而不是写出http://www.mywebsite.com/pageid, 我宁愿使用on\\u sent\\u ok:“函数(\'pageid\')。”

我尝试将JS添加到页面模板:

<script type="text/javascript">
function PgRedirect($pageid) {
         var url=\'\'
         url= "<?php echo home_url($pageid)?>";
         window.location = url;
</script>
这不起作用。我已经尝试在函数中添加函数。php:

function wpcf7_pg_redirect($pageid){
    wp_redirect(home_url($pageid));
    exit();
}
add_action(\'wpcf7_mail_sent\', \'wpcf7_pg_redirect\');
这也行不通。我不确定我在这里错过了什么。如有任何提示,将不胜感激。

4 个回复
SO网友:cybmeta

如果需要获取任何类型的帖子(包括页面)的URL,应该使用get_permalink() 函数,该函数返回由WordPress permalink配置管理的帖子/页面的规范URL。

使用home_url()base_url() 获取页面永久链接是个坏主意,因为您无法确定是否获取了该页面的cannical URL。而且home_url($pageid) 是错误的,home_url() 接受要附加到主页url的路径,但页面ID不是路径。

因此,使用get_permalink():

echo get_permalink( $pageid );
如果要在内联JavaScript中打印它,还应该使用esc_js() 转义字符串。或者,如果您要将其用于重定向,esc_url_raw():

function wpcf7_pg_redirect($pageid){
    wp_redirect( esc_url_raw( get_permalink( $pageid ) ) );
    exit();
}
add_action(\'wpcf7_mail_sent\', \'wpcf7_pg_redirect\');
或者,如果您想让它与ajax请求一起工作(由@userauser建议的过滤器):

add_filter(\'wpcf7_ajax_json_echo\', \'cf7_custom_redirect_uri\', 10, 2);
function cf7_custom_redirect_uri($items, $result) {

    if ( $some_condition_is_true ) {

        $redirect_to = get_permalink( $pageid );

        $items[\'onSentOk\'] = "location.replace(\'{" . esc_js( $redirect_to ) . "}\')";

    }

}

SO网友:Adam

而不是在DOM中赋予自己的JS函数,希望将其与CF7结合起来on_sent_ok 以一种非正统的方式,让我们后退一步,过滤CF7将通过的结果JSeval() 表示为字符串。

例如:

function cf7_custom_redirect_uri($items, $result) {

    if ( $some_condition_is_true ) {

        //build the url in which you wish to redirect to...
        $redirect_to = home_url(\'?p=123\');

        $items[\'onSentOk\'] = "location.replace(\'{$redirect_to}\')";
        
    }

}

add_filter(\'wpcf7_ajax_json_echo\', \'cf7_custom_redirect_uri\', 10, 2);
在上面的(OP)示例中,您正在钩住wpcf7_mail_sent 发布重定向,在所有情况下,这都是我发布重定向的方式,而不是担心eval() CF7所做的胡说八道。如果在重定向DOM之前不需要在DOM中渲染任何其他内容,我认为后者更好。

示例:

function wpcf7_pg_redirect(){

    if ( $some_condition_is_true ) {

        //build the url in which you wish to redirect to...
        $redirect_to = home_url(\'?p=123\');

        wp_redirect(home_url($redirect_to));
        exit();

    }


}

add_action(\'wpcf7_mail_sent\', \'wpcf7_pg_redirect\');
注:在我的示例中 $redirect_to = home_url(\'?p=123\'); 可以根据需要以编程方式构建,无需硬编码?p=123.

因此,如果您知道基于某种方案或可用变量或条件想要访问的URL,那么您将根据该规范构建URL。

如果您在构建目标URL时遇到问题,请准确告诉我们您想如何确定应该重定向到哪个URL。。。

是否重定向到同一页面(如刷新)

SO网友:Craig Tucker

谢谢你的提示。我确实试过了。我发现我在这个过程中把事情复杂化了。这就是我的解决方案:

on\\u sent\\u ok:“location.replace(window.location.href.substring(0),(window.location.href.lastIndexOf(“/”))+1)+\'[发布ID]”)

这为我提供了主url,并且当我尝试在其他服务器上移植站点时,可以根据url中的更改进行调整。

SO网友:Craig Tucker

这是一个基于shourcode方法的更好的解决方案:https://wordpress.org/support/topic/linking-to-pages-within-site?replies=12

在函数中。php添加以下内容:

// create shortcode for website\'s home page address: [url]

function myUrl($atts, $content = null) {
    extract(shortcode_atts(array(
        "href" => home_url()
    ), $atts));
    return $href;
}
add_shortcode("url", "myUrl");
此[url]的工作方式如下:

on\\u sent\\u ok:“位置。替换(\'[url]/页面ID/\');”

它也适用于页面和帖子。非常有用。