图库图片标题-从帖子中获取

时间:2016-06-05 作者:Julia Galden

有没有可能制作一个函数挂钩,它会自动用帖子标题覆盖添加的图像(或在库创建过程中添加的图像)的标题?就像示例中一样:-我正在创建一个名为lorem ipsum的帖子-我正在上载一个名为pingpong的文件。jpg-默认情况下,wordpress将为图像提供标题:乒乓球。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;
}

1 个回复
最合适的回答,由SO网友:birgire 整理而成

图库图像标题-作为贴子的标题,它附加到parent_titles 属性。

这可以通过设置suppress_filters 为库查询设置为false,并通过the_posts 滤器然后,我们可以通过shortcode_atts_gallery 滤器

Example

使用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创建的测试用例的一些截图

首先,我创建了三个帖子,并在每个帖子上附加了相应的彩色图像:

posts

然后,我创建了一个图库,其中包含:

[gallery ids="132,321,213"]
显示的图像标题如下:

normal

然后我添加了自定义属性:

[gallery parent_titles="yes" ids="132,321,213"]
结果是:

With parent titles

其中标题现在是来自父帖子的标题。

Demo plugin

下面是一个可以支持此功能的演示插件(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" 到要显示父帖子标题的库快捷码。

Auto activation for all galleries

要为所有库自动执行此操作,我们可以更改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 );
。。。等等,等等,但我现在就把它留在这里;-)