web-dev-qa-db-ja.com

コンテンツから画像を抽出し、それを注目画像として設定する

問題:
私はWordpressのiPhoneアプリから投稿しています。画像を追加すると、その画像が説明自体に表示されますが、これは嫌いです。

私がやろうとしていること:
説明から画像を削除して、次のいずれかを実行します(あるオプションが他のオプションよりも優れていることはわかりません)。

  1. 削除された画像から画像ソースを取得し、それをカスタムフィールドに追加します。 - または -
  2. 画像を注目画像として設定

私はこれらのオプションのいずれかが私が私の投稿テンプレートで使用するために画像のURLを分離するのに役立つだろうと考えています。

私が試したこと:
文字通り、太陽の下にあるすべてのもの。今私はfunctions.phpにコードを追加していますが、結局これをプラグインにしたいと思います。

私は以下のコードはかなりオフだと思いますが、私が行った試みのいくつかを示すためにそれを投稿したいと思います。

Content_save_preに対して関数mpb_remove_post_imageを実行するアクションを追加しました...

add_action('content_save_pre', 'mpb_remove_post_image');

それに伴う問題は、私がcontent_save_preを使用してpost_idにアクセスすることができないということです(私はそれを必要とした画像を設定するために必要です)。 。

function mpb_remove_post_image( $content ){

    // strip slashes, I guess we need to readd slashes when we're done?
    $content = stripslashes($content);

    // get the first image src
    $image_src = get_first_image($content);

    // if there's an image src we can jam
    if(!is_null($image_src)){

        global $wpdb;

        // query the db for an attachment with this image
        //$thumb_id = $wpdb->get_var($wpdb->prepare("SELECT DISTINCT ID FROM $wpdb->posts WHERE guid='$image_src'"));
        $result = $wpdb->get_results("SELECT ID, post_parent FROM {$wpdb->posts} WHERE guid ='$image_src'");

        $thumb_id = $result[0]->ID;         
        $post_id = $result[0]->post_parent;

        // set the featured image
        mpb_set_featured_image($thumb_id,$post_id);
        // update_post_meta( $post_id, '_thumbnail_id', $thumb_id );

    }

    // remove any images in the content
    $content = preg_replace("/<img[^>]+\>/i", "", $content);

    $content = addslashes($content);

    return $content;
}

上記のコードは、画像を取得するために私が書いたこの関数を参照しています...

function get_first_image($html){

    require_once('simple_html_dom.php');

    $post_dom = str_get_dom($html);

    // get the first image
    $first_img = $post_dom->find('img', 0);   

    // if any images then return the src attribute
    if($first_img !== null) {
        return $first_img->src;
    }

    return null;
}

そして注目の画像を設定するには...

// set the featured image
function mpb_set_featured_image( $thumb_id, $post_id ){

    update_post_meta( $post_id, '_thumbnail_id', $thumb_id );

}

私はsave_postのアクションも追加しようとしましたが、実行する関数内で実行したことは、save_postを再度実行する別のフックをトリガーするように見えるため、無限ループになります。

誰かが(たとえそれが高レベルであったとしても)私がこれを達成するためにとることができるどんなステップを知っていますか?ここに要約すると、私はやりたいことです...

投稿を挿入するとき1)最初の画像を取得src 2)カスタムフィールドとして設定するか、おすすめの画像として設定します3)投稿から画像を削除します。

edit - 私が投稿したコードは、あなたがwp adminを通して投稿を追加した場合にうまくいくことを言及するべきです。あなたがモバイルアプリを介してそれを追加した場合でもそうではありません。

6
jyoseph

投稿が保存される前と投稿が保存された後の2つのフックを使用しないでください。

content_save_pre:このフックに添付された関数はコンテンツから画像を削除し、それをセッション/ transient に保存します。

save_post:このフックであなたは投稿のIDを持ちます。このフックに添付されている関数は、そのIDを持つ投稿におすすめの画像を設定し、セッション/ transient dataを削除します。

代わりに、あなたがあなたのアプローチを使いたければ、私はあなたがデータベースから投稿IDを検索するためにguidの代わりにpost_nameを使うべきだと思います。

1
Neerav

それがあなたの特定のシナリオで使用されているかどうかわからないが、get_the_imageプラグインをチェックする価値があるかもしれません

http://wordpress.org/extend/plugins/get-the-image/ /

FAQによると、表示する画像を探すために複数のソースをチェックします。

どうやって画像を引っ張るの?

  • カスタムフィールド(あなたが選択したもの)で画像を探します。
  • カスタムフィールドで画像が追加されていない場合は、_ post_thumbnail()を使って画像を確認してください(WP 2.9の新しい画像機能)。
  • 画像が見つからない場合は、投稿に添付されている画像が取得されます。
  • 画像が添付されていない場合は、投稿コンテンツから画像を抽出できます(デフォルトではオフ)。
  • この時点で画像が見つからない場合は、設定した画像がデフォルトになります(デフォルトでは設定されていません)。
0
chrismou