web-dev-qa-db-ja.com

最新の記事の構造化データのマークアップ

手動ですべての記事にmicrodataを追加しましたが、問題なく機能します。次に、最新の記事モジュールに挿入します。

テンプレートのモジュールをオーバーライドして、私は追加しました:

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

そしてそれは組織、組織イメージ-ロゴと著者のために働きます。

次に追加しました:

<meta itemprop="datePublished" content="<?php echo JHtml::_('date', $item->publish_up, JText::_('Y-m-dTh:m:s')); ?> " >

そしてそれは公開された日付で動作します。

記事の画像マークアップを追加しようとすると問題が発生します。追加した:

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

そしてそれはうまくいきますが、記事の画像とリンクタブを介したイントロ画像に対してのみです。 HTMLに画像があり(画像とリンクのタブではありません)、HTMLから画像のURLを抽出します。 400件を超える記事があり、htmlから画像を抽出することを好みます。

2
johnl

私はあなたのスニペットにいくつかの修正を提案することを好んだでしょうが、コメントとしてあなたの答えで扱うには多すぎるので、私はむしろ完全に説明したいと思います。代わりに、私はこの新しい回答を投稿します。これは、あなたと将来の研究者の利益のために、想定されていたコーディングの試みをレビューしてクリーンアップします。

  1. $images = json_decode($item->images);を宣言し、それを使用する前に、同じ変数を$images = $dom->getElementsByTagName('img');で上書きしています。このため、最初にそれを宣言しないこともできます。おそらくこれは投稿中のタイプミスでしょう。これが正しい場合:$images = json_decode($item->images);、おそらく$dom->loadHTML($images->image_intro);を使用することを意味します

  2. わかりやすくするために、「処理」と「表示」をできるだけ分離する必要があります。 DOMドキュメントを生成し、_<link>_タグを書き込んで途中で目的のデータを抽出するのではなく、introtextデータに完全に問い合わせることをお勧めします-フィードするデータがある場合リンクタグ-次にスパンタグとリンクタグを記述します。使用可能なデータがない場合は、スパンタグとリンクタグを印刷する必要はないと思います。

  3. 2つのdomドキュメントのような追加のオーバーヘッドは必要ありません。同じ要素に対して両方のgetAttribute()呼び出しを一度に実行できます。

  4. introtextに_<img>_タグがない場合、配列要素_$images[0]_が存在しないため、_[0]_は通知を生成します。 「真実の」チェックを実行する代わりに、isset()を使用します。

  5. 変数の前後に_''_(空の文字列)を連結してもメリットはありません。単にそれを省略してください-それは単なるコード膨張です。誰がこのテクニックを教えているのかわかりませんが、Stackoverflowでたまに見ます。

まとめると、最初の画像の属性をイントロテキストから新しいタグに転送するのは次のように簡単です。

_<?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
}
_
3
mickmackusa

私の質問に対する解決策。私は有効だと思います:

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

1
johnl