我尝试了一切,但我不知道删除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>
答案 0 :(得分:4)
您可以使用$wpdb
的{{1}}方法:
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)
(例如$wpdb->prefix
)作为前缀。标准表可以像$wpdb->prefix . 'tablename'
一样访问(因此,$wpdb->tablename
与$wpdb->posts
相同),但这仅适用于由WordPress本身创建的表,而不适用于由您创建的表。< / LI>
$wpdb->prefix . 'posts'
会删除行['field' => 123]
。使用AND逻辑加入条件,因此,如果您指定`field` = '123'
,则只有 ['field' => 123, 'otherfield' => 456]
时才会删除该行。`field` = '123' AND `otherfield` = '456'
表示整数,'%d'
表示字符串(这是默认值),%s
表示浮动 - 点值。可以在WordPress class reference page上找到%f
的文档。
如果您需要更复杂的删除逻辑(不只是$wpdb
,而是其他比较),您可能需要自己编写SQL并使用field = 'something'
执行它,请参阅中的Running General Queries文档。
关于您的代码。
目前,您的代码$wpdb->query(...)
链接未存储有关您要删除的内容的任何信息。您需要传递它,例如delete
。然后,您可以使用admin.php?page=newslist&eventid=<?php echo esc_attr($event_list[$i]['id']); >
访问eventid
进行删除,如下所示:
$_GET['eventid']
这是不推荐的方法,因为您正在创建GET请求。 GET请求应该用于获取信息,而不是用于查找信息,删除内容肯定是一种变化。
GET请求将所有信息存储在URL中,这意味着用户可能会意外地将“删除”标记为“删除”。页面,这不是我们想要的东西。此外,安全插件通常可以检测和阻止跨站点POST请求,但不能检测和阻止GET请求。因此,您的网站将是有价值的(尽管可以通过使用nonce来减轻这种情况)。
推荐的方法是对POST请求执行删除操作。为此,您可以使用表单,如下所示:
if (!empty($_GET['eventid'])) {
$wpdb->delete( $wpdb->prefix . 'events',
[ 'ID' => $_GET['eventid'] ],
[ '%d' ] );
}
要使此代码生效,您需要注册一个动作<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
这样更好,但仍然不够安全。虽然攻击者无法创建链接,但他们仍然可以在其网站上创建相同的表单,并欺骗网站管理员点击此表单中的按钮。这不是我们想要的,为了解决这个问题,WordPress有一个nonces的概念。
随机数是一种由WordPress生成的信息,攻击者不知道。您将它附加到您的表单(或链接中的URL),并在删除之前进行检查。如果它是正确的,那么真正的管理员正在进行删除。要添加随机数,您可以使用以下内容:
//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;
});
您可以使用所需的任何字符串代替<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>
,但如果它包含已删除事件的事件ID,则会更好。
要验证是否传递了正确的nonce,可以使用函数'my_delete_event_' . $event_list[$i]['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
只是停止所有内容并在nonce错误时显示错误,因此我们不需要check_admin_referer
语句。
实际上,if (...) { ... }
不仅会检查nonce,还会检查浏览器Referer页面,以确保请求来自您的网站,而不是来自某个外部网页,check_admin_referer
也会插入预期的Referer字段比较。
我希望这些信息足以让您完成插件。如果不是,请询问更多信息。祝好运! :)