web-dev-qa-db-fra.com

Obtenez toutes les vidéos de Youtube à partir de messages et intégrez-les sur une autre page

Est-ce possible? Je veux le laisser vérifier tous mes messages pour voir s'il y a une vidéo Youtube intégrée. Si tel est le cas, je souhaite le montrer sur une autre page, en intégrant un lien vers ce message particulier ...

J'ai essayé l'extrait suivant, mais cela n'a pas fonctionné pour moi. Il n'embarque pas une vidéo ...

function aihato_latest_video() {
  $query_args = array(
    's' => 'youtube.com/watch?v=',
    'posts_per_page' => 1
  );

  $posts = get_posts( $query_args );
  $post1 = $posts[0];

  $matches = array();

  preg_match('|http://www.youtube.com/watch\?v=([a-zA-Z0-9]+)|', $post1->post_content, $matches);
  $v = $matches[1];
?>
<object width="415" height="250">
  <param name="movie" value="http://www.youtube.com/v/<?php echo $v ?>&hl=en_US&fs=1&"></param>
  <param name="allowFullScreen" value="true"></param>
  <param name="allowscriptaccess" value="always"></param>
  <embed src="http://www.youtube.com/v/<?php echo $v ?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
</object>
<?php
}

Edit: Cela ne fonctionne ni:

function aihato_latest_video() {
  $query_args = array(
    's' => 'youtube.com/watch?v=',
    'posts_per_page' => 1
  );

$posts = get_posts( $query_args );
foreach ($posts as $p) {
  $matches = array();
  preg_match('|http://www.youtube.com/watch\?v=([a-zA-Z0-9]+)|', $p->post_content, $matches);
?>

 <?php if (!empty($matches[1])) { ?>
    <object width="415" height="250">
      <param name="movie" value="http://www.youtube.com/v/<?php echo $matches[1] ?>&hl=en_US&fs=1&"></param>
      <param name="allowFullScreen" value="true"></param>
      <param name="allowscriptaccess" value="always"></param>
      <embed src="http://www.youtube.com/v/<?php echo $matches[1] ?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
    </object><?php
  }
}

?>
2
Johan

Une autre méthode peut être la suivante: sur le message en cours lorsque vous enregistrez, recherchez la vidéo youtube dans le contenu, le cas échéant, enregistrez-la sur le 'videos' transitoire et sur le post_id (pour le lien vers la publication ultérieure) insted of regex im using parse_url () et parse_str ()

add_action( 'save_post', 'save_youtube_videos' );
function save_youtube_videos( $post_id ) 
{
    $saved   = get_transient( 'videos' ); // If we have videos before
    $videos  = !empty( $saved ) ? $saved : array();
    $content = isset( $_POST['post_content'] ) ? $_POST['post_content'] : null;

    if( $content )
    {
        parse_str( parse_url( $content, PHP_URL_QUERY ), $video );
        if( !in_array( $video['v'], $videos ) )
        {
            $videos[ $post_id ] = $video['v']; // Push post_id and the vide_id
            set_transient( 'videos', $videos );  // Save all videos as array
        }
    }
}

Enregistrez votre post_id et youtube_id si votre publication en contient une. Ainsi, lors de la mise à jour ou de la publication, recherchez une vidéo à l'aide de parse_str et de parse_url, si nous en trouvons une, ajoutez-la au cache temporaire afin que nous n'ayons plus besoin de retrouver toutes les publications.

function get_youtube_archive( $width = '415', $height = '250' )
{
    $videos = get_transient( 'videos' );

    if( !empty( $videos ) && count( $videos ) > 0 )
    {
        $output = '';

        foreach( $videos as $key => $value ) 
        {
            $output .= '<object width="'. $width .'" height="'. $height .'">';
                $output .= '<param name="movie" value="http://www.youtube.com/v/'. $value .'/&hl=en_US&fs=1&"></param>';
                $output .= '<param name="allowFullScreen" value="true"></param>';
                $output .= '<param name="allowscriptaccess" value="always"></param>';
                $output .= '<embed src="http://www.youtube.com/v/'. $value .'&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="'. $width .'" height="'. $height .'"></embed>';
            $output .= '</object>';

            $output .= '<a href="'. get_permalink( $key ) .'" alt="Go to post">Go to post</a>';
        }

        return $output;
    }
}

Et une fonction de listage vous permettant d’obtenir les vidéos en ajoutant simplement:

echo get_youtube_archive();

Où vous les voulez Vous devez enregistrer les messages sur lesquels vous avez des vidéos pour que cela fonctionne.

4
Pontus Abrahamsson

Sans même exécuter ce code, je peux voir un problème assez important. Vous décrivez l'objectif suivant: "vérifier tous mes messages pour savoir s'il existe une vidéo YouTube intégrée", mais la requête est limitée à un seul message.

Et puis, vous essayez seulement d’utiliser le tout premier message dans les résultats (si la requête fonctionne du tout), alors il n’ya aucun moyen que cela obtienne toutes les vidéos YouTube de tous les messages. S'il a de la chance, il obtiendra les vidéos d'un seul post. La première chose à faire est de parcourir tous les messages. Non testé, mais quelque chose comme ça:

$posts = get_posts( $query_args );
foreach ($posts as $p) {
  $matches = array();
  preg_match('|http://www.youtube.com/watch\?v=([a-zA-Z0-9]+)|', $p->post_content, $matches);
  if (!empty($matches[1])) { ?>
    <object width="415" height="250">
      <param name="movie" value="http://www.youtube.com/v/<?php echo $matches[1] ?>&hl=en_US&fs=1&"></param>
      <param name="allowFullScreen" value="true"></param>
      <param name="allowscriptaccess" value="always"></param>
      <embed src="http://www.youtube.com/v/<?php echo $matches[1] ?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
    </object><?php
  }
}

Votre regex est également faux. Les identifiants vidéo YouTube comportent des traits de soulignement.

Mettez tout à la fois:

function aihato_latest_video() {
  $query_args = array(
    's' => 'youtube.com/watch?v=',
  );

  $posts = get_posts( $query_args );
  foreach ($posts as $p) {
    $matches = array();
    preg_match('|http://www.youtube.com/watch\?v=([a-zA-Z0-9_]+)|', $p->post_content, $matches);
    if (!empty($matches[1])) { ?>
      <object width="415" height="250">
        <param name="movie" value="http://www.youtube.com/v/<?php echo $matches[1] ?>&hl=en_US&fs=1&"></param>
        <param name="allowFullScreen" value="true"></param>
        <param name="allowscriptaccess" value="always"></param>
        <embed src="http://www.youtube.com/v/<?php echo $matches[1] ?>&hl=en_US&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="415" height="250"></embed>
      </object><?php
    }
  }
}
3
s_ha_dum