web-dev-qa-db-ja.com

前にページを再読み込み AJAX 仕上げをリクエスト

私はWPプラグインを開発中です。ボタンクリックでURL(特にAJAX関数)を呼び出せるようにする必要がありますが、クリックするとページが更新されます。 AJAXリクエストの完了を妨げていると思います。

ボタンクリックが登録されると、JSは入力の値を取得し、それを組み合わせてURLを形成し、次にiFrameソースをそのURLに変更することを意図していますが、これは、ページ。

コードは以下のとおりです。

$intro = get_post_meta($post -> ID, $key = 'podcast_file', true);
?>
        <div class="downloadHolder">
            <h3>Download <?php echo $post->post_title ?> (<?php echo basename($intro, ".ftb") ?>)</h3>
            <a href="<?php echo $intro;?>" download="<?php echo basename($intro) ?>" class="demoBtn">Download <?php echo basename($intro, ".ftb") ?> for PC</a>
            <!--<a href="#" class="demoBtn">Demo</a>--><br>
            <input type="text" name="emailValue" id="emailValue" placeholder="Email Address" class="emailInput" style="text-align: center;">
            <button id="UniqueLevelEmailButton" class="downloadBtn" style="margin-top: 0px; width: 100%;">Email for Mobile</button>
            <span>(We do NOT collect email addresses.)</span>
            <span id="checkMe"></span>      
            <script>
                jQuery(document).ready(function($){
                    $("#UniqueLevelEmailButton").click(function(e){
                            email = document.getElementById('emailValue').value;
                            downloadurl = '<?php admin_url('admin-ajax.php');?>?action=download_email_send&postId=<?php echo $post->ID; ?>&emailValue='+email;
                            document.getElementById('emailsendframe').src = downloadurl;
                        return false;
                    });
                    return false;
                });
            </script>
<!-- iframe for submitting to -->
<iframe name="emailsendframe" id="emailsendframe" src="javascript:void(0);" style="display:none;"></iframe>
        </div>
    <?php
return ob_get_clean();
}
add_shortcode('level', 'file_download');


/*      AJAX        */


add_action('wp_ajax_download_email_send','download_email_send');
add_action('wp_ajax_nopriv_download_email_send','download_email_send');

// note $_REQUEST will work with $_POST or $_GET methods
function download_email_send() {

    $to = $_REQUEST['emailValue'];

    // preferably add some email address format validation here
    // $validate = some_email_validate_function($to);
    // if ($validated) {$message = 'Please check your email for typos.';}
    // else {
        $post_id = $_REQUEST['postID'];

    $page = get_post($post_id);
    $postName = $page->post_title;

        // ! you would need to redefine $intro here !
    $intro = get_post_meta($post_id, $key = 'podcast_file', true);
    $path = str_replace("http://example.com/wp-content","",$intro);
        $subject = 'Download for '.$postName;

        $msg = 'Your download for '.$postName.' ('.basename($intro).') is attached to this email.';

    //Why am I unable to pass HTML in the message?

        $headers = 'From: Example <[email protected]>' . "\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n";
        $mail_attachment = array(WP_CONTENT_DIR . $path);

        $send = wp_mail($to, $subject, $msg, $headers, $mail_attachment);

        if ($send) {$message = 'Success! Your download has been sent to your email address.';}
        else {$message = 'Error: Mail sending failed. Please contact the website administrator using the contact page.';}
    // }

    // alert the user to the result
    echo "<script>alert('".$message."');</script>";
    exit;
}
2
K.Briggs

このコードを実稼働環境に入れないでください

OK。したがって、あなたの質問に答える前に修正する必要があるコードには多くの問題があります。

  1. まず、正当な理由なく$_REQUESTを使用しています-$_REQUESTは、リクエストで送信されたすべての情報へのアクセスを提供します。つまり、$_POST['foo']$_REQUEST['foo'] === $_GET['foo']and /$_COOKIE['foo']!つまり、Cookieをローカルに設定するだけで、アプリケーションからIDをリクエストできるということです。

  2. 第二に、$post_idを取得し、それを使用してこれを実行しています。

    $ post_id = $ _REQUEST ['postID']; ... $ page = get_post($ post_id);

つまり、[get_post](https://developer.wordpress.org/reference/functions/get_post/)のコードを精査し、アクセス権のチェックが行われないことが判明すると、ユーザー(あなたが知らない)が単一の「投稿」を取得できるようになります。あなたのウェブサイトにあります。 WordPressはテーブルwp_postsallpost-likeオブジェクトを格納するので、WordPress postを使用するとあらゆる種類の保護された情報を入力すると、ユーザーは(理論的には)要求するだけでこの情報にアクセスできます。

  1. 第三に、フィルタリングされていない変数を関数に渡しますa la$intro = get_post_meta($post_id, $key = 'podcast_file', true); –ありがたいことにWordPressこの入力をフィルタリングします

  2. 4番目に、この戻り値uncheckedを送信して、別の変数$path = str_replace("http://com.areonline.co.uk/wp-content","",$intro);を作成します

  3. 5番目に、this$path)変数を使用して、を添付ファイルとして送信します送信者に!! !


それ以外は、 jQuery.post を使用してリクエストを送信してみてください。また、 Localize Script および(質問に答えるために、 )また、発生させたくないものにはevent.preventDefault()を使用します。

この場合:

$("#UniqueLevelEmailButton").click(function(e){
    e.preventDefault();
    // blah
}

3
FaCE

AJAX呼び出しの有効性についてはコメントできません。これは私が使っていたものとは異なるスタイルです - しかしclick(function(e) {コードの中では、デフォルトのページアクションをトラップしてページの更新を引き起こさないようにすることができます:

 $("#myelement).click(function(e){
     e.preventDefault();
0
C C