J'ai ajouté des microdonnées dans chaque article manuellement et cela fonctionne bien. Maintenant, je veux les insérer dans le dernier module d'articles.
Pour remplacer le module dans mon modèle et j'ai ajouté:
<li itemscope itemtype="https://schema.org/Article">
<span itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<span itemprop="name" content="...your organization name..."></span>
<span itemprop="logo" itemscope itemtype="https://schema.org/ImageObject">
<link itemprop="url" href="/images/KS.jpg">
<meta itemprop="width" content="50">
<meta itemprop="height" content="50">
</span>
</span>
<span itemprop="author" content="...your name..."></span>`
et cela fonctionne pour l'organisation, l'image de l'organisation - logo et auteur.
Ensuite, j'ai ajouté:
<meta itemprop="datePublished" content="<?php echo JHtml::_('date', $item->publish_up, JText::_('Y-m-dTh:m:s')); ?> " >
et cela fonctionne pour la date de publication.
Maintenant, j'ai un problème lorsque j'essaie d'ajouter du balisage d'image d'articles. J'ai ajouté:
<?php $images = json_decode($item->images); ?>
<span itemprop="image" itemscope itemtype="https://schema.org/ImageObject">
<link itemprop="url" href="<?php echo htmlspecialchars($images->image_intro); ?>" alt="<?php echo htmlspecialchars($images->image_intro_alt); ?>">
<meta itemprop="width" content="150">
<meta itemprop="height" content="100">
</span>
et cela fonctionne bien, mais uniquement pour les images d'introduction via l'image de l'article et l'onglet des liens. J'ai mes images dans mon html (pas dans l'onglet image et liens) et je veux extraire l'url de l'image du html. J'ai plus de 400 articles et je préfère extraire les images du html.
J'aurais préféré simplement suggérer quelques retouches à votre extrait de code, mais il y a trop de choses pour moi à aborder dans votre réponse en tant que commentaire et je préfère expliquer en détail. Au lieu de cela, je publierai cette nouvelle réponse qui examinera et nettoiera votre tentative de codage supposée pour le bénéfice de vous et des futurs chercheurs.
Vous déclarez $images = json_decode($item->images);
, puis avant de l'utiliser, vous écrasez cette même variable avec $images = $dom->getElementsByTagName('img');
. Pour cette raison, vous pourriez aussi bien ne jamais le déclarer la première fois. C'est peut-être une faute de frappe lors de la publication. Si c'est correct: $images = json_decode($item->images);
, alors vous avez probablement l'intention d'utiliser $dom->loadHTML($images->image_intro);
Vous devriez essayer de séparer votre "traitement" de votre "affichage" autant que possible pour plus de clarté. Plutôt que de générer un document dom et d'extraire les données souhaitées à mi-chemin en écrivant votre balise <link>
, Je vous recommande d'interroger complètement les données introtext
, puis - s'il y a des données à alimenter dans la balise de lien - puis écrivez votre balise et balises de lien. S'il n'y a pas de données utilisables, je suppose que vous n'avez pas besoin d'imprimer les balises span et link.
Vous n'avez pas besoin des frais généraux supplémentaires de deux documents dom. Vous pouvez effectuer les deux appels getAttribute()
sur le même élément d'un seul coup.
S'il n'y a pas de balise <img>
Dans le introtext
, alors $images[0]
Générera un avis car l'élément de tableau [0]
N'existe pas. Au lieu d'effectuer une vérification "véridique", utilisez isset()
.
Il n'y a aucun avantage à concaténer ''
(Une chaîne vide) avant ou après une variable. Il suffit de l'omettre - c'est juste un gonflement de code. Je ne sais pas qui enseigne cette technique, mais je la vois de temps en temps sur Stackoverflow.
Dans l'ensemble, le transfert des attributs de la première image de l'introtexte vers votre nouvelle balise est aussi simple que cela:
<?php
$dom = new DOMDOcument;
$dom->loadHTML($item->introtext); // or $images->image_intro ...whatever you are actually calling it
$images = $dom->getElementsByTagName('img');
if (isset($images[0])) {
?>
<span itemprop="image" itemscope itemtype="https://schema.org/ImageObject">
<link itemprop="url"
href="<?php echo $images[0]->getAttribute('src'); ?>"
alt="<?php echo $images[0]->getAttribute('alt'); ?>">
<?php
}
La solution à ma question. Je pense que c'est valable:
<?php $images = json_decode($item->images);
?>
<span itemprop="image" itemscope itemtype="https://schema.org/ImageObject">
<link itemprop="url" href="<?php // Create new DOMDocument object.
$dom = new DOMDOcument;
// Load article text into DOMDocument.
$dom->loadHTML($item->introtext);
// Get all images.
$images = $dom->getElementsByTagName('img');
// If article contains an image, get its URL.
$imageSrc = $images[0] ? $images[0]->getAttribute('src') : null;
// Output the image.
if ($imageSrc !== null)
{
echo '' . $imageSrc . '>';
}
?>" alt="<?php // Create new DOMDocument object.
$dom = new DOMDOcument;
// Load article text into DOMDocument.
$dom->loadHTML($item->introtext);
// Get all images.
$images = $dom->getElementsByTagName('img');
// If article contains an image, get its URL.
$imageSrc = $images[0] ? $images[0]->getAttribute('alt') : null;
// Output the image.
if ($imageSrc !== null)
{
echo '' . $imageSrc . '>';
}
?>">```