Extraiga la primera URL injunta insertada en el contenido de una publicación

wordpress.stackexchange https://wordpress.stackexchange.com/questions/7918

  •  16-10-2019
  •  | 
  •  

Pregunta

Quiero extraer la primera URL injunta insertada en el contenido de una publicación para poner una metaetiqueta del encabezado, o en otro lugar como una forma de peinarla de manera diferente al resto del contenido.

¿Fue útil?

Solución

Supongo que solo está interesado en la primera URL que realmente tiene éxito para descubrir los datos reales. El sistema innombro procesa todos los enlaces que encuentra, pero no todos los enlaces habrán urban, obviamente.

El filtro que querrá usar es incred_oembed_html y obtiene el html en caché por Oembed, la URL, cualquier atributo en la incrustación y el post_id, lo cual es importante para su código.

add_filter('embed_oembed_html', 'my_function',10,4);
function my_function( $cache, $url, $attr, $post_ID ) {
  global $my_previous_post_id;
  if ($my_previous_post_id != $post_ID) {
    // post ID changed, so this is the first oembed for the post
    // do something with $url
    $my_previous_post_id = $post_ID;
  }
  return $cache; // it's important that you return the $cache value as-is
}

Ahora, todo el sistema omolvado se ejecuta al mismo tiempo que los códigos cortos: durante la llamada de filtro decontent. Entonces, si desea obtener cosas para el encabezado, tendrá que iniciar el bucle principal en el encabezado, ejecute el filtro_content sobre el valor get_the_content (), luego llame a rewind_posts () para volver Bucle principal más adelante en la página.

Este tipo de comportamiento causa problemas con los complementos (como NextGen Gallery) que hacen cosas estúpidas cuando ejecuta un bucle en el encabezado. No hay que trabajar en su alrededor, pero el hecho es que esos complementos están fundamentalmente rotos y no puede corregir sus problemas. Obtengo este tipo de informe con SFC-Share y SFC-Like todo el tiempo (porque sacan contenido para poner el encabezado también). Nada que puedas hacer al respecto, francamente.

Otros consejos

Prueba esto:

function get_first_oembed($id) {

    $meta = get_post_custom($id);

    foreach ($meta as $key => $value)
        if (false !== strpos($key, 'oembed'))
            return $value[0];
}

Las incrustaciones parecen almacenarse como bloques renderizados de HTML, por lo que si desea un enlace solo, también necesitará extraerlo.

He probado la respuesta del @rarst, pero de hecho no es una solución muy estable para el problema. Si intentas var_dump la $meta var arriba, notará que hay al menos el otro meta campo _oembed_time_xxxxxxxxxxxx Lo cual probablemente sea para la explosión de caché.

Y también, cuando quité el enlace innombrado del contenido de la publicación, las meta cadenas en caché no se eliminaron, que no es lo que quería.

Así que profundizo un poco más en los códigos WP nativos del wp-includes/class-oembed.php y wp-includes/class-wp-embed.php y se le ocurrieron una solución mucho más sólida:

function get_first_oembed_from_content( $content ) {
    if ( preg_match( '|^\s*(https?://[^\s"]+)\s*$|im', $content, $matches ) ) {
        return wp_oembed_get( $matches[1] );
    }

    return false;
}

El patrón regex se copia del nativo WP_Embed:autoembed() función, por lo que es el más confiable.

Es fácil desde aquí modificar esta función y extraer solo la primera URL también.

Licenciado bajo: CC-BY-SA con atribución
scroll top