web-dev-qa-db-ja.com

注目の画像を自動的に設定する

すべての投稿を変更して、ハードコーディングされた同じ特徴のある画像が同じになるようにするにはどうすればよいですか。この葉巻を言う:

https://www.cigarsofcuba.co.uk/acatalog/slide1.jpeg

(私は実際にはこれをやりたくありません - しかしそれはもっと複雑なものの中のつまずきブロックです。)

私はそれがこれであるべきだと思います:

function set_post_thumbnail( $post, $thumbnail_id ) {
    $thumbnail_id = "https://www.cigarsofcuba.co.uk/acatalog/slide1.jpeg";
    update_post_meta( $post->ID, '_thumbnail_id', $thumbnail_id );

}

add_action( 'save_post', 'set_post_thumbnail' );

...しかし葉巻はありません。何が足りないの?ありがとうございます。

4
JohnG

方法1:publish_postフック*とmedia_sideload_image()を使用する

ここでは、URLから画像をアップロードして投稿に添付し、投稿が公開されたときにおすすめの画像として設定します。

*実際には、動的フック{$new_status}_{$post->post_type}を使用しています。これはpost投稿タイプをpublishステータスに移行することを示します。詳細は wp-includes/post.php を参照してください。

このコード例は、投稿タイプpostを公開するときに適用されます。手動で設定されている場合は、おすすめの画像を自動的に割り当てないようにチェックが行われています。必要に応じてこれをカスタマイズしてください。

/**
 * Download image, attach it to the current post, and assign it as featured image
 * upon publishing the post.
 *
 * The dynamic portions of the hook name, `$new_status` and `$post->post_type`,
 * refer to the new post status and post type, respectively.
 *
 * Please note: When this action is hooked using a particular post status (like
 * 'publish', as `publish_{$post->post_type}`), it will fire both when a post is
 * first transitioned to that status from something else, as well as upon
 * subsequent post updates (old and new status are both the same).
 *
 * @param int     $post_id Post ID.
 * @param WP_Post $post    Post object.
 */
add_action( 'publish_post', 'wpse_default_featured_image', 10, 2 );
function wpse_default_featured_image( $post_id, $post ) {
    // Bail if there is already a post thumbnail set.
    $current_post_thumbnail = get_post_thumbnail_id( $post_id );
    if ( '' !== $current_post_thumbnail ) {
        return;
    }

    $url = 'https://www.cigarsofcuba.co.uk/acatalog/slide1.jpeg';
    $title = "The default featured image.";

    $image = media_sideload_image( $url, $post_id, $title, 'id' );
    set_post_thumbnail( $post_id, $image );
}

方法2:投稿のサムネイルにフィルタを適用する

フィルタを使用することで、投稿のサムネイルを「仮想的に」設定できます。この方法では、すべての投稿の投稿サムネイルをその場で簡単に変更できます。

フィルタ1: post_thumbnail_html

post_thumbnail_htmlフィルタを使用して、投稿サムネイルのHTML出力を上書きすることができます。

/**
 * Filters the post thumbnail HTML.
 *
 * @param string       $html              The post thumbnail HTML.
 * @param int          $post_id           The post ID.
 * @param string       $post_thumbnail_id The post thumbnail ID.
 * @param string|array $size              The post thumbnail size. Image size or array of width and height
 *                                        values (in that order). Default 'post-thumbnail'.
 * @param string       $attr              Query string of attributes.
 */
add_filter( 'post_thumbnail_html', 'wpse_post_thumbnail_html', 10, 5 );
function wpse_post_thumbnail_html( $html, $post_id, $post_thumbnail_id, $size, $attr ) {
    return '<img src="https://www.cigarsofcuba.co.uk/acatalog/slide1.jpeg" alt="Have a cigar">';
}

フィルタ2: get_post_metadataメタキーで_thumbnail_idを使用する。

これは、各投稿のサムネイルIDを異なるIDで上書きする別の方法です。

特別なサムネイル画像をアップロード/選択できるように(ローカルで、URLから、またはメディアライブラリから)カスタマイザ設定またはオプションページを実装することをお勧めします。その後、get_post_metadataフィルタを使用して、各投稿サムネイルのメタキー_thumbnail_idに関連付けられている値を変更できます。

/**
 * Dynamic hook: "get_{$meta_type}_metadata"
 * 
 * Filters whether to retrieve metadata of a specific type.
 * 
 * The dynamic portion of the hook, `$meta_type`, refers to the meta
 * object type (comment, post, or user). Returning a non-null value
 * will effectively short-circuit the function.
 *
 * @param null|array|string $value     The value get_metadata() should return - a single metadata value,
 *                                     or an array of values.
 * @param int               $object_id Object ID.
 * @param string            $meta_key  Meta key.
 * @param bool              $single    Whether to return only the first value of the specified $meta_key.
 */
add_filter( 'get_post_metadata', 'wpse_featured_image_id_override', 100, 4 );
function wpse_featured_image_id_override( $value, $object_id, $meta_key, $single ) {
    $thumbnail_id_key = '_thumbnail_id';

    // Bail if this is not the correct meta key. Return the original value  immediately.
    if ( ! isset( $meta_key ) || $thumbnail_id_key !== $meta_key ) {
        return $value;
    }

    // Add additional guard clauses if necessary... (check post type, etc.)

    // Get the id for an image uploaded elsewhere.
    // This could be pulled from the customizer or a plugin options page.
    return 807;  // Example ID
}
3
Dave Romsey

あなたは単にこれでページ/投稿を保存する際に(画像が設定されているかどうかにかかわらず)注目の画像を上書きすることができます:

//this is called on saving page/post
add_action('save_post', 'force_featured_image');

function force_featured_image( $post_id ){
   //set the featured image
   set_post_thumbnail( $post_id, [image_id] );
}

_ note _ '[image_id]'をあなたの画像IDに置き換えてください。

3
Phill Healey
function wpb_autolink_featured_images( $html, $post_id, $post_image_id ) {
    if (! is_singular()) {
        $html = '<a href="' . get_permalink( $post_id ) . '" title="' 
                . esc_attr( get_the_title( $post_id ) ) . '">' . $html . '</a>';
        return $html;
    } else {
        return $html;
    }
}
add_filter( 'post_thumbnail_html', 'wpb_autolink_featured_images', 10, 3 );
0
Ajay Prajapati