我尝试了所有的方法,但我不知道在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>发布于 2017-03-04 15:40:23
您可以使用$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)它接受以下参数:
$wpdb->prefix (如$wpdb->prefix . 'tablename')为其添加前缀。标准表可以像$wpdb->tablename一样访问(所以,$wpdb->posts和$wpdb->prefix . 'posts'是一样的),但这只适用于WordPress自己创建的表,而不适用于您创建的表。指定需要删除哪些行的`field` = '123',则['field' => 123]将删除行。条件是使用AND逻辑连接的,因此如果您指定['field' => 123, 'otherfield' => 456],则只有在行同时具有和时,才会删除该行。第三个参数可以指定字段的值的格式。第三个参数数组中的项数应与第二个参数数组中的项数相对应。'%d'表示整数,%s表示字符串(这是默认值),%f表示浮点值。可以在WordPress class reference page上找到$wpdb的文档。
如果您需要更复杂的删除逻辑(不仅仅是field = 'something',还有其他比较),您可能需要自己编写SQL,并使用$wpdb->query(...)执行它,请参阅文档中的Running General Queries。
关于你的代码。
目前,你的代码,delete链接没有存储任何关于你想要删除的信息。你需要通过它,就像admin.php?page=newslist&eventid=<?php echo esc_attr($event_list[$i]['id']); >。然后,可以使用$_GET['eventid']访问要删除的eventid,如下所示:
if (!empty($_GET['eventid'])) {
$wpdb->delete( $wpdb->prefix . 'events',
[ 'ID' => $_GET['eventid'] ],
[ '%d' ] );
}这是而不是,这是一种推荐的方法,因为您正在创建一个GET请求。GET请求应该是用来获取信息的,而不是用来更改信息的,删除某些东西肯定是一种改变。
GET请求将所有信息存储在URL中,因此这意味着用户可能会意外地将“delete”页面加入书签,这不是我们想要的。此外,安全插件通常可以检测和阻止跨站点的POST请求,但不能检测和阻止GET请求。因此,您的站点将是不可靠的(尽管这可以通过使用site来缓解)。
推荐的方法是在POST请求中执行delete操作。为此,可以使用表单,如下所示:
<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的概念。
现时值是由WordPress生成的攻击者不知道的一段信息。您可以将其附加到表单(或链接中的URL ),并在执行删除操作之前进行检查。如果它是正确的,那么一个真正的管理员正在进行删除。要添加nonce,可以使用如下代码:
<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不仅会检查nonce,还会检查浏览器的Referer页面,以确保请求来自您的站点,而不是来自某个外部页面,并且wp_nonce_field还会插入预期的Referer字段进行比较。
我希望这些信息足以让你完成你的插件。如果没有,请询问更多信息。祝你好运!:)
https://stackoverflow.com/questions/42592849
复制相似问题