スラッグに「○○」という単語が含まれる記事を検索したい、と思ったのですが、意外なことにget_postsやpre_get_postsで抽出することができませんでした。s=ほげほげで簡単に取れるかと思ったのですが……。
方法を調べましたので紹介します。
ADs
データベースに接続できるwpdbクラスを使い、SQL文を送って検索します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php global $wpdb; //スラッグに「slug」を含むものを返す $posts = $wpdb->get_results($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name LIKE %s AND post_type = 'post' AND post_status = 'publish'", '%%slug%%')); //$postsはIDのみを持つ配列となります foreach($posts as $post){ //たとえば、リンク一覧を表示させる echo '<a href="'.get_the_permalink($post->ID).'">'.get_the_title($post->ID).'</a>'; } } ?> |
ざっくり言うと
$wpdb->get_results($wpdb->prepare(SQL文)
でほしい内容が取得できます。データベースから直接結果を取り出しますので、SQLを上手く書ければ高速化や通常のクエリではできない検索条件を設定することができます。
ただ私は正直あまり得意ではないです……。
今回私がやりたかったことは「スラッグの末尾が『-2』『-3』…で終わっている記事を削除する」ということでした。
同一スラッグを指定して投稿してしまった場合、スラッグの末尾に「-数字」が付加されます。
そのような投稿のみを抽出し、削除して記事を整理したかったのです。
以下をfunctions.phpに記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function delete_duplicate(){ if($_GET['del'] == 'exec'){ global $wpdb; //スラッグに「-数字」を含むものを返す $posts = $wpdb->get_results($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name LIKE %s AND post_type = 'post' AND post_status = 'publish'", '%%-[0-9]')); //$postsはIDのみを持つ配列となります foreach($posts as $post){ wp_delete_post($post->ID); } } } add_action('admin_init','delete_duplicate'); |
これで管理画面上で「www.example.com/wp-admin/index.php?del=exec」にアクセスすると、同一スラッグで投稿してしまった記事が削除されます。
記事削除を行う処理ですので、実行時はvar_dumpでIDを確認するなど注意して実行してください。
以下のサイトの内容が参考になりました。ありがとうございます。
WordPressからデータベースに直接アクセスする | webOpixel
【WP】$wpdb->prepare内のSQL文にワイルドカード【LIKE %】を使用する場合。Wordpress : 僕の私の備忘録
ADs
コメントはまだありません。