web-dev-qa-db-fra.com

intégrer le_content

J'essaie d'envelopper des URL de vidéos et d'intégrer du code dans un div classifié afin que je puisse l'appeler. Le code vidéo est extrait de la méta valeur personnalisée que j'ai configurée pour le type de publication vidéo. Rien que j'ai pu trouver sur le forum ou sur Google ne semble répondre parfaitement à ma question.

Cas d'utilisation: l'utilisateur entre une URL youtube dans le champ méta de la vidéo ou insère l'intégralité du code d'intégration. Quoi qu'il en soit, je dois envelopper la sortie dans des divs classés (fitvid).

Je suis nouveau avec WP et espérais que quelqu'un pourrait expliquer: Pourquoi les URL que je passe à the_content dans le code ci-dessous, sans être formulées par le shortcode [embed]? Et que dois-je faire pour l'obtenir?

D'après ce que je peux dire, mes options sont soit [incorporer] de reconnaître les URL en tant que vidéo et de faire de leur magie - ou d'essayer de faire la détection moi-même (ce qui est un peu au-delà de ma portée ATM) :).

Voici ce que j'ai jusqu'à présent:

<?    
     $mykey_values = get_post_custom_values('_format_video_embed');
         foreach ( $mykey_values as $key => $value ) {    
            if (!empty($value)) {
            // I can get one or the other to work but not both
            //$var = apply_filters('the_content', "[embed]" . $value . "[/embed]"); 
            //this will only return the url - but why?
            $var = apply_filters('the_content', $value );
            }
            echo "<div id='fitvid'>$var</div>";   
        }  ?>       
      <?php the_content();  ?>  

Hé - et merci d’avance pour votre expérience.

1
orionrush

Donc, je n'ai jamais vraiment découvert pourquoi/oembed, les URL ajoutées via apply_filters('the_content', $output), ne sont pas traitées alors que les codes courts incorporés sont. J'espère toujours que quelqu'un pourrait nous éclairer à ce sujet.

Je voulais vraiment utiliser les formats de type de message d'Alex King , c'est pourquoi je n'ai pas suivi l'exemple de David.

J'ai fini par détecter l'entrée en utilisant strpos et substr parce que cela me semblait le plus direct. Si quelqu'un connaît un meilleur moyen de le faire, ou voit une faille dans mon approche, merci de le signaler!

<?  // deal with embeds from the _format_video_embed meta meta feild

// allow us to strpos an array
//http://www.webmastertalkforums.com/php-functions/17117-php-strpos-using-array-values-search-needle.html#ixzz1rYKDjUNK 
function strpos_arr($haystack, $needle) { 
    if(!is_array($needle)) $needle = array($needle); 
    foreach($needle as $what) { 
        if(($pos = strpos($haystack, $what))!==false) return $pos; 
    } 
    return false; 
}       
$embedCheck = array("<embed", "<video", "<ifram");// only checking against the first 6

$mykey_values = get_post_custom_values('_format_video_embed');
$content_oembed = '';
     foreach ( $mykey_values as $key => $value ) {    
    if (!empty($value)) {
        $firstCar = substr($value, 0, 6); // get the first 6 char 

        if ( strpos($firstCar, "http:/" ) !== false || strpos($firstCar, "https:" ) !== false ){  
             // if its a http(s), send it to wp_oembed to see if the link is oembed enabled, and if not - output a link
            (wp_oembed_get($value) !==false ? $output = '<div class="oembed" style="width:100%; overflow:hidden;">' . wp_oembed_get($value) . '</div>' : $output =  '<a href="' . $value . '" target="_blank"><button class="btn"><i class="i icon-film"></i>Video link: ' . $value . '</button></a><hr>' );
        }       
        else if (strpos_arr($firstCar, $embedCheck ) !== false ){ //if it comes back as an embed, video, or iframe return the full string to the content                 
            //$output = '<div class="oembed" style="max-width="500px"><p>something funny</p>' . $value . '</div>'; // we're wrapping it so we can style it with fitvid
            $content_oembed = $value;                   
        }
        else if( current_user_can('publish_posts') ){// a little error for the editor
                $content_oembed = "<div class='alert alert-error'><strong>Whoops! That embed link or code has problems:</strong></br>";
                $content_oembed .= "URLS should begin with http:// or https:// <br/>";
                $content_oembed .= "Embed code should be wrapped in either &lt;embed&gt;&lt;/embed&gt; &lt;video&gt;&lt;/video&gt; or &lt;iframe&gt;&lt;/iframe&gt; elements.";
                $content_oembed .= "<p class='well'>" . $value . "</p></div>";
            }
        }                       
};
//echo apply_filters('the_content', $content_oembed);   
?>
1
orionrush

J'ai écrit un balisage très rapide et simple qui fonctionne - je sais que WordPress a un système intégré oEmbed , cela ne le suit pas - du tout . Cependant, je serais idiot de ne pas le partager si vous pouviez adapter une solution qui fonctionne au moins pour moi .

