自分の投稿で未添付のメディアのIDを取得する方法
私は2つの投稿があります: POST A と POST B と file.pdf というPDFファイル。
file.pdf を POST A にアップロードしましたが、 POST B にも挿入しました。
file.pdf はまだ POST A に添付されているので、get_attached_media( '', $post_B_id )
を使ってIDを取得することはできません。
POST B で使用されているすべてのメディアのリストを取得するにはどうすればよいですか。 POST B ?
はい、できます。それは簡単ですか?並べ替え...高速でスケーラブルですか。ああ、親愛なる神ではありません。
ここでの解決策はこの機能です。
$post_id = url_to_postid( $url );
問題は、これは呼び出すのが高価な非常に遅い関数であるということです。すべての投稿を表示するときにこれを呼び出すと、DBサーバーは非常に大きな負荷を受け、正しく構成して専用のマシンに配置しないと倒れる可能性があります。
注:この関数を早く呼び出すことはできません。setup_theme
フック以降に配置する必要があります。そうしないと、致命的なエラーが発生します。
この機能を使用すると、投稿コンテンツ内のすべてのURLを引き出し、それが自分のサイトのURLで始まっているかどうかをテストすることができます。一致する場合、添付ファイルのいずれかに一致するかどうかを確認できます。一致しない場合は、添付されていないことがわかり、この関数を使用してコピーを取得できます。
投稿コンテンツ内のすべてのURLを取得する方法はトピックまたは別の質問です。 URLが添付された添付ファイル用かどうかをテストするのは、ループ内のifステートメントの比較が簡単です(添付されたものごとに、そのURLがテスト対象のURLと一致するかどうかを確認します)。
この機能のコストを軽減する可能性があることがいくつかあります。
url_to_postid
ほど高価ではありません。また、GUIDでしか機能しないため、精度はトレードオフの関係にあります。WP_Query
を介してすべての添付ファイルを照会し、それらすべてをメモリにロードしてから、各添付ファイルを1つずつチェックして、投稿に表示されるかどうかを確認します。
これはこれを行うためのはるかに最も遅くそして最も高価な方法です:
あなたはそのような機能を実行して投稿内のメディアを見つけて抽出することができます。
add_action('the_content', function($content) {
$mediaRegex = "/(src|href)=\"(.+?).(jpg|png|pdf)\"/i";
$mediaFind = preg_match_all($mediaRegex, $content, $media);
if (isset($media[2]) && count($media[2]) > 0)
$content = "<pre>MEDIA WITHIN THIS PAGE: \n".print_r($media[2],true)."</pre>".$content;
return $content;
});
あなたの設定に合うように正規表現パターンを修正することができます。あなたは(URLの代わりに)挿入されたメディアのクラス名を正規表現に取り、添付ファイルIDをそのように取得させることができます。
そして/または、見つかったメディアをさらに洗練してメディアライブラリに確実に格納する場合は、ライブラリのメディアアイテムのURLを配列に入れることができます。
// get the media library for comparison
$library = array();
$args = array(
'post_type' => 'attachment',
//'post_mime_type' => 'image', // if theres only one
'numberposts' => -1,
'post_status' => null,
'post_parent' => null,
);
$attachments = get_posts($args);
foreach ($attachments as $post)
$library[] = wp_get_attachment_url($post->ID);
それから、個々の$media[2]
マッチvs $library
に対してin_array()
のようなもので議論するためにいくつかのコードを書いてください。用途によっては、 Wordpress Transients を追加してライブラリスニペットをラップすることをお勧めします。
メディアファイルのすべての用途を見つけるための簡単なヒント、ソースコードを入手するのは簡単ではありません。 WordPressは用途と投稿タイプの関係を作成します。しかし、ギャラリー、プラグイン、テーマ、カスタムコードなどの中でメディアファイルを使用する機会もあります。
WordPressコアのデフォルトでは、メディア領域内のバックエンドに1つのオプションがあります。 「添付されていない」ファイルをすべて選択すると、リストが表示されます。
しかし、上記のコアソリューションを使用するか、 Media Cleaner のように、このすべての依存関係をチェックするプラグインの使用方法を検討する必要があります。私はこのプラグインを使ったことはありませんが、メディアファイルのいくつかの使い方をチェックし、あなたのメディアファイルについての概要を説明します。