在初始化操作中检测POST类型

时间:2014-04-26 作者:Ralphonz

我在我的网站上有一个前端ajax登录。我想将重定向url设置为\'/services/clientarea\'; 对于每个不属于博客的页面。对于博客页面,我希望登录重定向为$_SERVER[\'REQUEST_URI\'];

以下是我正在使用的代码,它对我不起作用:

function ajax_login_init(){

wp_register_script(\'ajax-login-script\', get_template_directory_uri() . \'/library/js/ajax-login-script.js\', array(\'jquery\') ); 
wp_enqueue_script(\'ajax-login-script\');

global  $post;
$posttype = get_post_type($post);

if ($posttype == \'post\') {
    $loginredirect = $_SERVER[\'REQUEST_URI\'];
} else {
    $loginredirect = \'/services/clientarea\';
}

wp_localize_script( \'ajax-login-script\', \'ajax_login_object\', array( 
    \'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
    \'redirecturl\' => $loginredirect,
    \'loadingmessage\' => __(\'Signing in, please wait...\')
));

// Enable the user with no privileges to run ajax_login() in AJAX
add_action( \'wp_ajax_nopriv_ajaxlogin\', \'ajax_login\' );
}

// Execute the action only if the user isn\'t logged in
    if (!is_user_logged_in()) {
        add_action(\'init\', \'ajax_login_init\');
}
似乎在init钩子中没有加载post类型。有什么方法可以识别它吗?

2 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

好吧,让我们先弄清楚一些事情。

以下是actions run during typical request. 它是这样的:

  • 解析请求
  • parse\\u query
  • pre\\u get\\u posts
  • posts\\u selection
  • $post 在里面init 恐怕要行动了。

    如果将代码从initwp (或更晚),然后您可以$post 从…起$wp_query 对象

    但是我不确定我是否理解,您试图用这段代码实现什么。如果您根据查询的帖子挂接AJAX操作,我想它根本不会启动。为什么?AJAX调用是另一个请求(/wp-admin/admin-ajax.php) 所以就没有了$post 已在此请求中检索,因此您的操作不会被挂接,因此不会启动。

    我很确定这就是你真正想要的:

    function enqueue_ajax_login_scripts() {
        wp_register_script(\'ajax-login-script\', get_template_directory_uri() . \'/library/js/ajax-login-script.js\', array(\'jquery\') ); 
        wp_enqueue_script(\'ajax-login-script\');
    
        // check if it\'s single post
        if ( is_singular(\'post\') ) {
            $loginredirect = $_SERVER[\'REQUEST_URI\'];
        } else {
            $loginredirect = \'/services/clientarea\';
        }
    
        wp_localize_script( \'ajax-login-script\', \'ajax_login_object\', array( 
            \'ajaxurl\' => admin_url( \'admin-ajax.php\' ),
            \'redirecturl\' => $loginredirect,
            \'loadingmessage\' => __(\'Signing in, please wait...\')
        ));
    }
    add_action(\'wp_enqueue_scripts\', \'enqueue_ajax_login_scripts\');
    
    // it can be registered every time (it won\'t fire up unless there will be such AJAX request
    add_action( \'wp_ajax_nopriv_ajaxlogin\', \'ajax_login\' );
    

SO网友:chifliiiii

而@krzysiekAnswer 是获取文件时要遵循的正确方法,请不要回答如何在init hook获取post类型的原始问题,因此我将在这里发布解决方案,以防任何人需要它。

基本上,您无法在该挂钩处访问post变量,因此需要使用url来获取它。这个url_to_postid() 是您需要使用的函数,您可以执行以下操作:

$actual_url = (isset($_SERVER[\'HTTPS\']) && $_SERVER[\'HTTPS\'] == \'on\' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$post_id = url_to_postid($actual_url);
$post_type = get_post_type( $post_id );
这只是一个解决方案,以防您需要它,但最好从设置变量的wp挂钩开始。

结束

相关推荐

Update meta values with AJAX

我正在Wordpress中开发投票系统。我第一次是用GET 但有人告诉我you should not use GET for this, 因此,我开始使用AJAX在阅读之后更新自定义字段/元数据this article. 我已经阅读了jQuery和Wordpress AJAX页面上的大量文档,这是我现在拥有的。我想我已经走上了好的道路,但有些地方遗漏了/或者我做错了。投票函数工作得很好,因为我之前用GET 请求。我有一个简单的HTML测试表单:<form id=\"vote_form\" metho