Tối ưu hóa hiệu suất ACF và các sử dụng để tăng tốc website wordpress

Nếu thường xuyên làm việc với Advanced Custom Fields Pro hoặc phát triển toàn bộ plugin và theme dựa trên ACF một lúc nào đó bạn sẽ tự hỏi tại sao WordPress lại bị ảnh hưởng ACF đi kèm với sự trợ giúp rất lớn của các tính năng bổ sung được thiết kế để hoạt động kỳ diệu với PHP một cách đơn giản. Điều này rất tốt cho developer hoặc người dùng, vì chúng ta có thể tạo các giao diện được viết bằng PHP dễ dàng hơn.

Tuy nhiên, việc làm này có ảnh hưởng tiêu cực đến hiệu suất WordPress và một trang web trở nên chậm hơn tùy thuộc vào số lượng trường được sử dụng.

Câu hỏi sẽ là gì và làm thế nào chúng ta có thể tối ưu hóa hiệu suất mà không cần đến ACF? Chúng ta có thể ngăn chặn việc plugin ACF tải trong giao diện người dùng và do đó chỉ sử dụng nó trong phần phụ trợ cho WordPress. Vì vậy ta cần biết được cách mà ACF được tải ở đâu và khi nào?

Phần khác và nội dung của bài viết này là tìm các giải pháp thay thế thay các hàm ACF . Bởi vì nếu không tải ACF trong giao diện người dùng, tất cả các chức năng của ACF không còn ý nghĩa gì nữa. Hên quá, chúng ta có thể sử dụng các chức năng của WordPress để thay thế cho việc dùng các hàm của ACF để tăng hiệu suất hơn.

Cách sử dụng ACF trong Bài viết, Sản phẩm hoặc Trang

Cách chuẩn chúng ta có thể truy cập dữ liệu trường ACF là làm việc với hàm get_field() . Nhưng bạn có biết rằng hàm này chỉ là một hàm con từ ACF, Hàm này không phải là get_post_meta() của WordPress?

Sử dụng get_post_meta () thay vì get_field ()

Vì vậy, chúng ta có thể bỏ qua việc sử dụng get_field('field_name') và sử dụng get_post_meta( $post_id, $field_name, true ) để thay thế . Nó sẽ trông như thế này:

[php]// The ACF way
$field = get_field(‘field_name’);
// The WordPress way
$post_id = get_the_ID();
$field = get_post_meta( $post_id, ‘field_name’, true );[/php]

Tuy code có phức tạp hơn với nhiều dòng hơn hoặc nhiều tham số hơn, nhưng đó là cách mà bạn có thể sử dụng để tăng hiệu suất website lên. Một số trường hợp có thể giảm rất nhiều truy vấn (~200 truy vấn). Bạn có thể cài thêm các plugin Như query-monitor để kiểm chứng độ hiệu quả.

Tối ưu việc sử dụng OPTION với ACF

Với get_field (‘field_name’, ‘option’), ACF cung cấp một cách khác để sử dụng và xuất dữ liệu trường từ Option ACF trong plugin hoặc theme. Bạn có biết rằng đây cũng là một hàm con của hàm get_option ()  của WordPress không?

get_option() thay vì get_field()

Thay vì sử dụng get_field('field_name', 'option')  mình có thể sử dụng get_option('options_field_name'). Xin lưu ý rằng mọi tên trường tùy chọn đều yêu cầu tiền tố “options_”

[php]
// The ACF option way
$field_option = get_field(‘field_name’, ‘option’);

// The WordPress option way
$field_option = get_option(‘options_field_name’);[/php]

Xin làm thử một ví dụ nhỏ. Mình tạo một group trong với option pages

Đây là sub field của option page trên. Mặc định thì ACF sẽ lưu giá trị ID và trả về cái mình cần. Nếu chúng ta dùng get field bình thường thì ACF sẽ phải mất công tạo ra một mảng dữ liệu cho chúng ta, vậy sẽ chậm hơn rất nhiều so với việc chúng ta lấy ra bằng PHP và chỉ lấy những thứ ta cần?

Sau đây là đoạn code mình sử dụng để lấy ra được hình ảnh trên

[php]

//get field bình thường
$v2_product = get_field(‘v2_product’, ‘option’);
$background = $v2_product[‘background’];

