如何使用wpdb删除wordpress中数据库表中的特定行?

时间:2017-03-04 06:19:36

标签: wordpress

我尝试了一切,但我不知道删除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>

1 个答案:

答案 0 :(得分:4)

您可以使用$wpdb的{​​{1}}方法:

delete

它接受以下参数:

  • 表格的名称。通常,WordPress中的表具有前缀(如something_tablename),并且此前缀在WordPress的安装过程中设置,并且在不同的站点中会有所不同。您可以使用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字段比较。

我希望这些信息足以让您完成插件。如果不是,请询问更多信息。祝好运! :)