Untitled - PHP 4.00 KB
                                
                                    function generate_youtube_thumbnail() {
    global $post;

    // Sprawdź, czy jesteśmy w edytorze postów
    if ( ! is_admin() || ! isset( $post->ID ) ) {
        return;
    }

    // Pobierz treść postu i znajdź link do YouTube
    $content = $post->post_content;
    preg_match_all('~(https?://www.youtube.com/watch\?v=)([a-zA-Z0-9-]+)~', $content, $matches);
    if ( empty($matches[2]) ) {
        return;
    }
    $videoId = $matches[2][0];

    // Sprawdź, czy miniatura już istnieje
    $existingAttachment = get_posts(array(
        'post_type'      => 'attachment',
        'post_parent'    => $post->ID,
        'meta_query'     => array(
            array(
                'key'     => '_wp_attachment_image_alt',
                'value'   => 'Miniatura YouTube',
                'compare' => 'LIKE'
            )
        )
    ));

    if (!empty($existingAttachment)) {
        // Miniatura już istnieje, użyj jej identyfikatora
        $attachmentId = $existingAttachment[0]->ID;
        set_post_thumbnail($post->ID, $attachmentId);
        return;
    }

    // Pobierz najlepszą dostępną miniaturę
    $youtubeImageSrc = "https://img.youtube.com/vi/$videoId/";
    $possibleThumbnails = ['maxresdefault.jpg', 'hqdefault.jpg', 'mqdefault.jpg'];
    $youtubeImage = '';

    foreach ($possibleThumbnails as $thumbnail) {
        $headers = get_headers($youtubeImageSrc . $thumbnail, 1);
        if ($headers && strpos($headers[0], '200 OK') !== false) {
            $youtubeImage = $thumbnail;
            break;
        }
    }

    if (!$youtubeImage) {
        error_log('No valid YouTube thumbnail found.');
        return;
    }

    $thumbnailUrl = $youtubeImageSrc . $youtubeImage;

    // Pobierz obraz i informacje o wymiarach
    $response = wp_safe_remote_get( $thumbnailUrl );
    if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) !== 200 ) {
        error_log( 'Błąd podczas pobierania miniatury: ' . $response->get_error_message() );
        return;
    }
    $imageData = wp_remote_retrieve_body( $response );

    // Sprawdź, czy pobrano dane
    if ( empty( $imageData ) ) {
        error_log( 'Nie udało się pobrać danych obrazu' );
        return;
    }

    // Oblicz wymiary obrazu
    list($width, $height) = getimagesizefromstring($imageData);

    // Zapisz obraz w formacie WebP
    $uploadDir = wp_upload_dir();
    $filename = wp_unique_filename( $uploadDir['path'], 'youtube-thumbnail-' . $post->ID . '.webp' );
    $filePath = $uploadDir['path'] . '/' . $filename;

    // Utwórz obiekt GD
    $image = imagecreatefromstring($imageData);
    if (!$image) {
        error_log('Błąd podczas tworzenia obrazu GD');
        return;
    }

    // Zapisz obraz w formacie WebP
    if (!imagewebp($image, $filePath)) {
        error_log('Błąd podczas zapisywania obrazu w formacie WebP');
        imagedestroy($image);
        return;
    }
    imagedestroy($image);

    // Utwórz załącznik
    $attachment = array(
        'post_mime_type' => 'image/webp',
        'guid' => $uploadDir['url'] . '/' . $filename,
        'post_parent' => $post->ID,
        'post_title' => 'Miniatura YouTube',
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attachmentId = wp_insert_attachment( $attachment, $filePath );

    // Ustaw miniaturę jako obraz wyróżniony i dodaj metadane o wymiarach
    if ( ! is_wp_error( $attachmentId ) ) {
        set_post_thumbnail( $post->ID, $attachmentId );
        update_post_meta( $attachmentId, '_wp_attachment_image_alt',  get_the_title() );
    } else {
        error_log('Błąd podczas tworzenia załącznika: ' . $attachmentId->get_error_message() );
    }
}

add_action( 'save_post', 'generate_youtube_thumbnail' );
                                
                            

Paste Hosted With By Wklejamy.pl