//wordpress hỗ trợ
$v2_product_background = get_option(‘options_v2_product_backgound’);
$backgroundImage = wp_get_attachment_image_src($v2_product_background, ‘full’);
[/php]

Chúng ta cũng chỉ mất 2 dòng code thôi đúng không? Nhưng giá trị mà 2 dòng code mà wordpress hỗ trợ sẽ lớn hơn nhiều so với việc sử dụng hàm thông qua ACF.

Sử dụng Repeater với ACF

Repeater ACF cho phép chúng ta sử dụng cùng một loại Field trong từng trường hợp khác nhau, theo đó các giá trị trường có thể khác nhau tùy thuộc vào ROW. Ở đây, có khả năng thực hiện mà không có các hàm ACF has_rows() và get_sub_field() và thay vào đó kết hợp vòng lặp for() với get_post_meta().

[php]
// The ACF way

if( have_rows(‘repeater_field_name’) ):

while ( have_rows(‘repeater_field_name’) ) { the_row();

$title = get_sub_field(‘sub_field_name’);
$content = get_sub_field(‘sub_field_name_2’);

}

endif;

// The WordPress way

$rows = get_post_meta( get_the_ID(), ‘repeater_field_name’, true );

if( $rows ) {

for( $i = 0; $i < $rows; $i++ ) {

$title = get_post_meta( get_the_ID(), ‘repeater_field_name_’ . $i . ‘_sub_field_name’, true );
$content = get_post_meta( get_the_ID(), ‘repeater_field_name_’ . $i . ‘_sub_field_name_2’, true );

}

}
if( $rows ) {
for( $i = 0; $i < $rows; $i++ ) {
$title = get_post_meta( get_the_ID(), ‘repeater_field_name_’ . $i . ‘_sub_field_name’, true );
$content = get_post_meta( get_the_ID(), ‘repeater_field_name_’ . $i . ‘_sub_field_name_2’, true );
}
}
[/php]

Đối với sử dụng repeater ACF từ các option pages

[php]
// The ACF option way
if( have_rows(‘repeater_field_name’, ‘option’) ):

while ( have_rows(‘repeater_field_name’, ‘option’) ) { the_row();

$title = get_sub_field(‘sub_field_name’);
$content = get_sub_field(‘sub_field_name_2’);

}

endif;

// The WordPress option way

$rows = get_option(‘options_repeater_field_name’);

if( $rows ) {

for( $i = 0; $i <= $rows; $i++ ) {

$title = get_option(‘options_repeater_field_name_’ . $i . ‘_sub_field_name’);
$content = get_option(‘options_repeater_field_name_’ . $i . ‘_sub_field_name_2’);

}

}
[/php]

Một cách khác để làm việc với repeater ACF là tạo hàm riêng bạn, giúp làm việc với ACF dễ dàng hơn. Bạn có xem ở đây

Sử dụng Repeater của ACF mà không có hàm ACF với get_post_meta() hoặc get_option)

Cách sử dụng Flexible Content

Xem Flexible Content ACF là một công cụ mạnh mẽ cho phép sử dụng lặp lại toàn cấu trúc của một field. Tuy nhiên, nếu chúng ta muốn thực hiện mà không có các hàm ACF ở đây, chúng ta phải sử dụng kết hợp foreach () , switch () và get_post_meta () thay vì while () , have_rows () , get_row_layout () và get_sub_field ().

[php]</pre>
// The ACF way

if( have_rows(‘flexible_content_name’) ) {

while ( have_rows(‘flexible_content_name’) ) { the_row();

if( get_row_layout() == ‘acf_layout_name’ ) {

$title = get_sub_field(‘sub_field_name’);
$content = get_sub_field(‘sub_field_name_2’);

} elseif( get_row_layout() == ‘acf_layout_name_2’ ) {

$title = get_sub_field(‘sub_field_name’);
$content = get_sub_field(‘sub_field_name_2’);

}

}

}

// The WordPress way

$post_id = get_the_ID();
$rows = get_post_meta( $post_id, ‘flexible_content_name’, true );

