可以使用$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 –
它的工作,非常感谢 –
很高兴听到它! :) –