可以使用$wpdb
的delete
方法:
global $wpdb;
$wpdb->delete($wpdb->posts, [ 'ID' => 1 ], [ '%d' ]);
// the code above will delete the post with ID 1
// (this is just an example; if you need to delete a post,
// use wp_delete_post() instead)
它接受以下參數:
- 表格的名稱。通常,WordPress中的表格有一個前綴(比如something_tablename),這個前綴在安裝WordPress時設置,並且在不同的網站中會有所不同。您可以使用
$wpdb->prefix
(如$wpdb->prefix . 'tablename'
)來預先設定它。標準表可以像$wpdb->tablename
(so,$wpdb->posts
與$wpdb->prefix . 'posts'
是一樣的)訪問,但是這隻適用於由WordPress本身創建的表格,而不適用於由您創建的表格。
- 指定哪些行需要刪除的數組。數組中的每個項指定一個條件,數組鍵是字段名,數組值是字段值。因此
['field' => 123]
會刪除行,如果他們有`field` = '123'
。使用AND邏輯連接條件,因此如果指定['field' => 123, 'otherfield' => 456]
,則該行只有在均爲`field` = '123' AND `otherfield` = '456'
時纔會被刪除。
- 第三個參數可以指定字段值的格式。第三個參數數組中的項目數量應與第二個參數數組中的項目數量相對應。
'%d'
裝置整數,%s
意味着字符串(這是默認值),並且%f
指浮點值。
$wpdb
的文檔可在WordPress class reference page找到。
如果您需要更復雜的邏輯刪除(不只是field = 'something'
,但其他的比較),你可能需要編寫SQL自己,並與$wpdb->query(...)
執行它,請參閱Running General Queries的文件中。
關於您的代碼。
當前,您的代碼,delete
鏈接不存儲任何有關您想要刪除的信息。您需要通過它,如admin.php?page=newslist&eventid=<?php echo esc_attr($event_list[$i]['id']); >
。然後,您可以訪問eventid
刪除使用$_GET['eventid']
,像這樣:
if (!empty($_GET['eventid'])) {
$wpdb->delete($wpdb->prefix . 'events',
[ 'ID' => $_GET['eventid'] ],
[ '%d' ]);
}
這是不是推薦的方式做到這一點,因爲你要創建一個GET請求。GET請求應該用於獲取信息,而不是用於鏈接它,刪除某些內容肯定是一種改變。
GET請求將所有信息存儲在URL中,所以這意味着用戶可能會意外地爲'刪除'頁面添加書籤,這不是我們想要的。此外,安全插件通常可以檢測和阻止跨站點POST請求,但不會發出GET請求。所以,你的網站會變得很好(儘管這可以通過使用隨機數來減輕)。
推薦的方法是對POST請求進行刪除操作。對於這一點,你可以使用的形式,這樣的:
<tr>
<td><?php echo $event_list[$i]['id'] ?></td>
<td><?php echo $event_list[$i]['title'] ?></td>
<td>
<form action="<?php echo admin_url('admin-post.php'); ?>" method="POST">
<!-- nonce should go here for security -->
<input type="hidden" name="action" value="my_delete_event">
<input type="hidden" name="eventid" value="<?php echo $event_list[$i]['id']; ?> ">
<input type="submit" class="delete" value="Delete" />
</form>
</td>
</tr>
對於這個代碼工作,你需要註冊一個動作my_delete_event
(你想要的任何名稱更改本),將實際刪除的事件,然後重定向到您的頁面:
//put this code outside of all the functions
//it should be run when plugin is initialised
add_action('admin_post_my_delete_event', function() {
// Remove the event with specified eventid
if (!empty($_POST['eventid'])) {
// Nonce verification should go here, for security
$wpdb->delete($wpdb->prefix . 'events',
[ 'ID' => $_POST['eventid'] ],
[ '%d' ]);
}
//Redirect to admin.php?page=newslist
wp_redirect(admin_url('/admin.php?page=newslist'));
exit;
});
這樣比較好,但仍不夠安全。儘管攻擊者無法創建鏈接,但他們仍然可以在其網站上創建相同的表單,並誘使網站管理員點擊此表單中的按鈕。這不是我們想要的,爲了解決這個問題,WordPress有一個概念nonces。
nonce是由WordPress生成的一條信息,攻擊者不知道。您將其附加到您的表單(或鏈接中的URL),並在刪除之前進行檢查。如果它是正確的,那麼真正的管理員正在刪除。要添加一個隨機數,你可以使用這樣的事情:
<tr>
<td><?php echo $event_list[$i]['id'] ?></td>
<td><?php echo $event_list[$i]['title'] ?></td>
<td>
<form action="<?php echo admin_url('admin-post.php'); ?>" method="POST">
<?php wp_nonce_field('my_delete_event_' . $event_list[$i]['id']); ?>
<input type="hidden" name="action" value="my_delete_event">
<input type="hidden" name="eventid" value="<?php echo $event_list[$i]['id']; ?> ">
<input type="submit" class="delete" value="Delete" />
</form>
</td>
</tr>
相反的'my_delete_event_' . $event_list[$i]['id']
你可以使用任何你想要的字符串,但它是更好的,如果它包含已刪除事件的事件ID。
,並驗證正確的隨機數通過,你可以使用函數check_admin_referer
:
//put this code outside of all the functions
//it should be run when plugin is initialised
add_action('admin_post_my_delete_event', function() {
// Remove the event with specified eventid
if (!empty($_POST['eventid'])) {
$event_id = $_POST['eventid'];
check_admin_referer('my_delete_event_' . $event_id);
$wpdb->delete($wpdb->prefix . 'events',
[ 'ID' => $event_id ],
[ '%d' ]);
}
//Redirect to admin.php?page=newslist
wp_redirect(admin_url('/admin.php?page=newslist'));
exit;
});
check_admin_referer
會檢查是否在形式和刪除代碼中使用了相同的字符串,因此,如果你改變你的字符串在wp_nonce_field
,請確保你也在check_admin_referer
中更改它。字符串可以是任意的,但在兩種情況下都應該相同。
check_admin_referer
只是停止一切,並顯示錯誤,如果現時是錯誤的,所以我們不需要if (...) { ... }
語句。
其實,check_admin_referer
檢查不只是現時也有瀏覽器的Referer頁面,以確保請求是從您的網站,而不是來自於一些外部網頁,並wp_nonce_field
還插入了預期的引薦字段比較。
我希望這個信息應該足以讓你完成你的插件。如果不是,請詢問更多信息。祝你好運! :)
感謝您的詳細解答bro –
它的工作,非常感謝 –
很高興聽到它! :) –