3

IMAGE URL はあるが、添付されていない添付ファイルの ID がないというユニークなシナリオに遭遇しました (奇妙に聞こえることはわかっていますが、wordpress の用語では正しい :-) )。

ユーザーが画像をアップロードできるプラグインで、ワードプレスの添付ファイルアップロードフォームを使用しています。次に、$options フィールドに値を入力する [投稿に挿入] ボタンをクリックします。(標準手順)

次に、その画像の ID が必要です。問題は、wordpress のほとんどの機能が動作するために ID を必要とすることです。

次のようなコードを使用して、その画像の ID を取得できます。

$image_src = $options['upload_image'] ; // the options field in the plugin that holds the image URL


    $postid_img  = $wpdb->get_var(
        "SELECT ID FROM $wpdb->posts 
         WHERE guid = '$image_src' 
         AND post_type='attachment' LIMIT 1");

$postid_imgは実際には ID です。

では、どこに問題があるのでしょうか?

問題は、選択した画像サイズが FULL 画像サイズの場合にのみ、このコードが完全に機能することです。URL に中間の画像サイズがある場合 (例: 画像名、したがって URL には ImageName -123x4500 .jpg のようなサフィックス サイズが付きます) - 上記の関数は0を返します。

wordpress の添付ファイル関連の関数 ( get_intermediate_size()、またはget_attachment_url()他の多くの など)のほとんどは、パラメーターとしてIDを必要とします。しかし、関数のこの段階では ID を持っていません。

- と呼ばれる少し未知の関数も試しましたが、 url_to_postid( $url )これも失敗しました。

理論的には、フォームから他のすべてのサイズを削除できることはわかっていますが、それは「ハック」であり、解決策ではありません。特に、他のプラグインと共存する必要がある可能性のあるプラグイン内にいる場合はそうです。

では、その時点で添付されていない (投稿、ページではない) 不明な ID を持つ「カスタム」画像 URL に基づいて、(「フル」画像の) ID を取得するにはどうすればよいですか?

(投稿オブジェクトまたはカスタムクエリ(直接SQLではない)を含むすべてのソリューションはおそらく失敗することに注意してください。この時点では、アップロードされたとしても、画像は何にも添付されていないためです。)

編集私

(注 2 - トリミング/正規表現などの URL でのすべての文字列操作は危険すぎて実行できません。解像度の部分 (例: 300x300) に依存する場合 - 4 桁 x 4 桁、3 x 4 など、それが何になるかはわかりません。 . "-" 文字に依存している場合、イメージ名自体に表示されないという保証はありません。)

編集 II 更新 I -

この問題を「解決」するためのハックを見つけました。「解決」と書くのは、MY SPECIFIC CASE で機能するためですが、すべての場合では機能しません。(私を正しい方向に導いてくれた #wordpress IRC の kovshenin に感謝します)

入力フィールドを更新する jQuery コードを次のように変更しました。

window.send_to_editor = function(html) {
    imgurl = jQuery('img',html).attr('src');
    jQuery('#upload_image').val(imgurl);
    tb_remove();
    }

に :

window.send_to_editor = function(html) {
       var attachment_id = 0;
       var classes = jQuery('img',html).attr('class').match(/wp\-image\-([0-9]+)/); // regex to "hijack" the class name (which is the ID)
       if ( classes[1] )
        attachment_id = classes[1];
            imgurl = jQuery('img',html).attr('src');
            jQuery('#upload_image').val(attachment_id); // assign att id.
           tb_remove();
};

このコードが実際に行うことは、(ID を含む) アップロード フォームから CLASS 名を取得し、URL の代わりに正しい ID を入力フィールドに入力することです。

これはせいぜい「ハック」であり、すべての状況に対する解決策ではありません。しかし、私の特定のシナリオでは、動作します。

ここで興味深いのは、フォーム内のこの CLASS 名に ID が含まれている場合、ID を取得する方法が必要であるということです。それはそこに存在します - したがって、何か (フック / フィルタ / 変数) がそこにあるに違いありません。

@biziclop が提案した解決策は 正しいもののようですが何らかの理由で私のコードでは機能しません。たぶん、いくつかの小さなことを変更する必要があります。(更新 II を参照)

誰かが同じアプローチのbackup_sizes代わりに使用することを提案しましたが、それでも nadaです。_wp_attachment_metadata

誰かが答えを持っている場合 - 投稿してください。それを取得する方法がないとは信じられません (特に class-postID のようなフォーム コードに存在する場合:-)

更新 II -

@biziclop ソリューションはうまく機能しています。私のテーブルにはデフォルトの名前変更がないという単純な事実を見逃していました。そのため、彼のコードを「そのまま」使用すると NULL 配列が返されます。(それと、DEBUGモードをオンにせずに進行しようとする愚かな考え:-) )

ありがとうございます!

上記(および以下)のソリューションはすべて機能します。

私がまだ興味を持っていることの 1 つは、アップロード フォームの上記のクラスです。それらが正しいID(クラスID)で生成されている場合、単純なフック/フィルターでそれらを取得する方法が必要です..しかし、それは後であると思います.

4

1 に答える 1

3

添付ファイルはwp_postswp_postmetaテーブルに保存されます。

wp_posts.guidアップロード場所に元のファイル名が含まれているようです

wp_postmeta(ここでmeta_key= "_wp_attachment_metadata")には、シリアル化された(http://php.net/manual/en/function.serialize.php)PHP配列が含まれます。これには、特にサイズ変更されたファイル名が含まれます。

a:6:{s:5: "width"; s:4: "1000"; s:6: "height"; s:3: "750"; s:14: "hwstring_small"; s:23: " height = '96' width = '128' "; s:4:" file "; s:35:" 2010/12 / IMG_2543-e1291981569982.jpg "; s:5:" sizes "; a:3:{s :9: "thumbnail"; a:3:{s:4: "file"; s:33: "IMG_2543-e1291981569982-90x67.jpg"; s:5: "width"; s:2: "90"; s:6: "height"; s:2: "67";} s:6: "medium"; a:3:{s:4: "file"; s:35: "IMG_2543-e1291981569982-180x135.jpg "; s:5:" width "; s:3:" 180 "; s:6:" height "; s:3:" 135 ";} s:5:" large "; a:3:{s: 4: "file"; s:35: "IMG_2543-e1291981569982-500x375.jpg"; s:5: "width"; s:3: "500"; s:6: "height"; s:3: "375 ";}} s:10:"image_meta "; a:10:{s:8:" aperture "; s:1:" 0 "; s:6:" credit "; s:0:" "; s:6:" camera "; s:0 :""; s:7: "caption"; s:0: ""; s:17: "created_timestamp"; s:1: "0"; s:9: "copyright"; s:0: ""; s:12: "focal_length"; s:1: "0"; s:3: "iso"; s:1: "0"; s:13: "shutter_speed"; s:1: "0"; s: 5: "title"; s:0: "";}}"0"; s:5:" title"; s:0: "";}}"0"; s:5:" title"; s:0: "";}}

