web-dev-qa-db-de.com

Fügen Sie dynamisch Titel hinzu, um Bilder zu veröffentlichen, wenn diese leer sind

Ich habe eine Kundenwebsite, auf der sie Bildtitelattribute dynamisch zu Bildern hinzufügen möchten, die noch keines haben. Wenn das title-Attribut leer ist, fügen Sie einen Titel für den Post-Titel hinzu. Wie würde ich das erreichen?

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

3
Zach Russell

Sie können das folgende Test-Plugin ausprobieren, das die Klasse domDocument verwendet, um zu sehen, wie es in Ihrem HTML funktioniert.

Es wird PHP 5.4+ mit LibXML 2.7.8+ vorausgesetzt.

<?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

Bei älteren Versionen von LibXML können Sie die Antworten auf diese Frage auf alternative Arten ohne die Optionen LIBXML_HTML_NOIMPLIED und LIBXML_HTML_NODEFDTD überprüfen.

2
birgire

Wenn wir davon ausgehen können, dass dies für Bilder in Vorlagen ordnungsgemäß durchgeführt wird und Sie sich nur um den Inhalt von Seiten/Posts kümmern, können Sie beim Speichern von Posts oder Seiten ( https: //codex.wordpress) einen Filter verwenden .org/Plugin_API/Action_Reference/save_post ) um den Inhalt zu scannen

Da diese Aktion direkt nach dem Speichern des Posts ausgelöst wird, können Sie mit get_post ($ post_id) problemlos auf dieses Post-Objekt zugreifen.

Sie sollten dann in der Lage sein, nach allen Bild-Tags <img zu suchen, und wenn sie vor dem nächsten title=" nicht den Ausdruck > haben, fügen Sie direkt nach <img Ihren title="post title here" ein - vergessen Sie nicht, den Beitrag nach dem Ganzen erneut "zu speichern" Funktion läuft.

Zu diesem Zweck würde ich die Post-Zeichenfolge in Teilzeichenfolgen aufteilen und sie dann erneut zusammensetzen, aber es ist hier nicht möglich, den gesamten Code für Sie zu schreiben.

Alternativ können Sie einen ähnlichen Scan für die Bild-Tags durchführen, wenn der Code auf der Seite angezeigt wird, indem Sie nach get_content oder ähnlichem filtern. Es ist jedoch sinnvoller, die Bilder im Hinblick auf das Laden der Seiten für die Betrachter korrekt in der Datenbank zu speichern.

1
ambroseya

Muss sich das Attribut Bildtitel tatsächlich in der Datenbank befinden? Wenn es nur darum geht, Text anzuzeigen, zum Beispiel in der Fotogalerie, würde die Verwendung einer jQuery-Funktion Ihren Zweck nicht erfüllen? So etwas wie:

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

Es bedeutet, dass Sie das Bild nach rechts laden möchten ... platzieren Sie den folgenden Code an der Stelle, an der Sie Bilder möchten

<?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).'" />';
}

?> 

ich hoffe, es wird für Sie arbeiten ...

0
Anand