web-dev-qa-db-fra.com

Ajouter dynamiquement des titres pour publier des images si elles sont vides

J'ai un site client où ils veulent ajouter des attributs de titre d'image dynamiquement aux images qui n'en ont pas déjà. Donc, si l'attribut title est vide, ajoutez un titre, quel que soit le titre de l'article. Comment pourrais-je accomplir ceci?

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

3
Zach Russell

Vous pouvez essayer le plug-in de test suivant, qui utilise la classe domDocument , pour voir comment cela fonctionne sur votre code HTML.

Cela suppose que PHP 5.4+ avec LibXML 2.7.8+.

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

Pour les anciennes versions de LibXML, vous pouvez consulter les réponses à cette question pour des solutions alternatives sans les options LIBXML_HTML_NOIMPLIED et LIBXML_HTML_NODEFDTD.

2
birgire

Si nous pouvons supposer que cela est fait correctement pour les images qui se trouvent dans les modèles et que le contenu de la page/du corps du message ne vous préoccupe, vous pouvez utiliser un filtre lors de l'enregistrement d'un message ou d'une page ( https: //codex.wordpress .org/Plugin_API/Action_Reference/save_post ) pour analyser le contenu

Étant donné que cette action est déclenchée juste après l'enregistrement de la publication, vous pouvez facilement accéder à cet objet de publication à l'aide de get_post ($ post_id).

Vous devriez alors pouvoir faire une recherche sur tous les tags d'image <img, et s'ils n'ont pas la phrase title=" avant le prochain >, insérez juste après le <img votre title="post title here" - n'oubliez pas de "sauvegarder" la publication après le message la fonction s'exécute.

Afin de faire cela, je scinderais la chaîne de publication en sous-chaînes, puis je les réassemblerais, mais il est hors de portée ici d'écrire tout le code pour vous.

Vous pouvez également effectuer une analyse similaire pour les balises image lorsque le code est affiché dans la page en filtrant sur get_content ou similaire, mais il est plus judicieux de sauvegarder correctement dans la base de données, en ce qui concerne le chargement de page par les téléspectateurs.

1
ambroseya

L'attribut de titre de l'image doit-il réellement être dans la base de données? S'il ne s'agit que d'afficher du texte, par exemple dans la galerie de photos, utiliser une fonction jQuery ne vous servirait-il pas? Quelque chose comme:

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

Cela signifie que vous voulez charger cette image sur le bon message ... placez le code ci-dessous à l'endroit où vous souhaitez que les images

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

?> 

j'espère que cela fonctionnera pour vous ...

0
Anand