Du php dans du javascript

WRInaute passionné
Salut à tous,

Je suis entrain de construire une fonction php qui me sera utile pour incorporer dans le code html de mes page le code pour les données structurées au format JSON-LD.

Voici ma fonction :
Code:
function getDonneesStructurees(){
$donnees_structurees = '<script type="application/ld+json">
{
      "@context": "https://schema.org",
      "@type": "BlogPosting",
      "headline": "'.$titre_court.'",
      "image": [
        "https://example.com/photos/1x1/photo.jpg",
        "https://example.com/photos/4x3/photo.jpg",
        "https://example.com/photos/16x9/photo.jpg"
       ],
      "datePublished": "2020-02-05",
      "dateModified": "2020-02-05"
}
</script>';
return $donnees_structurees;
}
Je voudrais en php faire une boucle while depuis une de mes tables MySql pour afficher les images dans "image": [......], comment faut il faire cela ? Sachant que pour la dernière image qui sera listée il ne doit pas y avoir de virgule après l'url de l'image.

Merci pour votre aide.
 
WRInaute accro
Tu te casses la tête pour rien. Fait un array PHP et json_encode() :
PHP:
<?php

$images = [];
foreach ($imagesDb as $image) {
    $images[] = $image['url'];
}
// Ou si c'est bien ça : $images = array_column($imagesDb, 'url');

$jsonLd = [
    '@context' => 'https://schema.org',
    '@type' => 'BlogPosting',
    'headline' => $titre_court,
    'image' => $images,
    'datePublished' => '2020-02-05',
    'dateModified' => '2020-02-05',
];
?>
<script type="application/ld+json">
    <?php echo json_encode($jsonLd, JSON_PRETTY_PRINT); ?>
</script>
 
WRInaute passionné
Merci spout, effectivement c'est plus simple comme tu le fait.

Dan ma table MySql ou je stocke l'url de mes images, dans le champ 'url' j'aurais les url séparées par des virgules, est-ce que la dernière url de l'image de la boucle $images[] = $image['url']; n'aura pas de virgule ?

Autre question : je souhaite parfois ajouter dans certaines de mes pages un Breadcrumb, du style :
Code:
<script type="application/ld+json">
{
  "@context": "https://schema.org/",
  "@type": "BreadcrumbList",
  "itemListElement": [{
    "@type": "ListItem",
    "position": 1,
    "name": "Home",
    "item": "https://www.example.com/"
  },{
    "@type": "ListItem",
    "position": 2,
    "name": "Blog",
    "item": "https://www.example.com/blog/"
  },{
    "@type": "ListItem",
    "position": 3,
    "name": "SEO Tutorial",
    "item": "https://www.example.com/blog/seo-tutorial.html"
  }]
}
</script>
Est-ce qu'il vaut mieux l'ajouter à la suite du premier code json, après "'dateModified' => '2020-02-05'," ou bien on ferme la première balise <script type="application/ld+json">...</scripts> et on réouvre une nouvelle balise <script type="application/ld+json"> pour y insérer ce Breadcrumb ?
 
WRInaute passionné
Merci spout.

Je vais essayer de tout mettre dans une seule balise <scripts>.

J'ai un souci avec le php array pour les différents "ListItem" du Breadcrumb, ça m'affiche que le deuxième "ListItem", voici mon code :
Code:
$jsonLd = [
    '@context' => 'https://schema.org',
    '@type' => 'BlogPosting',
    'headline' => $voir['titre'],
    'description' => $voir['description'],
    'image' => 'https://www.example.com/images/seo.jpg',
    'datePublished' => '2020-02-05',
    'dateModified' => '2020-02-05',
    ];
    if($voir['page']!='Accueil'){
    $jsonLd += [
    '@type' => 'BreadcrumbList',
    'itemListElement' => [
        '@type' => 'ListItem',
        'position' => '1',
        'name' => 'Home',
        'item' => 'https://www.example.com/',
        '@type' => 'ListItem',
        'position' => '2',
        'name' => 'Page du blog',
        'item' => 'https://www.example.com/blog/',
        ]
    ];
    }
Qu'est-ce qui ne va pas ?
 
WRInaute accro
Tu as 2 clefs '@type', itemListElement c'est un tableau multiple.

