いくつかのフィールドを持つフォームと、フィールドに対応するwpdbテーブルがあります。フォームの送信ボタンがクリックされたときに、フォームのデータをテーブルに送信したいと思います。
フォームは次のとおりです。
function display_form(){
echo '
<form action="insertrow.php" method="post">
<p>Ticket id: <br />
User id: <br />
Description: <textarea class="widget" rows="4" cols="1"
name="ticket_description"></textarea>
Priority: <select name="ticket_priority" placeholder="Select">
<option value="critical">Critical</option>
<option value="urgent">Urgent</option>
<option value="important">Important</option>
<option value="standard" selected>Standard</option>
</select>
Status: <select name="ticket_status" placeholder="Select">
<option value="planned">Planned</option>
<option value="in progress">In Progress</option>
<option value="on hold">On Hold</option>
<option value="completed">Completed</option>
<option value="ready for invoice">Ready for Invoice</option>
<option value="to be invoiced as per attached">To be invoiced as per
attached</option>
</select>
</p>
<input type="submit" name="submit" value="submit">
</form>
';
}
フォームはinsertrow.phpファイルを呼び出します。
if(isset($_POST['submit']))
{
insert_row();
}
function insert_row()
{
global $wpdb;
require_once('../../../wp-config.php');
$tablename = 'st_support_ticket';
$data = array(
'ticket_id' => '1',
'ticket_user_id' => '1',
'ticket_description' => $_POST['ticket_description'] ,
'ticket_priority' => $_POST['ticket_priority'],
'ticket_status' => $_POST['ticket_status'] );
$wpdb->insert($tablename, $data);
}
これを取得して、説明、優先度、およびステータスをst_support_ticketテーブルに入力しようとしています。
[送信]をクリックすると、URLサフィックスがinsertrow.phpに変更され、空白のページが表示されます。データはテーブルに入力されません(phpmyadminで開いて確認します)。
私は何かが足りないのですか?
これはWordPressの方法ではありません。いくつかの問題がありますが、高レベルから始めましょう。
注:この回答は、dasboardではなくフロントエンドで作業していることを前提としています。
まず、フォームタグは特定のファイルを指してはいけません。フォームを変更して、現在のページを指すようにする必要があります。これを行うための怠惰な(理想的ではない)方法は、フォームタグの「アクション」を空のままにすることです。これにより、フォームは表示されているのと同じページ/ URLにポストバックされます。
<form method="post" action="">
次に、テーマのfunctions.phpファイルまたはプラグインのメインファイルを見つけて、insertrow.phpファイルを「インクルード」します。
require_once "insertrow.php;
次に、「監視」を少し変更して、「送信」よりもはるかに一意の値になるようにする必要があります。フォームには、という名前のselectが含まれているのでticket_priority
、次の点に注意することをお勧めします。
if(isset($_POST['ticket_priority']))
{
insert_row();
}
そして、私が提案している方法でこれを行う場合は、WPコードを含める必要はありません
// Comment the below line out. Not necessary.
// require_once('../../../wp-config.php');
最後に、WPサイトでは、配置されているWordPressセキュリティツールを利用したいと考えています。NONCE入力を使用することは、フォームがスパム送信されるのではなく、合法的に投稿されたことを確認するために最低限必要です。wp_nonce_fieldとwp_verify_nonceを確認してください。
「WordPressの方法」でさらにインラインで実行すると、コードは次のようになります。
function display_form(){
echo '
<form action="" method="post">';
// Add a nonce field
wp_nonce_field('MyNonceAction', 'ticket_nonce');
echo '
<p>Ticket id: <br />
User id: <br />
Description: <textarea class="widget" rows="4" cols="1"
name="ticket_description"></textarea>
Priority: <select name="ticket_priority" placeholder="Select">
<option value="critical">Critical</option>
<option value="urgent">Urgent</option>
<option value="important">Important</option>
<option value="standard" selected>Standard</option>
</select>
Status: <select name="ticket_status" placeholder="Select">
<option value="planned">Planned</option>
<option value="in progress">In Progress</option>
<option value="on hold">On Hold</option>
<option value="completed">Completed</option>
<option value="ready for invoice">Ready for Invoice</option>
<option value="to be invoiced as per attached">To be invoiced as per
attached</option>
</select>
</p>
<input type="submit" name="submit" value="submit">
</form>
';
}
また、以下のコードは、スタンドアロンファイルではなく、テーマ/プラグインコアファイルに含まれています。
if(isset($_POST['ticket_priority']))
{
// Debugging output, since you are having troubles finding the issue.
// If this doesn't fire, then you've got a problem with the select name or this code isn't included in your theme / plugin.
echo "SAVING ENTRY";
// Get the nonce value for validation
$nonce = $_POST['ticket_nonce'];
// If the nonce does not verify, do NOT process the form.
if ( ! wp_verify_nonce($nonce, 'MyNonceAction')) {
// If this spits out an error, that means the nonce failed
echo 'Security error. Do not process the form.';
return;
}
insert_row();
}
function insert_row()
{
// You should use the WP table prefixes, so let's set that up....
global $wpdb, $table_prefix;
$tablename = $table_prefix . 'st_support_ticket';
$data = array(
'ticket_id' => '1',
'ticket_user_id' => '1',
'ticket_description' => $_POST['ticket_description'] ,
'ticket_priority' => $_POST['ticket_priority'],
'ticket_status' => $_POST['ticket_status'] );
// Debugging: Lets see what we're trying to save
var_dump($data);
// FOR database SQL injection security, set up the formats
$formats = array(
'%d', // ticket_id should be an integer
'%d', // ticket_user_id should be an integer
'%s', // ticket_description should be a string
'%s', // ticket_priority should be an string
'%s' // ticket_status should be an string
);
// Debugging: Turn on error reporting for db to see if there's a database error
$wpdb->show_errors();
// Actually attempt to insert the data
$wpdb->insert($tablename, $data, $formats);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加