私は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;
}
OK。したがって、あなたの質問に答える前に修正する必要があるコードには多くの問題があります。
まず、正当な理由なく$_REQUEST
を使用しています-$_REQUEST
は、リクエストで送信されたすべての情報へのアクセスを提供します。つまり、$_POST['foo']
$_REQUEST['foo']
=== $_GET['foo']
and /$_COOKIE['foo']
!つまり、Cookieをローカルに設定するだけで、アプリケーションからIDをリクエストできるということです。
第二に、$post_id
を取得し、それを使用してこれを実行しています。
$ post_id = $ _REQUEST ['postID']; ... $ page = get_post($ post_id);
つまり、[get_post](https://developer.wordpress.org/reference/functions/get_post/)
のコードを精査し、アクセス権のチェックが行われないことが判明すると、ユーザー(あなたが知らない)が単一の「投稿」を取得できるようになります。あなたのウェブサイトにあります。 WordPressはテーブルwp_posts
にallpost-likeオブジェクトを格納するので、WordPress postを使用するとあらゆる種類の保護された情報を入力すると、ユーザーは(理論的には)要求するだけでこの情報にアクセスできます。
第三に、フィルタリングされていない変数を関数に渡しますa la$intro = get_post_meta($post_id, $key = 'podcast_file', true);
–ありがたいことにWordPressこの入力をフィルタリングします
4番目に、この戻り値uncheckedを送信して、別の変数$path = str_replace("http://com.areonline.co.uk/wp-content","",$intro);
を作成します
5番目に、this($path
)変数を使用して、を添付ファイルとして送信します送信者に!! !
それ以外は、 jQuery.post を使用してリクエストを送信してみてください。また、 Localize Script および(質問に答えるために、 )また、発生させたくないものにはevent.preventDefault()
を使用します。
この場合:
$("#UniqueLevelEmailButton").click(function(e){
e.preventDefault();
// blah
}
AJAX呼び出しの有効性についてはコメントできません。これは私が使っていたものとは異なるスタイルです - しかしclick(function(e) {
コードの中では、デフォルトのページアクションをトラップしてページの更新を引き起こさないようにすることができます:
$("#myelement).click(function(e){
e.preventDefault();