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

G.A*_*mar 0 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>
Run Code Online (Sandbox Code Playgroud)

Dzm*_*rou 6

您可以使用$wpdbdelete方法:

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)

它接受以下参数:

  • 表的名称。通常,WordPress 中的表都有一个前缀(比如 something_tablename),这个前缀是在安装 WordPress 时设置的,在不同的站点会有所不同。您可以使用$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_fieldcheck_admin_referer. 字符串可以是任意的,但在两种情况下都应该相同。

check_admin_referer如果随机数错误,则停止一切并显示错误,因此我们不需要if (...) { ... }声明。

实际上,不仅check_admin_referer检查 nonce,还检查浏览器 Referer 页面,以确保请求来自您的站点而不是来自某个外部页面,并wp_nonce_field插入预期的 Referer 字段进行比较。

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