Завжди можна подивитися детальну інформацію в документації, нижче описані моменти, на які буде звернено увагу під час code review. Це все для більшої організації коду, його читабельності та підтримки
Коментарі
/** * The comments language is English only:) **/
Функції
Найменування
Для забезпечення єдності та зрозумілості коду в наших проектах ми дотримуємося стандарту іменування функцій, відомого як snake_case. Наприклад custom_footer_message();
Унікальнiсть назви функції домагаемось через використання префікса che_
Наприклад che_show_admin_preview_image
Типізація даних і значення за замовчуванням
Для підвищення надійності та передбачуваності роботи коду необхідно вказувати типи даних, що передаються і повертаються
/**
* Show preview image in admin when hover on a block
*
* @param string $type The type of preview.
* @param array $blocks A list of blocks to show previews for.
*
* @return bool True on success, false on failure.
*/
function che_show_admin_preview_image(string $type = '', array $blocks = []): bool {
// Other code here...
Ранній вихід із функції
Намагаємося широко використовувати практику раннього повернення з функції.
function che_show_admin_preview_image(string $type = '', array $blocks = []): bool {
if (empty($blocks)) {
return false;
}
// Other logic here...
return true;
}
Hooks
Callbacks
Для покращення читабельності та підтримки коду, необхiдно слідувати наступним практикам
-
Якщо callback функція коротка і використовується лише в одному місці, її можна оголосити безпосередньо всередині виклику
add_action()абоadd_filter(). Це спрощує читання коду, оскільки одразу видно, що робить колбек.Приклад хука
add_action()з анонімною функцієюadd_action('wp_footer', function() { // Get the current year $year = date('Y'); // Prepare the copyright text for translation $text = sprintf(__('© %s. All rights reserved.', 'your-text-domain'), $year); echo '<div class="copyright">' . $text . '</div>'; }); -
Окремі callback функції з великим функціоналом, які можуть використовуватись в iншому мicцi, оголошуються до виклику хука!
function che_remove_wp_version_strings( string $src = '' ): string { if ( empty( $src ) ) { return $src; } global $wp_version; $parse_url = parse_url( $src, PHP_URL_QUERY ); parse_str( $parse_url, $query ); if ( ! empty( $query['ver'] ) && $query['ver'] === $wp_version ) { $src = remove_query_arg( 'ver', $src ); } return $src; } add_filter( 'script_loader_src', 'che_remove_wp_version_strings' ); add_filter( 'style_loader_src', 'che_remove_wp_version_strings' );
If, else, short-if, foreach
“Short-if”
Для стислості та простоти коду намагаємося використовувати тернарний оператор (або short-if).
Приклад зі стандартним if:
$age = 20;
if ($age > 17) {
$status = 'adult';
} else {
$status = 'minor';
}
Оптимальніший варіант із використанням тернарного оператора
$age = 20; $status = $age > 17 ? 'adult' : 'minor';
Isset та short-if
//допускається $username = isset($username) ? $username : 'guest'; //кращий варiант $username = $username ?? 'guest';
Фігурні дужки або двокрапка
Для стандартного функціоналу if-else/foreach необхідно використовувати з фігурними дужками:
if ( $age > 17 ) {
$status = 'adult';
}
$list = array();
foreach ( $liks as $link ) {
$list[] = $link['href'];
}
Для управління виведенням html коду ми використовуємо альтернативний синтаксис:
<?php if ( ! empty( $items ) ): ?> <ul> <?php foreach ( $items as $item ): ?> <li><?php echo $item; ?></li> <?php endforeach; ?> </ul> <?php endif; ?>
empty() включає в себе isset()
//тут немає помилки, але це зайва перевірка
if ( isset( $vars[1] ) && ! empty( $vars[1] ) ) {
//some code
}
//у цьому випадку буде достатньо
if ( ! empty( $vars[1] ) {
//some code
}
Best Practices
Так краще не робити
<h3 class="title-3"> <?php if ( get_field( 'block_accordion_title' ) ) : ?> <?php echo get_field( 'block_accordion_title' ); ?> <?php endif; ?> </h3>
Замість цього
<?php if ( $block_accordion_title = get_field( 'block_accordion_title' ) ) : ?>
<h3 class="title-3"><?php echo $block_accordion_title; ?></h3>
<?php endif; ?>
Або для true-false блоку
<?php
$is_show = get_field( 'show_hide_block' );
if ( $is_show ) : ?>
<div>
...
</div>
<?php endif; ?>
Екранування даних
Детальніше в документації
Екранування в html атрибутах
Виключається в таких випадках
-
якщо самостійно задаємо значення
class="<?php echo get_sub_field( 'orange' ) ? 'type-orange' : ''; ?>"
-
якщо вставляємо значення константи
src="<?php echo ! empty( $img ) ? THEME_URL . '/img/' . $link : 'no-img.svg'; ?>"
У всіх інших випадках (data-*, placeholder, class, id, …) використовуємо esc_attr
<div id="id-<?php echo esc_attr($id); ?> ">
Для екранування посилань esc_url
<img alt="" src="<?php echo esc_url( $media_url ); ?>" />
Для екранування інлайного js код використовуємо esc_js.
<script type="text/javascript">
var myVar = <?php echo esc_js( $my_var ); ?>
</script>
Але до такого краще не доводити, а використовувати замість цього wp_localize_script
Форматування та стилістика
Структура
Намагаємося структурувати й організовувати код для поліпшення його читабельності та підтримки. Ось приклад коду, який без структури:
$exampleList = ['item1', 'item2', 'item3'];
$isConditionMet = true;
if ( $isConditionMet ) {
echo "Condition is met.\n";
}
foreach ( $exampleList as $item ) {
echo "Processing: " . $item . "\n";
}
Приклад до якого необхідно прагнути (код групується за призначенням, додаються коментарі та відступи):
// Variable declarations
$exampleList = [ 'item1', 'item2', 'item3' ];
$isConditionMet = true;
// If statement
if ( $isConditionMet ) {
echo "Condition is met.\n";
}
// Foreach loop
foreach ( $exampleList as $item ) {
echo "Processing: " . $item . "\n";
}
Повторюваний код
Код подібного роду
<div class="steps">
<?php
get_template_part('template-parts/partials/step', 'discount', ['id' => 'step-discount']);
get_template_part('template-parts/partials/step', 'package', ['id' => 'step-package']);
get_template_part('template-parts/partials/step', 'overview', ['id' => 'step-overview']);
get_template_part('template-parts/partials/step', 'contacts', ['id' => 'step-contacts']);
get_template_part('template-parts/partials/step', 'finale', ['id' => 'step-finale']);
?>
</div>
Необхідно буде оптимізувати
$steps = array( 'discount', 'package', 'overview', 'contacts', 'finale' ); ?> <div class="steps"> <?php foreach ( $steps as $step ) : ?> <?php get_template_part( 'template-parts/partials/step', $step, ['id' => 'step-' . $step]); ?> <?php endforeach; ?> </div>
Скрипти та стилі
Тут можна отримати всю інформацію щодо Front-end Style Guide
https://cheitgroup.atlassian.net/wiki/x/GoCYGwНамагаємося поступово позбавляти від практики додавання js коду і стилів прямо в ACF block. Зараз це можна реалізувати через функціонал додавання ресурсів для блоку.
Кастомні стилі та скрипти для back-end
Якщо зв'явилась необхідність використання свого кастомного *.js або *.css (рідше) файлу, то можна зробити наступне:
-
в папці
frontend/assets/необхідно створити папкуbackend/jsчиbackend/css -
створити необхідний файл
-
підключити його:
-
або в файлі
includes/config/config.phpза необхідною умовою -
або у необхідному блоці
-
-
спокійно працювати в цьому файлі - таким чином ми виключимо його із FE збірки
Корисний функціонал
Checked
Детальніше в документації. Можна використовувати як для checkbox так i для radio полiв.
Перевiка через if
<input type='checkbox' name='state' value='1' <?php if ( $value == 1 ) echo 'checked="checked"'; ?> />
Використання checked
<input type="checkbox" name="state" value="1" <?php checked( $value, 1 ); ?> />
Selected
Детальніше в документації. Можна використовувати як для тегу selected.
Перевiка через if
<select name="count"> <option value="one" <?php if ($count == 'one') echo 'selected="selected"'; ?>>one</option> <option value="two" <?php if ($count == 'two') echo 'selected="selected"'; ?>>two</option> <option value="three" <?php if ($count == 'three') echo 'selected="selected"'; ?>>three</option> </select>
Використання selected
<select name="count"> <option value="one" <?php selected( $count, 'one' ); ?>>one</option> <option value="two" <?php selected( $count, 'two' ); ?>>two</option> <option value="three" <?php selected( $count, 'three' ); ?>>three</option> </select>
Best practice з selected
<?php $options_values = [ 'one', 'two', 'three' ]; ?> <select name="count"> <?php foreach ($options_values as $value) : ?> <option value="<?php echo esc_attr($value); ?>" <?php selected($count, $value); ?>> <?php echo $value; ?> </option> <?php endforeach; ?> </select>
Константи для часових інтервалів
Для зручного і зрозумілого відображення часових змінних у секундах у WordPress можна використовувати вже готові константи
define( 'MINUTE_IN_SECONDS', 60 ); define( 'HOUR_IN_SECONDS', 60 * MINUTE_IN_SECONDS ); define( 'DAY_IN_SECONDS', 24 * HOUR_IN_SECONDS ); define( 'WEEK_IN_SECONDS', 7 * DAY_IN_SECONDS ); define( 'MONTH_IN_SECONDS', 30 * DAY_IN_SECONDS ); define( 'YEAR_IN_SECONDS', 365 * DAY_IN_SECONDS );
Варто звернути увагу, що ці значення є приблизними і потрібно враховувати високосні роки або місяці з 31-м днем окремо
Leave a Reply
You must be logged in to post a comment.