web-dev-qa-db-ja.com

phpスクリプトへのAjax呼び出しは404エラーを返します

私はWordPressデザイナーです。jQueryを介して検証される、テーマの1つの連絡フォームを開発しました。

以下のコードを確認してから、以下の注意事項をお読みください。

$('.submitemail') .click(function() {

    //VALIDATION CODE GOES HERE

    if ( /*VALIDATED SUCCESSFULLY*/ ) {


        $.ajax({
            type: 'POST',
            url: templatePath+'/lib/scripts/sendEmail.php',
            data: 'visitorname=' + visitorname + '&visitoremail=' + visitoremail + '&visitormessage=' + visitormessage,

            success: function(contactResults) {
                //SUCCESS CODE
            }

        });
    }
});

注:

  • sendEmail.phpは、PHPmailerクラスを使用して電子メールを送信する正しいスクリプトです。
  • templatePath変数には、次のような完全なテンプレートパスの値があります。 http://somedomain.com/wp-content/themes/themename
  • 上記のjQueryコードは、lib/scripts/jfunctions.js(phpスクリプトの同じディレクトリ)にあります。
  • プロセス全体(ajaxとphp)は、多くのサーバーで期待どおりに完全に機能します(私が2つのサーバーでテストし、テーマユーザーが他のサーバーでテストしました)。

問題:

一部のサーバーでは、sendEmail.phpへのajax呼び出しが実際に正常に渡され、phpスクリプトが処理されて電子メールが送信されている間、成功ハンドラーはトリガーされません。

成功ハンドラーがトリガーされない理由をfirebugで確認すると、firebugは「notfound404error」と表示します。これは誤警報のようなものです。

考えられる原因:

一部のサーバーは、このようなajax呼び出しをブロックするように構成されていると思います。

この奇妙な問題の原因は何でしょうか?それを修正する方法は?

前もって感謝します。

@nowk:sendEmail.phpコードは次のとおりです。

<?php 
// Code for loading WordPress environment goes here //

$themeName_optionTree = get_option('option_tree');

$name = trim($_POST['visitorname']);
$email = $_POST['visitoremail'];
$message = $_POST['visitormessage'];


$site_owners_email = $themeName_optionTree['owner_email'];
$site_owners_name = $themeName_optionTree['owner_name'];
$email_subject = $themeName_optionTree['email_subject'];
$success_message = '<p class="success-box">' . $themeName_optionTree['success_message'] . '</p>';

if (strlen($name) < 2) {
    $error['name'] = 1; 
}

if (!preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-]+\.([a-z0-9\-]+\.)*+[a-z]{2}/is', $email)) {
    $error['email'] = 1;    
}

if (strlen($message) < 2) {
    $error['message'] = 1;
}

if (!$error) {

    require_once('PHPMailer_v5.1/class.phpmailer.php');

    $mail = new PHPMailer(true);

    try {
        $mail->From = $email;
        $mail->FromName = $name;
        $mail->Subject = $email_subject;
        $mail->AddAddress($site_owners_email, $site_owners_name);
        $mail->Body = $message;
        $mail->Send();
        echo $success_message;
    } catch (phpmailerException $e) {
        echo '<p class="warning-box">' . $e->errorMessage() . '</p>';
    } catch (Exception $e) {
        echo '<p class="warning-box">' . $e->getMessage() . '</p>';
    }
}
?>

上記のコードは、ajaxが404を返した場合でも、完全に実行されることに注意してください。

12
mobi

サーバーは404を送信するので(神は理由を知っているため)、これを修正/回避する方法は2つあります。

  1. HTTP応答コードを無視し、jQueryajax呼び出しでsuccesscompleteに変更して、サーバーの応答に関係なく、要求が実行されたときにハンドラーが実行されるようにします。あなたはサーバーの応答を知っています(それは常に機能します)。 HTMLは、jQuery completeハンドラーで引き続き使用できます。
  2. 出力を出力する前に):header('HTTP/1.1 200 OK')を実行して、サーバー上で何かが送信する404(おそらくWordpressの何か)を上書きします。スクリプトが実行されるので、これはクレイジー404を上書きし、jQueryはその200を受け取り、successハンドラーを実行します。

あなたは両方を試すことができます=)私は最初のものがうまくいくとかなり確信しています(しかしそれはそれほどきれいではありません)。私も2番目がうまくいくと確信していますが、Wordpress約束をするのに十分なほどよくわかりません=)

28
Rudie

ここに見られるように https://cooltrainer.org/fixing-false-404-headers-on-external-pages-include-wp-blog-header-php/ このソリューションはテストされ、うまく機能します:

require_once("path/to/wp-config.php");
$wp->init();
$wp->parse_request(); 
$wp->query_posts();
$wp->register_globals(); 
$wp->send_headers();
2
Amit

WordpressにはすでにAJAXメカニズムが組み込まれていて、自分で実装するのを妨げているからだと思います。このページでは、=を追加する方法について説明していますAJAXプラグインへ:

http://codex.wordpress.org/AJAX_in_Plugins

このページの抜粋は次のとおりです。


管理側のAjax

AjaxはすでにコアWordPress管理画面に組み込まれているため、プラグインに管理側のAjax機能を追加するのはかなり簡単です。このセクションでは、その方法について説明します。

これが短い例です。これはすべて1つのファイルになります。

まず、AJAXリクエストをトリガーするJavaScriptを追加します:

<?php
add_action('admin_print_scripts', 'my_action_javascript');

function my_action_javascript() {
?>
<script type="text/javascript" >
jQuery(document).ready(function($) {

    var data = {
        action: 'my_action',
        whatever: 1234
    };

    // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
    $.post(ajaxurl, data, function(response) {
        alert('Got this from the server: ' + response);
    });
});
</script>
<?php
}

次に、そのリクエストを処理するPHP関数を設定します。

<?php 

    add_action('wp_ajax_my_action', 'my_action_callback');

    function my_action_callback() {
    global $wpdb; // this is how you get access to the database

    $whatever = intval( $_POST['whatever'] );

    $whatever += 10;

    echo $whatever;

    die(); // this is required to return a proper result
}

それでおしまい!エラーチェックやリクエストが正しい場所からのものであることの確認(check_ajax_referer()を使用)など、いくつかの詳細を追加する必要がありますが、上記の例で、管理側のAjaxプラグインを使い始めることができれば幸いです。 。注:バージョン2.8以降、javascriptコードをphpファイルからjavascriptのみのファイルに分離する場合は、javascriptグローバル変数ajaxurlを使用できます。これは、管理側にのみ当てはまります。

2
Greg Tatum

問題を掘り下げることなく、ajaxリクエストが実際に進んでいると思う場所に進んでいることを確認できます。サーバーがリクエストを/ wp-content /にリダイレクトするように設定されているなど、ここでいくつかのことが起こっている可能性があります。

Firebugを使用していくつかのヘッダー情報をキャプチャし、おそらくlivehttpヘッダーをキャプチャします。

0
Cthos