web-dev-qa-db-ja.com

投稿にすべてのファイルを挿入(添付はしない)する方法

自分の投稿で未添付のメディアの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

3
Levi Dulstein

はい、できます。それは簡単ですか?並べ替え...高速でスケーラブルですか。ああ、親愛なる神ではありません。

超高価なソリューション

ここでの解決策はこの機能です。

$post_id = url_to_postid( $url );

問題は、これは呼び出すのが高価な非常に遅い関数であるということです。すべての投稿を表示するときにこれを呼び出すと、DBサーバーは非常に大きな負荷を受け、正しく構成して専用のマシンに配置しないと倒れる可能性があります。

注:この関数を早く呼び出すことはできません。setup_themeフック以降に配置する必要があります。そうしないと、致命的なエラーが発生します。

この機能を使用すると、投稿コンテンツ内のすべてのURLを引き出し、それが自分のサイトのURLで始まっているかどうかをテストすることができます。一致する場合、添付ファイルのいずれかに一致するかどうかを確認できます。一致しない場合は、添付されていないことがわかり、この関数を使用してコピーを取得できます。

投稿コンテンツ内のすべてのURLを取得する方法はトピックまたは別の質問です。 URLが添付された添付ファイル用かどうかをテストするのは、ループ内のifステートメントの比較が簡単です(添付されたものごとに、そのURLがテスト対象のURLと一致するかどうかを確認します)。

物事をスピードアップ

この機能のコストを軽減する可能性があることがいくつかあります。

  • Save and update postsフックでプロセスを実行し、結果をpost metaに保存します
  • 処理速度を上げるために関数をキャッシングレイヤでラップします(memcachedのようなオブジェクトキャッシングソリューションがある場合にのみ有効です。前のメカニズムほど効果的ではありません)。これはキャッシュを迂回するでしょう、そしてそれはまだ高価です、しかしurl_to_postidほど高価ではありません。また、GUIDでしか機能しないため、精度はトレードオフの関係にあります。

さらに高価なソリューション

WP_Queryを介してすべての添付ファイルを照会し、それらすべてをメモリにロードしてから、各添付ファイルを1つずつチェックして、投稿に表示されるかどうかを確認します。

これはこれを行うためのはるかに最も遅くそして最も高価な方法です:

  • より多くのメディアをアップロードすると、30または40を超える添付ファイルがあるサイトでは、クエリを実行するときにより多くの負荷をかけなければならなくなります。
  • これは大変なデータベース操作であり、あなたのDBはすべての添付ファイルを送信しなければなりません、そしてあなたが一度に数人の閲覧者を持っているなら、これは非常に問題になるでしょう。
  • 5〜10人の同時接続ユーザーを超えることは決してありません。
  • すべての添付ファイルのチェックに時間がかかる
3
Tom J Nowell

あなたはそのような機能を実行して投稿内のメディアを見つけて抽出することができます。

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 を追加してライブラリスニペットをラップすることをお勧めします。

2
David Sword

メディアファイルのすべての用途を見つけるための簡単なヒント、ソースコードを入手するのは簡単ではありません。 WordPressは用途と投稿タイプの関係を作成します。しかし、ギャラリー、プラグイン、テーマ、カスタムコードなどの中でメディアファイルを使用する機会もあります。

コア、バックエンド内側

WordPressコアのデフォルトでは、メディア領域内のバックエンドに1つのオプションがあります。 「添付されていない」ファイルをすべて選択すると、リストが表示されます。 enter image description here 

代替プラグイン

しかし、上記のコアソリューションを使用するか、 Media Cleaner のように、このすべての依存関係をチェックするプラグインの使用方法を検討する必要があります。私はこのプラグインを使ったことはありませんが、メディアファイルのいくつかの使い方をチェックし、あなたのメディアファイルについての概要を説明します。

0
bueltge