我尝试了所有方法,但我不知道要删除 wordpress 表中的特定行。
有人请帮助如何删除表中的特定行,我正在做 wordpress 插件。
有人说用wpdb,但我不知道怎么做
这是我的代码
<table class="wp-list-table widefat fixed striped users" id="list" style="margin-top:10px;">
<tr>
<th class="center"><span>ID</span></th>
<th class="center"><span>Title</span></th>
<th class="center"><span>Action</span></th>
</tr>
<?php
if(!empty($event_list))
{
$arrlen = count($event_list);
for ($i=0; $i<$arrlen; $i++)
{
?>
<tr>
<td><?php echo $event_list[$i]['id'] ?></td>
<td><?php echo $event_list[$i]['title'] ?></td>
<td><a class="delete" href="<?php echo site_url();?>/wp-admin/admin.php?page=newslist">Delete</a></td>
</tr>
<?php
}
}
else
{
?>
<td>No Records Found</td>
<?php }?>
</table>
Run Code Online (Sandbox Code Playgroud)
您可以使用$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)
Run Code Online (Sandbox Code Playgroud)
它接受以下参数:
$wpdb->prefix(如$wpdb->prefix . 'tablename')预先添加它。可以像访问标准表$wpdb->tablename(因此,$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 类参考页面上找到的文档。
如果您需要更复杂的删除逻辑(不仅仅是field = 'something',还有其他比较),您可能需要自己编写 SQL,并使用 执行它$wpdb->query(...),请参阅文档中的运行常规查询。
关于你的代码。
目前,您的代码,delete链接不存储有关您要删除的内容的任何信息。你需要通过它,比如admin.php?page=newslist&eventid=<?php echo esc_attr($event_list[$i]['id']); >。然后,您可以使用 访问eventidto delete $_GET['eventid'],如下所示:
if (!empty($_GET['eventid'])) {
$wpdb->delete( $wpdb->prefix . 'events',
[ 'ID' => $_GET['eventid'] ],
[ '%d' ] );
}
Run Code Online (Sandbox Code Playgroud)
这不是执行此操作的推荐方法,因为您正在创建 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>
Run Code Online (Sandbox Code Playgroud)
要使此代码起作用,您需要注册一个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;
});
Run Code Online (Sandbox Code Playgroud)
这更好,但仍然不够安全。尽管攻击者无法创建链接,但他们仍然可以在其站点上创建相同的表单,并诱使站点管理员单击此表单中的按钮。这不是我们想要的,为了解决这个问题,WordPress 有一个nonces的概念。
随机数是攻击者不知道的 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>
Run Code Online (Sandbox Code Playgroud)
'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;
});
Run Code Online (Sandbox Code Playgroud)
check_admin_referer将检查表单和删除代码中是否使用了相同的字符串,因此如果您wp_nonce_field在check_admin_referer. 字符串可以是任意的,但在两种情况下都应该相同。
check_admin_referer如果随机数错误,则停止一切并显示错误,因此我们不需要if (...) { ... }声明。
实际上,不仅check_admin_referer检查 nonce,还检查浏览器 Referer 页面,以确保请求来自您的站点而不是来自某个外部页面,并wp_nonce_field插入预期的 Referer 字段进行比较。
我希望这些信息足以让您完成您的插件。如果不是,请询问更多信息。祝你好运!:)
| 归档时间: |
|
| 查看次数: |
9937 次 |
| 最近记录: |