Code:
'itemListElement' => [
       [
       '@type' => 'ListItem',
       'position' => '1',
       'name' => 'Home',
       'item' => 'https://www.example.com/'
       ],
       [
       '@type' => 'ListItem',
       'position' => '2',
       'name' => 'Page du blog',
       'item' => 'https://www.example.com/blog/'
       ]
   ]

Ce genre d'erreur est mise en évidence avec un bon IDE :

2020-11-16_17-42-23.png
 
Dernière édition:
WRInaute passionné
Merci spout ton code marche parfaitement bien :)

Par contre, le '@type' => 'BreadcrumbList', ne s'affiche pas dans le code html de ma page, why ?

Voici mon code :
Code:
$jsonLd = [
    '@context' => 'https://schema.org',
    '@type' => 'BlogPosting',
    'headline' => $voir['titre'],
    'description' => $voir['description'],
    'image' => 'https://www.example.com/images/seo.jpg',
    'datePublished' => '2020-02-05',
    'dateModified' => '2020-02-05',
    ];
    if($voir['page']!='Accueil'){
    $jsonLd += [
    '@type' => 'BreadcrumbList',
    'itemListElement' => [
    [
        '@type' => 'ListItem',
        'position' => '1',
        'name' => 'Home',
        'item' => 'https://www.example.com/',
    ],
    [
        '@type' => 'ListItem',
        'position' => '2',
        'name' => 'Page du blog',
        'item' => 'https://www.example.com/blog/',
        ]
      ]
    ];
    }
 
WRInaute passionné
J'arrive pas à récupérer les url de mes images qui sont dans ma table MySql, voici mon code :
Code:
$requete = get_requete("SELECT * FROM $table_url WHERE url LIKE '%".$serveur_lien."'");
$voir = $MysqliFetchArray($requete);
$images = [];
foreach ($voir['images'] as $choix){
$images[] = $choix['images'];
}
$jsonLd = [
    '@context' => 'https://schema.org',
    '@type' => 'BlogPosting',
    'headline' => $voir['titre'],
    'description' => $voir['description'],
    'image' => $images,
    'datePublished' => '2020-01-01',
    'dateModified' => '2020-01-01',
    ];
Ca m'affiche "image": [], dans mon code html pour les données structurées.

Mes images sont stockées dans la colonne "images" de ma table, elles sont séparées par des virgules :
Code:
images/photo-1.jpg, images/photo-2.jpg, images/photo-3.jpg, images/photo-4.jpg
 
Dernière édition:
WRInaute passionné
Merci spout ça marche nickel :)

Est-ce qu'il serait possible d'avoir une fonction php qui récupère toutes les images sur les pages de mon site, ce qui éviterait que j'ai a stocker toutes les url de ces images dans ma table MySql ?
 
Dernière édition:
WRInaute passionné
J'ai ce code ci-dessous qui extrait toutes les images d'une page en fonction de l'url d'une page ($url_cible) mais je voudrais que les images contenues dans la variable $exclusion ne s'affichent pas, comment faire cela ?
Code:
$url_cible = "http://www.mon-site.com/ma-page.html";
echo "<div><b>URL cible</b> : " . $url_cible . "</div>";
echo "<div><b>Liste des images relatifs et absolues</b> :</div><br>";
$userAgent = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
curl_setopt($ch, CURLOPT_URL,$url_cible);
curl_setopt($ch, CURLOPT_FAILONERROR, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
$html= curl_exec($ch);
if (!$html) {
    echo "<br />cURL erreur numéro:" .curl_errno($ch);
    echo "<br />cURL erreur:" . curl_error($ch);
    exit;
}
$dom = new DOMDocument();
@$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$liens = $xpath->evaluate("/html/body//img");
$exclusion = array('photo.gif','photo-2.png');
for ($i = 0; $i < $liens->length; $i++) {
    $lien = $liens->item($i);
    $url = $lien->getAttribute('src');
    $url .= $lien->getAttribute('data-src');
    if(!in_array($url,$exclusion)){
        echo "$url<br>";
    }
}
 
WRInaute passionné
J'ai trouvé, il suffit de remplacer le for() par celui-ci et ça marche :
Code:
for ($i = 0; $i < $liens->length; $i++) {
    $lien = $liens->item($i);
    $url = $lien->getAttribute('src');
    $url .= $lien->getAttribute('data-src');
    $patterns = implode('|', $exclusion);  
    if(!preg_match('/'.$patterns.'/', $url)){      
    echo "$url<br>";
    }
}
 
Discussions similaires
Haut