foreach( $rows as $count => $row ) {

switch( $row ) {

case ‘flexible_content_section_1’:

$title = get_post_meta( $post_id, ‘flexible_content_name_’ . $count . ‘_sub_field_name’, true );
$content = get_post_meta( $post_id, ‘flexible_content_name_’ . $count . ‘_sub_field_name_2’, true );

break;

case ‘flexible_content_section_2’:

$title = get_post_meta( $post_id, ‘flexible_content_name_’ . $count . ‘_sub_field_name’, true );
$content = get_post_meta( $post_id, ‘flexible_content_name_’ . $count . ‘_sub_field_name_2’, true );

break;

}

}
<pre>[/php]

Sử dụng ACF với Taxonomy và Term

Các field ACF cũng có thể được tích hợp và xuất trên các trang phân loại như “Danh mục” hoặc “Từ khóa” . Để có được giá trị trường của get_field () trên trang Taxonomy hoặc Term, chúng ta cũng cần thông tin của $taxonomyvà $term_id. Để loại bỏ điều này, mình sử dụng hàm get_term_meta () trong WordPress và chỉ định $term_id. nếu thấy khó hiểu ta xem đoạn code nên làm dưới đây.

[php]</pre>
$queried_object = get_queried_object();
$taxonomy = $queried_object->taxonomy;
$term_id = $queried_object->term_id;

// The ACF way
$title = get_field( ‘field_name’, $queried_object->taxonomy . ‘_’ . $queried_object->term_id );

// The WordPress way
$term_meta = get_term_meta( $term_id, ‘field_name’ );
$title = $term_meta[0];
[/php]

Sử dụng ACF với User WordPress

Khu vực user trong WordPress cũng có thể được mở rộng với các field của ACF. Để truy cập dữ liệu của các field này, chúng ta phải sử dụng get_field() và chỉ định ID người dùng / ID tác giả với tiền tố “user_” . Thay vào đó, bây giờ chúng tôi sử dụng hàm get_user_meta () của WordPress và chỉ định người dùng hoặc ID tác giả là có thể lấy ra được dữ liệu.

[php]$user_id = 1;

// The ACF way
$gender = get_field(‘field_name’, ‘user_’ . $user_id);

// The WordPress way
$user_meta = get_user_meta( $user_id, ‘field_name’ );
$gender = $user_meta[0];[/php]

Sử dụng field ACF với widget WordPress

Trong các widget WordPress, dữ liệu trường ACF riêng lẻ cũng có thể được lấy ra với get_field() , điều cần làm là có ID widget và tiền tố “widget_” . Thay vào đó, chúng ta có thể sử dụng get_option () chỉ định ID widget tương ứng để thực hiện mà không cần hàm ACF.

[php]$widget_id = ‘my_widget_name’;

// The ACF way
get_field(‘field_name’, ‘widget_’ . $widget_id);

// The WordPress way
get_option(‘widget_’ . $widget_id . ‘_field_name’);[/php]

 

TÚM LẠI:

Ví dụ nhỏ nè

Một trường hình ảnh, nếu bạn đặt ACF để trả về và mảng hoặc đối tượng hình ảnh, điều này sẽ chậm vì ACF phải thực hiện rất nhiều truy vấn để xây dựng mảng hình ảnh đó. Khi nói đến các trường hình ảnh, tốt hơn hết bạn chỉ nên trả lại ID tệp đính kèm và sau đó sử dụng các hàm WP để chỉ nhận được những gì bạn cần. Điều này cũng đúng với bất kỳ field nào có thể trả về đối tượng WP như trường Taxonomy, User, Relationship. Đối với hiệu suất, bạn sẽ luôn tốt hơn nên lấy ID và sau đó sử dụng nó để tự gọi các hàm WP. Lý do là ACF có thể nhận được nhiều thông tin hơn bạn thực sự cần và thực hiện thêm các truy vấn để có được thông tin không cần thiết này.

Tui làm theme bằng ACF. Trong trường hợp của tôi, biến JSON chậm hơn so với biến PHP.

Đây là kết quả của tôi:

Load các trường từ file đã cho ra được viết PHP: Tổng số truy vấn> 704

Load các trường dữ liệu từ được trả về bằng Object JSON thông qua các hàm ACF: Tổng số truy vấn> 851

Chiến thắng là PHP chứ hong phải JSON OBJECT

Đây là một thí nghiệm nhỏ về kết quả mình test

Khi dùng get field bình thường phải mất thêm 4 truy vấn

Khi dùng get_option chỉ mất 1 truy vấn và ra cùng quả