web-dev-qa-db-ja.com

空の場合は投稿画像にタイトルを動的に追加する

私は彼らがまだ持っていない画像に動的に画像タイトル属性を追加したいクライアントのサイトを持っています。そのため、title属性が空の場合は、投稿のタイトルが何であれ、そのタイトルを追加します。どうすればこれを達成できますか?

事実上:<img src=img.jpg title=[wp-post-title-here] />

3
Zach Russell

次のテストプラグインを試すことができます。これは domDocument クラスを使用して、HTMLでどのように動作するかを確認します。

LibXML 2.7.8以降でPHP 5.4以降を想定しています。

<?php
/**
 * Plugin Name: Add Missing Image Title Attributes
 * Description: For posts in the main loop (Assumes PHP 5.4+ with LibXML 2.7.8+)
 * Plugin URI:  http://wordpress.stackexchange.com/a/188560/26350
 * Author:      Birgir Erlendsson (birgire)
 * Version:     0.0.1
 */

namespace wpse\birgire;

add_action( 'init', function()
{
    $o = new AddMissingImgTitle;
    $o->activate( new \domDocument );
} );

class AddMissingImgTitle
{
    private $dom;

    public function activate( \domDocument $dom )
    {
        $this->dom = $dom;
        add_filter( 'the_content', [ $this, 'the_content' ] );
    }

    public function the_content( $html )
    {
        if( ! in_the_loop() )
            return $html;

        if( false === strpos( $html, '<img' ) )
            return $html;

        return $this->process( $html );
    }                                                               

    private function process( $html )
    {
        // Handle utf8 strings
        // See http://php.net/manual/en/domdocument.loadhtml.php#95251
        $html = '<?xml encoding="UTF-8">' . $html;

        // Load without HTML wrapper
        // See https://stackoverflow.com/a/22490902/2078474
        $this->dom->loadHTML( $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );

        // Fetch all image tags:
        $images = $this->dom->getElementsByTagName( 'img' );
        foreach ( $images as $image )
        {
            // Add the title attribute if it's missing (using the post title):
            if( '' === $image->getAttribute( 'title' ) )
                $image->setAttribute( 'title', esc_attr( get_the_title() ) );
        }
        return str_replace( '<?xml encoding="UTF-8">', '', $this->dom->saveHTML() );
    }

} // end class

古いバージョンのLibXMLの場合、LIBXML_HTML_NOIMPLIEDおよびLIBXML_HTML_NODEFDTDオプションを指定せずに、この質問への答え を調べることもできます

2
birgire

テンプレート内の画像に対してこれが適切に行われ、ページ/投稿の本文コンテンツのみが懸念される場合、投稿またはページを保存するときにフィルターを使用できます( https:// codex .wordpress.org/Plugin_API/Action_Reference/save_post )コンテンツをスキャンする

このアクションは投稿が保存された直後にトリガーされるため、get_post($ post_id)を使用してこの投稿オブジェクトに簡単にアクセスできます。

その後、すべての画像タグ<imgを検索できるようになり、次のtitle="の前に>というフレーズがない場合は、<imgの直後に挿入しますtitle="post title here"-関数全体の実行後に投稿を「保存」することを忘れないでください。

そのためには、投稿文字列を部分文字列に分割してから再度組み立てますが、ここではすべてのコードを記述することは範囲外です。

または、get_contentなどでフィルタリングすることでコードがページに表示されるときに、イメージタグに対して同様のスキャンを実行できますが、閲覧者のページロードに関しては、データベースに正しく保存する方が合理的です。

1
ambroseya

Image title属性は実際にはデータベースに存在しなければなりませんか?たとえばフォトギャラリーでテキストを表示するだけの場合は、jQuery関数を使用しても目的は達成されませんか。何かのようなもの:

$(document).ready(function() {
  $('img').each(function() {
    if ($(this).attr('title') === undefined) {
         var title = $('h1').text();
         $(this).attr('title', title);
      }
  });
});
0
Ewa

それはあなたが正しい投稿にその画像をロードしたいということです...あなたが画像を望むところに以下のコードを配置してください

<?php
$post_id = 75;
$thumbnail_id = 112;
if(!empty(get_the_title($thumbnail_id))){
    echo '<img src="img.jpg" title="'.get_the_title($thumbnail_id).'" />';
}
else{
    echo '<img src="img.jpg" title="'.get_the_title($post_id).'" />';
}

?> 

私はそれがあなたのために働くことを願っています...

0
Anand