web-dev-qa-db-ja.com

ギャラリー画像のタイトル - 投稿から取得

追加された画像のタイトル(またはギャラリーの作成中に追加されたもの)を投稿のタイトルで自動的に上書きする関数フックを作成することはできますか?例のように: - lorem ipsumという投稿を作成しています - 私はpingpong.jpgというファイルをアップロードしています - デフォルトではフックなしでwordpressが画像にタイトルを付けます:pingpong.jpg - 予想されるフックの結果:私の画像のタイトルは次のようになります画像をアップロードする:lorem ipsum

関数でも可能ですか?

その上で、私は自動的に変更を処理するギャラリのショートコードに属性を追加することを利用したいと思います。これまでのところ、私はそのようなものがあります:

add_filter('shortcode_atts_gallery','overwrite_gallery_atts_wpse_95965',10,3);
function overwrite_gallery_atts_wpse_95965($out, $pairs, $atts){
    $out['parent_titles']='yes';
    return $out;
}
2
Julia Galden

Gallery Image Caption - 投稿のタイトルとして添付されている

ネイティブギャラリーのショートコードでカスタムのparent_titles属性を使用してそれを行う1つの方法があります。

これは、ギャラリークエリに対してsuppress_filtersfalseに設定し、the_postsフィルタを通して投稿の抜粋を変更することで実現できます。 shortcode_atts_galleryフィルタを通してカスタム属性の入力を確認することができます。

parent_titlesブール文字列として使用すると、次のように使用できます。

[gallery parent_titles="yes" ids="132,321,213"]

[gallery parent_titles="true" ids="132,321,213"]

[gallery parent_titles="1" ids="132,321,213"]

これが私が@JuliaGalden用に作成したテストケースのスクリーンショットです。

最初に3つの投稿を作成し、それぞれに対応するカラー画像を添付しました。

posts

それから私はとギャラリーを作成しました:

[gallery ids="132,321,213"]

それは次のような画像のキャプションで現れました:

normal

それから私はカスタム属性を追加しました:

[gallery parent_titles="yes" ids="132,321,213"]

そしてそれは次のように現れました:

With parent titles

キャプションが親投稿のタイトルになりました。

デモプラグイン

これは、この機能をサポートするデモプラグインです(PHP 5.4以降)。

<?php
/** 
 * Plugin Name: Gallery Image Caption As The Parent Post's Title
 * Description: Support for boolean parent_titles attribute in native post galleries
 * Plugin URI:  http://wordpress.stackexchange.com/a/228857/26350
 * Version:     1.0.1
 */

namespace WPSE\Q228851;

class Main 
{
    /**
     * @var bool
     */
    private $active;    

   /**
    * Setup actions and filters
    */
    public function activate()
    {
       add_filter( 'shortcode_atts_gallery', [ $this, 'shortcode_atts_gallery' ], 999, 3 );
       add_action( 'pre_get_posts',          [ $this, 'pre_get_posts' ] );
       add_filter( 'the_posts',              [ $this, 'the_posts' ] );      
    }   

   /**
    * Activate if the parent_titles attribute is set
    */
   public function shortcode_atts_gallery( $out, $pair, $atts )
   {
       if(    isset( $out['parent_titles'] ) 
              && wp_validate_boolean( $out['parent_titles'] )
          || 
              isset( $atts['parent_titles'] ) 
              && wp_validate_boolean( $atts['parent_titles'] )  
       )
           $this->active = true;

        return $out;
    }

   /**
    * Don't suppress filters for the gallery posts query
    */
    public function pre_get_posts( \WP_Query $q )
    {
        if( $this->active )
            $q->set( 'suppress_filters', false );
    }

   /**
    * Override each image title with the title of post it's attached to
    */
    public function the_posts( $posts )
    {
        if( $this->active )
        {
            foreach( $posts as $post )
            {
                if( $post->post_parent )
                    $post->post_excerpt = get_post_field( 'post_title', $post->post_parent ); 
            }
            $this->active = false;
        }
        return $posts;
    }   

} // end class


/**
 * Activate
 */
( new Main )->activate();

インストール方法:このコードを/wp-content/plugins/galleries-with-parent-post-titles/plugin.phpファイルにコピーしてwp-adminバックエンドで通常通りプラグインを有効にしてください。次に、親投稿のタイトルを表示するギャラリーのショートコードにparent_titles="yes"を追加します。

すべてのギャラリーの自動有効化

すべてのギャラリーでこれを自動的に行うには、Main::shortcode_atts_gallery()メソッドを次のように変更します。

   public function shortcode_atts_gallery( $out, $pair, $atts )
   {
        $this->active = true;
        return $out;
    }

または@JuliaGaldenによって作成された次のフィルタを使用します。 functions.php内:

add_filter('shortcode_atts_gallery', 'overwrite_gallery_atts_wpse_95965', 10, 3 );
function overwrite_gallery_atts_wpse_95965( $out, $pairs, $atts )
{
    $out['parent_titles'] = 'yes';
    return $out;
}

プラグインでそれを使用したい場合は、それをに変更する必要があります。

add_filter( 'shortcode_atts_gallery', __NAMESPACE__ . '\\overwrite_gallery_atts_wpse_95965', 10, 3 );
function overwrite_gallery_atts_wpse_95965( $out, $pairs, $atts )
{
    $out['parent_titles']='yes';
    return $out;
}

プラグインの名前空間を追加したので。

代わりにフィルタを作成することもできます。

$this->active = apply_filters( 'wpse_gallery_parent_titles', true, $atts, $pair );

...など、しかし、私は今のところここでそれを残すつもりです;-)

3
birgire