WordPress: Tuỳ biến Gallery shortcode markup

Rate this post

WordPress và nút Thêm Media thần thánh giúp bạn dễ dàng thêm album ảnh, nhưng bạn có biết rằng chúng ta có thể tận dụng Gallery shortcode để xây dựng những markup khác như slideshow không?

Gallery Shortcode trong WordPress

Gallery Shortcode trong WordPress vốn dĩ là một native shortcode giúp bạn tạo 1 grid album ảnh để chèn vào trong bài viết. Trong phần lớn tình huống, gần như nhiều người không thường sử dụng chức năng này.

Với mục đích tận dụng các native features được hỗ trợ bởi WordPress thay vì sử dụng các plugin/hacking từ bên thứ ba, Code Tốt sẽ trình bày phương án giúp các bạn tuỳ biến output của Gallery Shortcode sao cho phù hợp với markup mình mong muốn.

Bài toán thay đổi markup Gallery shortcode

Bài toán đặt ra là thay vì hiển thị 1 loạt các content, thì ta sẽ chỉ tìm ra các img src và output nó trong 1 <div> mà thôi, tức đạt điều kiện lý tưởng để xây dựng cấu trúc dành cho slideshow thông thường như sau:

<div class="gallery">
  <div class="gallery-item">
    <img src="<?php echo $image_url; ?>" alt="">
  </div>
</div>

Hoặc trong 1 page list các partners, ta muốn có dạng sau:

<div class="partner-list">
  <div class="partner-item">
    <a href="#" class="parner-link">
      <img src="<?php echo $image_url; ?>" alt="">
    </a>
  </div>
</div>

Bạn thấy đấy, nếu bạn output mặc định như Gallery thì kết quả sẽ không thể nào ra như mình mong muốn đúng không?
[sociallocker]

Cách thay đổi output của Gallery Shortcode trong WordPress

Đầu tiên, ta cần tạo 1 function và sử dụng add_filter:

add_filter('post_gallery', 'codetot_gallery_shortcode_update', 10, 2);
function codetot_gallery_shortcode_update($output, $attr) {}

Function này sẽ nhận 2 variables là $output và $attr, trong đó $output là những thứ chúng ta sẽ sửa, còn $attr là những option mà khi tạo Gallery shortcode người dùng có thể truyền vào (ví dụ 2 hay 3 cột).

Giờ trong function, ta bắt đầu xử lý đầu tiên là extract toàn bộ phần $attr ra

global $post;

if (isset($attr['orderby'])) {
  $attr['orderby'] = sanitize_sql_orderby($attr['orderby']);
  if (!$attr['orderby']) {
    unset($attr['orderby']);
  }
}

extract(shortcode_atts(array(
 'order' => 'ASC',
 'orderby' => 'menu_order ID',
 'id' => $post->ID,
 'itemtag' => 'dl',
 'icontag' => 'div',
 'captiontag' => 'dd',
 'columns' => 3,
 'size' => 'thumbnail',
 'include' => '',
 'exclude' => ''
 ), $attr));

$id = intval($id);
if ('RAND' == $order) {
  $orderby = 'none';
}
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 '' };

Giờ ta sẽ xét đến các tình huống template cụ thể để output markup ra, trong trường hợp này là khi chạy lẻ 1 album (1 album có thể chứa 1 gallery shortcode ảnh duy nhất).

if(is_singular('album')) {
 foreach ($attachments as $id => $attachment) {
   $image_alt = $attachment->post_title;
   $img = wp_get_attachment_image_src($id, 'large');
   $output .= "<$icontag>\n";
   $output .= "<img src=\"{$img[0]}\" alt=\"$image_alt\" />\n";
   $output .= "</$icontag>\n";
 }
}

Tiếp đến, ta xét tới trường hợp cũng là grid ảnh, nhưng lần này ta cần thêm thẻ <a href=""> nữa trên 1 page khác chẳng hạn:

if( is_page_template('templates/partner.php') ) {
 foreach ($attachments as $id => $attachment) {
   $image_alt = $attachment->post_title;
   $link = $attachment->post_content;
   $img = wp_get_attachment_image_src($id, 'full');
   $output .= "<$icontag class=\"col-md-2 col-sm-4 col-xs-6 text-center item\">\n";
   $output .= "<a href=\"$link\" target=\"_blank\" rel=\"nofollow\">";
   $output .= "<img src=\"{$img[0]}\" alt=\"$image_alt\" />\n";
   $output .= "</a>";
   $output .= "</$icontag>\n";
 }
}

Cuối cùng, ta cần output return $output; ở cuối cùng function nhé.

Như vậy, code đầy đủ để nhúng vào file functions.php có thể tham khảo như dưới đây.


[/sociallocker]

Viết một bình luận


Chuyên gia về Web
Bạn muốn làm việc với dịch vụ website do chúng tôi triển khai?
Gọi tư vấn 0982.90.4343
Chuyên gia về Web
Bài viết liên quan

07/04/2024

PHP: Format date dd/mm/yyyy và so sánh với Date hiện tại
Một vấn đề hay gặp trong quá trình xử lý PHP datetime là tình huống format date từ định dạng...

02/01/2024

Fix lỗi npm không thể cài các package devDependencies
Khi cài đặt dự án,  có lúc bạn sẽ cài mãi cũng không đủ các package npm, đặc biệt là...
Gọi file PHP trong WordPress

19/09/2023

Cài đặt và sử dụng WP-CLI trên môi trường Linux
Trên một số môi trường Hosting có thể cung cấp SSH hoặc Terminal access, song không có sẵn WP-CLI để...
Import database MySQL lớn trên môi trường Docker

06/08/2023

Import database MySQL lớn trên môi trường Docker
Mình sử dụng EasyPanel để quản lý các Docker và build môi trường app. Nay gặp tình huống phải import...