すべてを試しましたが、ワードプレスでテーブルの特定の行を削除する方法がわかりません。
テーブル内の特定の行を削除する方法を教えてください。ワードプレス プラグインを実行しています。
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>
$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]
と、両方がある 場合にのみ行が削除され`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']); >
ます。次に、次のように にアクセスして、eventid
を使用して削除できます$_GET['eventid']
。
if (!empty($_GET['eventid'])) {
$wpdb->delete( $wpdb->prefix . 'events',
[ 'ID' => $_GET['eventid'] ],
[ '%d' ] );
}
これはないあなたがGETリクエストを作成していることから、これを行う際に推奨されます。GET リクエストは、情報を取得するために使用する必要があり、送信するためではありません。また、何かを削除することは間違いなく変更です。
GET リクエストはすべての情報を URL に保存するため、ユーザーが誤って「削除」ページをブックマークしてしまう可能性がありますが、これは私たちが望んでいるものではありません。また、セキュリティ プラグインは通常、クロスサイト POST リクエストを検出してブロックできますが、GET リクエストは検出できません。したがって、サイトは vunerable になります (ただし、これは nonce を使用することで軽減できます)。
推奨される方法は、削除アクションを 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>
このコードを機能させるに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 にはnonce の概念があります。
nonce は、攻撃者が知らない 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 を含める方がよいでしょう。
そして、正しい nonce が渡されていることを確認するには、関数を使用できます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
nonce が間違っている場合は、すべてを停止してエラーを表示するだけなので、if (...) { ... }
ステートメントは必要ありません。
実際には、check_admin_referer
ノンスだけでなくブラウザのリファラーページもチェックして、リクエストが外部ページからではなくサイトからのものであることを確認し、wp_nonce_field
比較するために予期されるリファラーフィールドを挿入します。
この情報がプラグインを完成させるのに十分であることを願っています。いいえの場合は、詳細をお問い合わせください。がんばろう!:)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加