chevron-left chevron-right

Piotr Nalepa Frontend, architecture and AI

[PHP][HTML5] Jak zaimplementować galerię responsywnych obrazków w WordPress?

This version
blog.piotrnalepa.pl/2015/11/11/phphtml5-jak-zaimplementowac-galerie-responsywnych-obrazkow-w-wordpress
Published
Author
, Staff Software Engineer
Categories
HTML5, PHP
Feedback
Write to me · Post on X

This post is 11 years old. Browsers and tools may have changed since then, so check the code against current documentation before you use it.

Dzisiejszy wpis powstał na życzenie jednego z czytelników bloga, który w komentarzach do poprzedniego wpisu dotyczącego responsywnych obrazków na stronach internetowych poprosił o rozwiązanie dotyczące implementacji galerii w WordPress.

Uznałem, że jest to ciekawe pytanie i dlatego postanowiłem pomóc czytelnikowi i Tobie prezentując rozwiązanie, które pozwala na utworzenie galerii responsywnych obrazków w WordPress.

Section 1Implementacja galerii w WordPress

Tworzenie galerii obrazków w WordPress różni się od utworzenia widoku pojedynczego obrazka w szablonie WordPress. Musimy tutaj wykorzystać sporą ilość kodu PHP, aby nadpisać domyślny sposób generowania galerii. Nasz kod musimy umieścić w pliku functions.php:

Example 1PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
function custom_post_gallery($output, $attr) {
    global $post;
 
    $output = '';
 
    // Tworzymy nowe zmienne do wykorzystania w dalszej części kodu
    extract(shortcode_atts(array(
        'order'         => 'ASC',
        'orderby'       => 'menu_order ID',
        'id'            => $post->ID,
        'itemtag'       => 'dl',
        'icontag'       => 'dt',
        'captiontag'    => 'dd',
        'columns'       => 3,
        'size'          => 'thumbnail',
        'include'       => '',
        'exclude'       => ''
    ), $attr));
 
    $id = intval($id);
 
    if (!empty($include)) {
        $include = preg_replace('/[^0-9,]+/', '', $include);
        $_attachments = get_posts(array(
            'include'           => $include,
            'post_status'       => 'inherit',
            'post_type'         => 'attachment',
            'post_mime_type'    => 'image',
            'order'             => $order,
            'orderby'           => $orderby
        ));
 
        $attachments = array();
        foreach ($_attachments as $key => $val) {
            $attachments[$val->ID] = $_attachments[$key];
        }
    }
 
    if (empty($attachments)) {
        return $output;
    }
 
    // Generujemy kod HTML galerii
    $output .= '<div class="post-gallery">';
    $output .= '<div class="post-gallery__wrapper">';
 
    // W pętli generujemy kod dla każdego obrazka
    foreach ($attachments as $id => $attachment) {
        // Pobieramy informacje dotyczące obrazka
        $imgDesc = wp_prepare_attachment_for_js($id);
 
        $output .= '<div class="post-gallery__wrapper__thumb">';
        $output .= '<img src="' . wp_get_attachment_image_src($id, 'post-thumb')[0] . '" ';
        $output .= 'class="post-gallery__wrapper__thumb__image" ';
        $output .= 'data-full-img="' . wp_get_attachment_image_src($id, 'post-main-x4')[0] . '" ';
        $output .= 'sizes="'
                    . '(-webkit-min-device-pixel-ratio: 3) 1040px, '
                    . '(min--moz-device-pixel-ratio: 3) 1040px, '
                    . '(-o-min-device-pixel-ratio: 3/1) 1040px, '
                    . '(min-device-pixel-ratio: 3) 1040px, '
                    . '(min-resolution: 288dpi) 1040px, '
                    . '(min-resolution: 3dppx) 1040px, '
 
                    . '(-webkit-min-device-pixel-ratio: 2) 720px, '
                    . '(min--moz-device-pixel-ratio: 2) 720px, '
                    . '(-o-min-device-pixel-ratio: 2/1) 720px, '
                    . '(min-device-pixel-ratio: 2) 720px, '
                    . '(min-resolution: 192dpi) 720px, '
                    . '(min-resolution: 2dppx) 720px, '
                    . '360px" ';
        $output .= 'srcset="'
                    . wp_get_attachment_image_src($id, 'post-main-x1')[0] . ' 360w,'
                    . wp_get_attachment_image_src($id, 'post-main-x2')[0] . ' 720w,'
                    . wp_get_attachment_image_src($id, 'post-main-x3')[0] . ' 1040w" ';
        $output .= 'alt="' . $imgDesc['alt'] . '">';
        $output .= '</div>';
    }
 
    $output .= '</div>';
    $output .= '</div>';
 
    return $output;
}
 
add_filter('post_gallery', 'custom_post_gallery', 10, 2);

Powyższy kod generuje galerię obrazków, których jakość i wielkość dostosowuje się do gęstości pikseli na ekranie urządzenia. Tym sposobem możemy osiągnąć dobrą jakość obrazków zarówno na ekranach standardowych, np. standardowego monitora PC, jak i na ekranach typu Retina (patrz iPhone, iPad). Wykrywanie gęstości pikseli uzyskano przy pomocy sprawdzania wartości min-device-pixel-ratio.

Section 2Czym jest gęstość pikseli na ekranie?

Jeśli nie do końca wiesz o co chodzi z gęstością pikseli na ekranie to już to wyjaśniam.

Standardowy ekran o rozdzielczości 1920 pikseli na 1080 pikseli ma też faktyczną rozdzielczość o tych samych wymiarach, tj. 1920 pikseli na 1080 pikseli. W przypadku ekranów typu Retina sytuacja wygląda nieco inaczej. Ze względu na większe upakowanie pikseli na ekranie faktyczna rozdzielczość jest mniejsza w przypadku ekranów o natywnej rozdzielczości 1920 pikseli na 1080 pikseli faktyczna rozdzielczość będzie wynosiła 960 pikseli na 540 pikseli.

Dzięki temu tekst na takim ekranie wydaje się być bardzo ostry, nieposzarpany a obrazki bardziej szczegółowe. Jednakże trzeba pamiętać, że w takim przypadku aby wyświetlić ostry obrazek o wymiarach 300 pikseli na 200 pikseli to faktycznie trzeba załadować obrazek o wymiarach 600 pikseli na 400 pikseli. W innym przypadku, obrazek może się okazać nieostry na takim ekranie.

Section 3Podsumowanie

Mam nadzieję, że udało mi się w sposób wyczerpujący opisać temat tworzenia galerii obrazków w WordPress i będziesz w stanie zaimplementować galerię na swojej stronie internetowej opartej o WordPress.

Share
Feedback

About the author

Staff Software Engineer

I've been writing this blog since 2009 and building for the web professionally for 14 years. Today I lead the frontend of the Cosmos platform at Bishop Fox, where I've been since day one of the project. Before that I worked at OLX, KUDO, Auto1 and eZ Systems. Here I write about what I've learned in practice: JavaScript, TypeScript, React, CSS and frontend architecture. I've also spoken at conferences across Poland and Europe. Got a question or an idea for a post? Let me know!