post_idWordPress/サイズ変更されたファイル名で検索できる唯一の方法は次のとおりです。

•MySQLを使用して潜在的な一致をLIKE事前フィルタリングする(遅くなります):

SELECT     wp_posts.ID, wp_postmeta.meta_value
FROM       wp_posts
INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
                      AND wp_postmeta.meta_key = '_wp_attachment_metadata'
                      AND wp_postmeta.meta_value LIKE '%"IMG_2345-100x100.jpg"%'

•各meta_valueを( http://codex.wordpress.org/Function_Reference/maybe_unserialize ?を使用して)シリアル化解除し、ファイル名と本当に一致するかどうかを手動で確認して、PHPでの検索結果を確認/絞り込みます。

パートII。

function thumbnail_url_to_id( $file_url ){
  global $wpdb;
  $filename = basename( $file_url );

  $rows = $wpdb->get_results( $wpdb->prepare("
  SELECT     wp_posts.ID, wp_postmeta.meta_value
  FROM       wp_posts
  INNER JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
                        AND wp_postmeta.meta_key = '_wp_attachment_metadata'
                        AND wp_postmeta.meta_value LIKE %s
  ",'%"'.like_escape($filename).'"%'
  ));

  foreach( $rows as $row ){
    $row -> meta_value = maybe_unserialize( $row -> meta_value );
    //tr( $row );
    var_dump( $row );
  }
}

$files = explode("\n",
'TEST_123-90x67.jpg
TEST_123-90x671.jpg
TEST_123-180x134.jpg
TEST_123-180x1341-90x67.jpg
TEST_123-180x1341.jpg
TEST_123-500x373.jpg
TEST_123-500x3731-90x67.jpg
TEST_123-500x3731-180x134.jpg
TEST_123-500x3731.jpg
TEST_123.jpg
TEST_1231-90x67.jpg
TEST_1231-180x134.jpg
TEST_1231-500x373.jpg
TEST_1231.jpg');
$upload_base = 'http://cc/wordpress/wp-content/uploads/2012/06/';

foreach( $files as $filename ){
  thumbnail_url_to_id( $upload_base.$filename );
}

テスト結果: http: //jsfiddle.net/PcjKA/

于 2012-06-12T08:01:38.107 に答える