Notes de code échantillonné: Pour ce projet, je devais créer un type de publication personnalisé pour videos afin que mon client puisse facilement y accéder et ajouter des publications vidéo avec l'identifiant vidéo de YouTube. Ces vidéos étaient des maisons que leur compagnie avait énumérées, puis des vidéos avaient été tournées par des professionnels. Leur flux de travail actuel a fonctionné et le taux de développement d’une vidéo était d’environ 5 à 6 semaines par an et peut-être de 13 à 15 par an.

Quand j'ai eu à démarrer ce projet, j'avais compris à l'époque que le oEmbed n'était pas vraiment nécessaire pour mes utilisations, je peux maintenant rétrospectivement regrette la décision sur l’argument de la syntaxe, de l’élégance, etc. - bien qu’il soit assez rigide pour cela depuis longtemps sans faute.

Cela dit, j’ai également utilisé un classe de métabox personnalisée pour utiliser get_post_meta comme identifiant de la vidéo; je n’ai jamais intégré Validation ou Sanitizing of l'entrée dans le cas où une vidéo n'a pas été entrée avec l'espoir qu'une personne publie dans un type de publication personnalisé de videos qu'elle ne saute pas cette étape très simple. Je suis parfois un peu trop confiant, donc vous voudrez peut-être ajouter certaines de ces choses selon vos besoins

Mise en route: Créez une `page - votre type de message personnalisé . Php et indiquez ce qui suit:

<?php
/*
 Template Name: Your Template Name
 */

get_header(); 

function customBlogFeed() {

// The Query 
$the_query = new WP_Query( array ( 'post_type' => 'your-custom-post-type', 'posts_per_page' => '6' ) ); 

Il est important que 'post_type' => 'your-custom-post-type' soit lié à votre page - votre page de type de message personnalisé . Php, sinon elle ne saura pas quoi afficher. De plus, vous pouvez ajouter plus de paramètres à la WP_Query array()WP_Query WordPress Codex Page .

// The Loop 
while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
  <div class="port">
  <h2 class="smaller">
    <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark">
      <?php the_title(); ?>
    </a>
    <span style="font-size: 11px;">
      Posted on: <?php the_time(get_option('date_format')); ?> by: <?php echo get_the_author(); ?>
    </span>
   </h2>

Liaison à votre type de message personnalisé par défaut, WordPress le transmettra via single.php s'il existe et se repliera sur index.php si single.php n'existe pas. Cependant, si vous créez un seul - votre type de message personnalisé . Php WordPress l'utilisera comme votre page-template pour votre type de message personnalisé.

        <object width="288" height="176">
          <param name="movie" value="http://www.youtube.com/v/<?php $meta = get_post_meta(get_the_ID(), 'sb_metabox_video_url', true); if (strlen($meta) > 1 ) { echo $meta; } ?>?version=3&rel=0&modestbranding=1&autoplay=0&controls=0"></param>
          <param name="allowFullScreen" value="true"></param>
          <param name="allowscriptaccess" value="always"></param>
             <embed src="http://www.youtube.com/v/<?php $meta = get_post_meta(get_the_ID(), 'sb_metabox_video_url', true); if (strlen($meta) > 1 ) { echo $meta; } ?>?version=3&rel=0&modestbranding=1&autoplay=0&controls=0" type="application/x-shockwave-flash" width="288" height="176" allowscriptaccess="always" allowfullscreen="true"></embed>
        </object>

oEmbed: Je transmets également ces paramètres à YouTube:

?version=3&rel=0&modestbranding=1&autoplay=0&controls=0

Ce qui lui dit comment styliser le lecteur vidéo qu’il rend.

      <?php the_excerpt(); ?>
      <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Continue reading %s', 'twentyten' )); ?>" rel="bookmark"><img src="<?php bloginfo('template_directory') ?>/images/button_more.gif" alt="<?php printf( esc_attr__( 'Continue reading %s', 'twentyten' )); ?>" border="0" class="none" style="height: 28px!important; width:55px!important;" /></a>
  </div>

<?php endwhile;

// Reset Post Data
wp_reset_postdata();
}

?>

Fermez le tout avec votre wp_reset_postdata(); et vous avez une page qui utilisera WP_Query pour parcourir 6 messages avec the_title()the_excerpt et une vidéo avec incorporation.

À votre santé!

1
David

Cette question est assez ancienne, mais voici ce que j'ai proposé pour Wordpress 4.0+

Wordpress oembed veut stocker les url oembed sur leur propre ligne dans la base de données sans autre balise. C'est la seule façon dont cela fonctionnera. Essayez de coller ceci dans l'onglet "Texte" d'une page ou d'un article:

<h2>This Video Won't Work:</p>
<div>https://www.youtube.com/watch?v=pWxnGf7isqc</div>
<h2>This Video Will Work</h2>

https://www.youtube.com/watch?v=pWxnGf7isqc

Cliquez maintenant entre les modes d'édition visuelle et de texte. C'est de là que vient le problème.

Si vous voulez que votre vidéo soit sensible à la largeur, essayez la méthode de chris coyier et vous n'aurez pas à envelopper l'iframe.

0
squarecandy