Jak wyciągnąć pierwszy link z treści wpisu (PHP Snippet)
PL

Jak wyciągnąć pierwszy link z treści wpisu (PHP Snippet)

5.00 /5 - (28 głosów )
Spis treści

Czasami budujemy motyw typu “Agregator newsów”, gdzie wpis nie ma własnej treści, a jedynie linkuje do zewnętrznego artykułu. Albo chcemy, aby pierwszy obrazek w treści automatycznie stawał się “Featured Image”, jeśli redaktor zapomni go ustawić.

W obu przypadkach musimy “przeskanować” treść posta (the_content) i wyłowić z niej pierwszy tag <a> lub <img>.

Metoda: Klasa DOMDocument

Wielu programistów używa do tego Regexów (Wyrażeń Regularnych), ale parsowanie HTML-a Regexem to zła praktyka. Lepiej użyć wbudowanej w PHP klasy DOMDocument.

Oto gotowa funkcja, którą możesz wkleić do functions.php:

function get_first_link_url( $content ) {
    // Jeśli treść pusta, zwróć false
    if ( empty( $content ) ) return false;

    $doc = new DOMDocument();
    
    // Uciszamy błędy HTML5 (DOMDocument jest stary i czasem narzeka na <section> itp.)
    libxml_use_internal_errors(true);
    
    // Ładujemy HTML (z hackiem na UTF-8)
    $doc->loadHTML( mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8') );
    
    $links = $doc->getElementsByTagName('a');

    if ( $links->length > 0 ) {
        // Zwracamy href pierwszego linku
        return $links->item(0)->getAttribute('href');
    }

    return false;
}

Użycie w pętli

$link = get_first_link_url( get_the_content() );

if ( $link ) {
   echo '<a href="' . esc_url($link) . '" class="read-more-external">Czytaj oryginał</a>';
}

To rozwiązanie jest solidne, bezpieczne i radzi sobie z błędami w strukturze HTML lepiej niż jakikolwiek Regex.