Привіт:) У цьому пості я зібрав корисні сніпети, які використовую під час розробки у середовищі WordPress.
- Як перевірити чи активований плагін WordPress
- Як заборонити деактивацію WordPress плагіну в адмін-панелі
- Як перевірити, чи поточна сторінка WordPress є домашньою
- Як у WordPress заборонити видалення окремих сторінок (записів)
- Як повністю заборонити індексувати сайт WordPress
- Як у текстовому рядку першу букву першого слова зробити великою, а усі інші символи - маленькими [CSS]
- Як визначити мову сторінки [JavaScript]
- Як у WordPress отримати поточну локаль (код мови) сайту
- Як у WordPress видалити порожнє посилання у меню з адресою #
- Як у WordPress видалити старі слаги постів/записів
- Як у WordPress закрити сторінку (запис) від індексації пошуковими системами
- Вимкнути Gutenberg для віджетів
- Як перевірити, що ми знаходимося у користувацькій частині сайту
- Заборона автоматичного редиректу, який робить WordPress якщо змінюється слаг посту
- Як отримати адресу головної сторінки сайту
- Отримати адресу головної сторінки сайту (з мовним префіксом)
- Як визначити сторінку блогу (архіву записів)
- Як визначити сторінку блогу (архіву записів) або сторінку посту
- Як додати користувацькі типи записів (CPT) у пошук
- Як програмно вимкнути архіви
- Як автоматично додати атрибут lightbox посиланням на зображення
- Як завантажувати бібліотеку jQuery із Google CDN
- Контент у редакторі Gutenberg за замовчуванням при створенні нової публікації
- Як увімкнути режим розробки (Maintenance Mode)
- Перевірка чи переглядає сайт користувач із правами Адміністратора
- Як автоматично вставити власний (кастомний) вміст після конкретного параграфу запису/сторінки
- Як автоматично вставити власний (кастомний) вміст після заголовку запису/сторінки
- Як автоматично вставити власний (кастомний) вміст після основного контенту запису/сторінки
- Як автоматично вставити власний (кастомний) вміст перед основним контентом запису/сторінки
- Як вивести на екран усі завантажені в шапці/підвалі JS та CSS-скрипти WordPress
- Пошук за користувацькими полями WordPress (Custom Fields)
- Як змінити HTML-код сторінки у WordPress перед виведенням у браузер
- Як отримати перше зображення посту
- Видалення всіх СПАМ-коментарів [SQL]
- Скидання пароля користувача [SQL]
- Зміна логіну користувача [SQL]
- Зміна адміністративної email-адреси (без підтвердження) [SQL]
- Зміна email-адреси для користувача (без підтвердження) [SQL]
- Робота з резервними копіями бази даних MySQL за допомогою mysqldump
- Як прибрати косу лінію / в кінці адреси
- Як накласти 2 зображення та зробити їх адаптивними [CSS]
- Як створити віртуальну сторінку в WordPress
- Спосіб 1
- Спосіб 2
- Як визначити мову сторінки в CSS
- Як у WordPress передати переклад рядків із PHP в JavaScript
- Як відновити пароль у WordPress
- Відновлення пароля через сторінку входу
- Відновлення пароля за допомогою SQL-запиту до бази даних
- Відновлення пароля через файл functions.php
- Відновлення пароля через створення нового файлу
- Повернути назад кириличні слаги WordPress після вимкнення плагінів транслітерації типу Cyr-To-Lat
- Автоматичне пересилання даних із WordPress-форм у Telegram
- Заготовка Табів на HTML + CSS
- Як у WordPress програмно додати у кінець меню свій елемент
- Як змінити колір атрибуту placeholder у тегові input [CSS]
- Як обрізати текст у CSS [CSS]
- Обрізання тексту для одного рядка
- Обрізання тексту для блоку з декількома рядками
- Як стилізувати лише посилання без класу [CSS]
- Чому слід уникати post__not_in у користувацьких запитах WP_Query
- В чому проблема post__not_in
- Який вихід
- Як вимкнути плагіни WordPress без доступу до адмін-панелі
Як перевірити чи активований плагін WordPress
/**
* Спосіб 1
*/
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( ! is_plugin_active( 'updraftplus/updraftplus.php' ) ) {
// Plugin is NOT active
return;
} else {
// Plugin is active
}
/**
* Спосіб 2
*/
if ( ! class_exists( 'woocommerce' ) ) {
exit;
}
/**
* Спосіб 3
*/
if ( in_array( 'updraftplus/updraftplus.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
// Plugin is active
}
Як заборонити деактивацію WordPress плагіну в адмін-панелі
/**
* Заборона деактивації вказаного плагіну в адмін-панелі, в MU-Plugins
*/
add_filter( 'plugin_action_links', function( $actions, $plugin_file ) {
// Видаляє дію "Вимкнути (Деактивувати)" у плагіні
$important_plugins = array(
'updraftplus/updraftplus.php',
);
if ( in_array( $plugin_file, $important_plugins ) ) {
unset( $actions['deactivate'] );
$actions['info'] = '<b class="musthave_js">Cannot be deactivated</b>';
}
return $actions;
}, 10, 2 );
/**
* Повне приховування плагіна зі списку в адмін-панелі, в MU-Plugins
*/
add_filter( 'all_plugins', function( $plugins ) {
// Вкажіть шлях до плагіна, який треба приховати
$target_plugin = 'updraftplus/updraftplus.php';
if ( isset( $plugins[ $target_plugin ] ) ) {
unset( $plugins[ $target_plugin ] );
}
return $plugins;
} );
Як перевірити, чи поточна сторінка WordPress є домашньою
/**
* Під час перевірки головної URL-адреси веб-сайту з налаштуванням домашньої сторінки для відображення останніх дописів.
*/
if ( is_home() ) {
// Істинно, виконується
}
if ( is_front_page() ) {
// Істинно, виконується
}
if ( is_home() && is_front_page() ) {
// Істинно, виконується
}
if ( is_home() || is_front_page() ) {
// Істинно, виконується
}
if ( ! is_home() && ! is_front_page() ) {
// Виконається на всіх сторінках, крім головної та домашньої
}
/**
* Під час перевірки основної URL-адреси веб-сайту, де домашня сторінка є статичною.
*/
if ( is_home() ) {
// Хибно, не виконується
}
if ( is_front_page() ) {
// Істинно, виконується
}
if ( is_home() && is_front_page() ) {
// Хибно, не виконується
}
if ( is_home() || is_front_page() ) {
// Істинно, виконується
}
/**
* Під час перевірки URL-адреси website.com/blog/ із блогом, встановленої у якості сторінки публікацій блогу.
*/
if ( is_home() ) {
// Істинно, виконується
}
if ( is_front_page() ) {
// Хибно, не виконується
}
if ( is_home() && is_front_page() ) {
// Хибно, не виконується
}
if ( is_home() || is_front_page() ) {
// Істинно, виконується
}
Як у WordPress заборонити видалення окремих сторінок (записів)
if ( ! is_admin() ) {
return;
}
final class MP_Important_Pages {
public static array $importantPages = [
// 'page' — для сторінок, 'post' — для звичайних записів, можна додати й інші типи (наприклад, 'product')
'page' => [
'sample-page',
'page-2',
'page-3',
],
'post' => [
'seo-guide',
'post-2',
'post-3',
],
];
public static function mp_init() {
add_filter( 'display_post_states', [ __CLASS__, 'mp_mark_in_post_list_page' ], 10, 2 );
add_action( 'pre_trash_post', [ __CLASS__, 'mp_restrict_post_deletion' ], 10, 2 );
add_filter( 'pre_delete_post', [ __CLASS__, 'mp_restrict_post_deletion' ], 10, 2 );
add_filter( 'page_row_actions', [ __CLASS__, 'mp_remove_row_action' ], 10, 2 );
}
public static function mp_mark_in_post_list_page( array $postStates, $post ): array {
if( self::mp_is_post_in_list( $post ) ) {
$postStates[] = '<small>НЕ ПІДЛЯГАЄ ВИДАЛЕННЮ</small>';
}
return $postStates;
}
public static function mp_remove_row_action( array $actions, $post ): array {
if( self::mp_is_post_in_list( $post ) ) {
unset( $actions['delete'] );
}
return $actions;
}
public static function mp_restrict_post_deletion( $delete, $post ) {
if( self::mp_is_post_in_list( $post ) ) {
wp_die( "Сторінка `$post->post_name` не може бути видалена!" );
}
return $delete;
}
private static function mp_is_post_in_list( $post ): bool {
if( empty( $post->post_type ) ) {
return false;
}
$list = self::$importantPages[ $post->post_type ] ?? [];
return in_array( $post->post_name, $list, true );
}
}
MP_Important_Pages::mp_init();
Як повністю заборонити індексувати сайт WordPress
add_filter( 'wp_headers', static function ( array $headers, WP $wp ): array {
$headers['X-Robots-Tag'] = 'noindex, nofollow';
return $headers;
}, 10, 2 );
Як у текстовому рядку першу букву першого слова зробити великою, а усі інші символи - маленькими [CSS]
/* ВАРІАНТ 1 */
a {
display: inline-block; /* або block */
text-transform: lowercase;
}
a::first-letter {
text-transform: uppercase;
}
/* ВАРІАНТ 2 */
a {
display: inline-block; /* або block */
text-transform: lowercase;
}
a::first-letter {
text-transform: capitalize;
}
Як визначити мову сторінки [JavaScript]
let pageLang = document.documentElement.lang;
if (pageLang === 'uk' || pageLang === 'uk_UA' || pageLang === 'uk-UA') {
console.log('Мова - укр.');
} else if (pageLang === 'en' || pageLang === 'en_US' || pageLang === 'en-US') {
console.log('Мова - англ.');
}
Як у WordPress отримати поточну локаль (код мови) сайту
// код мови у форматі 'en_US'
get_locale();
// код мови у форматі 'en-US'
get_bloginfo( 'language' );
// визначити локаль в адмін-частині сайту. код мови у форматі 'en'
if ( is_admin() && current_user_can( 'manage_options' ) ) {
echo $_REQUEST['lang'];
}
// через плагін Polylang. код мови у форматі 'en'
pll_current_language();
// через плагін WPML
add_action( 'init', function() {
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
if ( is_plugin_active( 'sitepress-multilingual-cms/sitepress.php' ) ) {
$currentLang = '';
$currentLang = apply_filters( 'wpml_current_language', NULL );
// код мови у форматі 'en'
echo $currentLang;
}
} );
Як у WordPress видалити порожнє посилання у меню з адресою #
// Спосіб 1
add_filter( 'wp_nav_menu_items', function ( $menu ) {
return str_replace( '<a href="#"', '<a', $menu );
} );
// Спосіб 2
.menu-item a[href="#"] {
pointer-events: none;
cursor: default;
}
Як у WordPress видалити старі слаги постів/записів
Після оновлення слагу посту WordPress за замовчуванням зберігає старий.
// Вимкнути функцію збереження старих слагів
remove_action( 'template_redirect', 'wp_old_slug_redirect' );
remove_action( 'post_updated', 'wp_check_for_changed_slugs', 12, 3 );
// Видалити збережені старі слаги
DELETE FROM `wp_postmeta` WHERE `meta_key` = '_wp_old_slug';
Як у WordPress закрити сторінку (запис) від індексації пошуковими системами
// Закрити окремий пост (запис)
add_action( 'wp_head', function() {
if ( is_single(56) ) {
echo "\n".'<meta name="robots" content="noindex, follow" />'."\n";
}
} );
// Закрити окрему сторінку
add_action( 'wp_head', function() {
if ( is_page(78) ) {
echo "\n".'<meta name="robots" content="noindex, follow" />'."\n";
}
} );
Вимкнути Gutenberg для віджетів
add_filter( 'gutenberg_use_widgets_block_editor', '__return_false' );
add_filter( 'use_widgets_block_editor', '__return_false' );
Як перевірити, що ми знаходимося у користувацькій частині сайту
if ( ! is_admin() && ! current_user_can( 'manage_options' ) ) {
// знаходимося у користувацькій частині сайту
}
Заборона автоматичного редиректу, який робить WordPress якщо змінюється слаг посту
Кожна публікація WordPress має унікальний слаг (slug), який автоматично генерується за назвою вашої публікації або прописується вручну в редакторі. Якщо в опублікованому пості чи сторінці змінити цей слаг, WordPress запам’ятає старий і перенаправить його на новий. Щоб заборонити таку дію, виконайте 2 дії.
- Видаліть із бази даних архів старих слагів через наступний SQL-запит
DELETE FROM `wp_postmeta` WHERE `meta_key` = '_wp_old_slug';
- У файл functions.php вставте код:
/**
* Removing the redirect after changing a post/pages slug
*/
remove_action( 'template_redirect', 'wp_old_slug_redirect' );
remove_action( 'post_updated', 'wp_check_for_changed_slugs', 12, 3 );
Як отримати адресу головної сторінки сайту
echo esc_url( get_option( 'home' ) );
Отримати адресу головної сторінки сайту (з мовним префіксом)
/*
* https://site.com - без "слешу" в кінці
* https://site.com/uk - без "слешу" в кінці
* https://site.com/de - без "слешу" в кінці
*/
echo esc_url( get_home_url() );
/*
* https://site.com/ - зі "слешем" в кінці
* https://site.com/uk/ - зі "слешем" в кінці
* https://site.com/de/ - зі "слешем" в кінці
*/
echo esc_url( trailingslashit( get_home_url() ) );
Як визначити сторінку блогу (архіву записів)
// Якщо є статична сторінка, яка вказана у Налаштування -> Читання -> Ваша домашня сторінка відображає -> Сторінка записів (Settings -> Reading -> Your homepage displays -> Posts page).
if ( is_home() && ! is_front_page() ) {
echo 'IS BLOG PAGE';
} else {
echo 'IS NOT BLOG PAGE';
}
Як визначити сторінку блогу (архіву записів) або сторінку посту
if ( ( is_home() && ! is_front_page() ) || ( is_singular( 'post' ) ) ) {
var_dump( 'IS BLOG PAGE OR POST PAGE' );
} else {
var_dump( 'NO BLOG PAGE AND NO POST PAGE' );
}
Як додати користувацькі типи записів (CPT) у пошук
/**
* Add custom post types (CPT) "books" to search
*/
add_action( 'pre_get_posts', 'mp_add_cpt_books_to_search' );
function mp_add_cpt_books_to_search( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
$query->set( 'post_type', array( 'post', 'books' ) );
}
}
Як програмно вимкнути архіви
add_action( 'template_redirect', 'mp_remove_wp_archives' );
function mp_remove_wp_archives() {
if( is_category() || is_tag() || is_date() || is_author() ) {
global $wp_query;
$wp_query->set_404();
}
}
Як автоматично додати атрибут lightbox посиланням на зображення
add_filter( 'the_content', 'mp_add_lightbox_attr_to_image_links' );
function mp_add_lightbox_attr_to_image_links( $content ) {
$pattern ="/<a(.*?)href=('|\")(.*?).(bmp|gif|jpeg|jpg|png)('|\")(.*?)>/i";
$replacement = '<a$1href=$2$3.$4$5 rel="lightbox"$6>';
$content = preg_replace( $pattern, $replacement, $content );
return $content;
}
Як завантажувати бібліотеку jQuery із Google CDN
add_action( 'init', 'mp_jquery_from_cdn' );
function mp_jquery_from_cdn() {
if ( ! is_admin() ) {
wp_deregister_script( 'jquery' );
$jqueryUrl = 'https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js';
wp_register_script( 'jquery', $jqueryUrl, false, null, false );
wp_enqueue_script( 'jquery' );
}
}
Контент у редакторі Gutenberg за замовчуванням при створенні нової публікації
add_filter( 'the_editor_content', 'mp_set_default_editor_content', 1000, 2 );
function mp_set_default_editor_content( $content, $default_editor ) {
global $pagenow;
if ( 'post-new.php' === $pagenow ) {
ob_start();
?>
<p>Default content here...</p>
<?php
return ob_get_clean();
}
return $content;
}
Як увімкнути режим розробки (Maintenance Mode)
add_action( 'get_header', 'mp_maintenance_mode' );
function mp_maintenance_mode() {
if ( ! current_user_can( 'administrator' ) && ! current_user_can( 'manage_options' ) || ! is_user_logged_in () ) {
wp_die( 'Сайт знаходиться у розробці...' );
}
}
Перевірка чи переглядає сайт користувач із правами Адміністратора
// Варіант 1
if ( current_user_can( 'administrator' ) && current_user_can( 'manage_options' ) ) {
// Адміністратор
}
// Варіант 2
if ( current_user_can( 'manage_options' ) ) {
// Адміністратор
}
Як автоматично вставити власний (кастомний) вміст після конкретного параграфу запису/сторінки
/**
* Insert custom content after a certain paragraph (on the example of a Single Post)
*/
add_filter( 'the_content', 'mp_insert_custom_content_after_a_certain_paragraph' );
function mp_insert_custom_content_after_a_certain_paragraph( $content ) {
if ( ! is_single() )
return $content;
$newСontent = '';
// Номер абзацу, після якого буде виводитися ваш вміст
$paragraphAfter = 1;
// Ваш вміст
$contentAfterParagraph = 'CONTENT AFTER A CERTAIN PARAGRAPH';
$content = explode ( "</p>", $content );
for ( $i = 0; $i < count ( $content ); $i++ ) {
if ( $i == $paragraphAfter ) {
$newСontent .= $contentAfterParagraph;
}
$newСontent .= $content[$i] . "</p>";
}
return $newСontent;
}
Як автоматично вставити власний (кастомний) вміст після заголовку запису/сторінки
/**
* Insert custom content at the end of Title (on the example of a Single Post)
*/
add_filter( 'the_title', 'mp_insert_custom_content_at_the_end_of_title' );
function mp_insert_custom_content_at_the_end_of_title( $title ) {
if ( is_single() ) {
$customTitle = 'CONTENT AT THE END OF TITLE';
$title .= $customTitle;
}
return $title;
}
Як автоматично вставити власний (кастомний) вміст після основного контенту запису/сторінки
/**
* Insert custom content after main content (on the example of a Single Post)
*/
add_filter( 'the_content', 'mp_insert_custom_content_after_main_content' );
function mp_insert_custom_content_after_main_content( $content ) {
if ( is_single() ) {
$customContent = 'CUSTOM CONTENT AFTER MAIN CONTENT';
$content .= $customContent;
}
return $content;
}
Як автоматично вставити власний (кастомний) вміст перед основним контентом запису/сторінки
/**
* Insert custom content before main content (on the example of a Single Post)
*/
add_filter( 'the_content', 'mp_insert_custom_content_before_main_content' );
function mp_insert_custom_content_before_main_content( $content ) {
if ( is_single() ) {
$customContent = 'CUSTOM CONTENT BEFORE MAIN CONTENT';
$content = $customContent . $content;
}
return $content;
}
Як вивести на екран усі завантажені в шапці/підвалі JS та CSS-скрипти WordPress
add_action( 'wp_head', function() {
global $wp_scripts;
global $wp_styles;
echo '<pre>';
print_r( $wp_scripts->done );
echo '</pre>';
echo '<pre>';
print_r( $wp_styles->done );
echo '</pre>';
}, 9999 );
add_action( 'wp_footer', function() {
global $wp_scripts;
global $wp_styles;
echo '<pre>';
print_r( $wp_scripts->done );
echo '</pre>';
echo '<pre>';
print_r( $wp_styles->done );
echo '</pre>';
}, 9999 );
Пошук за користувацькими полями WordPress (Custom Fields)
/**
* ===============================================================
* == Розширення пошуку WordPress, включивши користувацькі поля ==
* ===============================================================
*/
/**
* Об'єднання таблиць posts і postmeta
*/
if ( ! function_exists( 'mp_search_join' ) ) {
add_filter( 'posts_join', 'mp_search_join' );
function mp_search_join( $join ) {
global $wpdb;
if ( is_search() ) {
$join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '.ID = ' . $wpdb->postmeta . '.post_id ';
}
return $join;
}
}
/**
* Зміна пошукового запиту за допомогою фільтру posts_where
*/
if ( ! function_exists( 'mp_search_where' ) ) {
add_filter( 'posts_where', 'mp_search_where' );
function mp_search_where( $where ) {
global $pagenow, $wpdb;
if ( is_search() ) {
$where = preg_replace(
"/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/",
"(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where );
}
return $where;
}
}
/**
* Виключення повернення дублікатів
*/
if ( ! function_exists( 'mp_search_distinct' ) ) {
add_filter( 'posts_distinct', 'mp_search_distinct' );
function mp_search_distinct( $where ) {
global $wpdb;
if ( is_search() ) {
return "DISTINCT";
}
return $where;
}
}
Як змінити HTML-код сторінки у WordPress перед виведенням у браузер
/**
* Додавання власних даних у HTML-код сторінки перед виведенням її у браузер
*
* <meta name="robots" content="noindex, follow">
*
*/
if ( ! function_exists( 'mp_add_to_html_code_buffer' ) ) {
add_action( 'template_redirect', 'mp_add_to_html_code_buffer' );
function mp_add_to_html_code_buffer() {
ob_start( 'mp_add_to_html_code' );
}
function mp_add_to_html_code( $buffer ) {
$insert_string = '<meta name="robots" content="noindex, follow">';
// Якщо знайшли наш рядок перед закриттям тегу </head>, нічого не додаємо
if ( strpos( $buffer, $insert_string ) !== false ) {
// error_log( print_r( 'CODE ALREADY EXISTS!', 1 ) );
return $buffer;
}
// Додаємо наш рядок перед закриттям тегу </head>
$insert = "\n" . $insert_string . "\n";
$buffer = str_replace( '</head>', $insert . '</head>', $buffer );
// error_log( print_r( 'CODE IS MISSING, ADD IT!', 1 ) );
return $buffer;
}
}
/**
* Зміна HTML-коду сторінки перед виведенням її у браузер:
*
* 1. <title>Власний заголовок</title>
* 2. <html lang="Власне значення"> (наприклад, "uk_UA")
*
*/
if ( ! function_exists( 'mp_change_html_code_buffer' ) ) {
add_action( 'template_redirect', 'mp_change_html_code_buffer' );
function mp_change_html_code_buffer() {
ob_start( 'mp_change_html_code' );
}
function mp_change_html_code( $buffer ) {
$new_title = 'Власний заголовок сторінки';
$new_html_lang = 'uk_UA';
$pattern_title = '/<title>(.*?)<\/title>/s';
$pattern_html_lang = '/<html[^>]*lang=["\']([^"\']*)["\'][^>]*>/i';
if ( preg_match( $pattern_title, $buffer, $matches ) ) {
// $matches[0] містить весь знайдений тег <title>...</title>
// $matches[1] містить вміст тегу <title>
$buffer = preg_replace( $pattern_title, '<title>' . $new_title . '</title>', $buffer );
}
if ( preg_match( $pattern_html_lang, $buffer, $matches ) ) {
// $matches[0] містить весь знайдений тег <html lang="...">
// $matches[1] містить вміст атрибуту lang
// error_log( print_r( $matches, 1 ) );
$buffer = preg_replace( $pattern_html_lang, '<html lang="' . $new_html_lang . '">', $buffer );
}
return $buffer;
}
}
Як отримати перше зображення посту
function mp_get_first_post_image() {
global $post;
if ( ! $post ) {
return false;
}
preg_match( '/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches );
if ( ! empty( $matches[1] ) ) {
return esc_url( $matches[1] );
}
return "https://placehold.co/600x400.png";
}
Видалення всіх СПАМ-коментарів [SQL]
DELETE FROM wp_comments WHERE comment_approved = 'spam';
Скидання пароля користувача [SQL]
/* newpass — новий пароль, admin — логін користувача, в якого буде змінений пароль */
UPDATE wp_users SET user_pass = MD5('newpass') WHERE user_login = 'admin';
Зміна логіну користувача [SQL]
/* логін admin змінити на petrov */
UPDATE wp_users SET user_login = 'petrov' WHERE user_login = 'admin';
Зміна адміністративної email-адреси (без підтвердження) [SQL]
/* зміна адміністративної email-адреси на new@site.com */
UPDATE wp_options SET option_value = 'new@site.com' WHERE option_name = 'admin_email';
Зміна email-адреси для користувача (без підтвердження) [SQL]
/* Зміна email-адреси для користувача з ID=1 (користувач із адміністративними правами, який створюється при встановленні WordPress) */
UPDATE wp_users SET user_email = 'new@site.com' WHERE ID = 1;
Робота з резервними копіями бази даних MySQL за допомогою mysqldump
// Створення резервної копії
// для Windows
// mysqldump -uroot -proot db_name > D:/dump.sql
mysqldump -u USER -p PASSWORD DATABASE > /path/to/file/dump.sql
// Створення структури БД (без даних)
mysqldump --no-data -u USER -p PASSWORD DATABASE > /path/to/file/schema.sql
// Створення дампу однієї або декількох таблиць
mysqldump -u USER -p PASSWORD DATABASE TABLE1 TABLE2 TABLE3 > /path/to/file/dump_table.sql
// Створення дампу та його архівація
mysqldump -u USER -p PASSWORD DATABASE | gzip > /path/to/outputfile.sql.gz
// Створення бекапу з вказанням його дати
mysqldump -u USER -p PASSWORD DATABASE | gzip > date +/path/to/outputfile.sql.%Y%m%d.%H%M%S.
// Відвантаження бекапу в базу даних
mysql -u USER -p PASSWORD DATABASE < /path/to/dump.sql
// Відвантаження архіву бекапу в базу даних
// варіант 1
gunzip < /path/to/outputfile.sql.gz | mysql -u USER -p PASSWORD DATABASE
// варіант 2
zcat /path/to/outputfile.sql.gz | mysql -u USER -p PASSWORD DATABASE
// Створення нової бази даних
mysqladmin -u USER -p PASSWORD create NEWDATABASE
// Бекап з додатковими опціями -Q -c -e
// -Q обертає імена зворотними лапками
// -c робить повну вставку, включаючи імена колонок
// -e робить розширену вставку. Кінцевий файл виходить меншим і створюється він трохи швидше
mysqldump -Q -c -e -u USER -p PASSWORD DATABASE > /path/to/file/dump.sql
// Перегляд списку баз даних
// варіант 1
mysqlshow -u USER -p PASSWORD
// варіант 2
mysqlshow -u USER -p PASSWORD DATABASE
Як прибрати косу лінію / в кінці адреси
/**
* Прибрати "/" для постів типу Page
*/
add_filter( 'user_trailingslashit', 'mp_remove_slash_in_pages', 70, 2 );
function mp_remove_slash_in_pages( $string, $type ) {
global $wp_rewrite;
if ( 'page' === $type && $wp_rewrite->using_permalinks() && $wp_rewrite->use_trailing_slashes ) {
$string = untrailingslashit( $string );
}
return $string;
}
Як накласти 2 зображення та зробити їх адаптивними [CSS]
<div class="images">
<img src="https://picsum.photos/300/300?random=1" alt="Image 1">
<img src="https://picsum.photos/300/300?random=2" alt="Image 2">
</div>
.images {
display: grid;
max-width: 600px;
aspect-ratio: 1/1;
padding: 25px;
outline: 2px solid red;
}
.images > img {
grid-area: 1/1;
width: 80%;
aspect-ratio: 1/1;
object-fit: cover;
}
.images > img:nth-child(2) {
place-self: end end;
}
Як створити віртуальну сторінку в WordPress
Спосіб 1
Віртуальна сторінка з власним контентом.
/**
* Створення віртуальних сторінок
*/
if ( ! class_exists( 'mpVirtualPage' ) ) {
class mpVirtualPage {
private $slug = null;
private $title = null;
private $content = null;
private $author = null;
private $date = null;
private $type = null;
private $dategmt = null;
public function __construct( $args ) {
if ( ! isset( $args['slug'] ) )
throw new Exception( 'відсутній ярлик для віртуальної сторінки' );
$this->slug = $args['slug'];
$this->title = isset( $args['title'] ) ? $args['title'] : '';
$this->content = isset( $args['content'] ) ? $args['content'] : '';
$this->author = isset( $args['author'] ) ? $args['author'] : 1;
$this->date = isset( $args['date'] ) ? $args['date'] : current_time( 'mysql' );
$this->dategmt = isset( $args['date'] ) ? $args['date'] : current_time( 'mysql', 1 );
$this->type = isset( $args['type'] ) ? $args['type'] : 'page';
add_filter( 'the_posts', array( &$this, 'virtualPage' ) );
}
public function virtualPage( $posts ) {
global $wp, $wp_query;
if ( count( $posts ) == 0 &&
( strcasecmp( $wp->request, $this->slug ) == 0 ||
$wp->query_vars['page_id'] == $this->slug ) ) {
$post = new stdClass;
$post->ID = -111;
$post->post_author = $this->author;
$post->post_date = $this->date;
$post->post_date_gmt = $this->dategmt;
$post->post_content = $this->content;
$post->post_title = $this->title;
$post->post_excerpt = '';
$post->post_status = 'publish';
$post->comment_status = 'closed';
$post->ping_status = 'closed';
$post->post_password = '';
$post->post_name = $this->slug;
$post->to_ping = '';
$post->pinged = '';
$post->modified = $post->post_date;
$post->modified_gmt = $post->post_date_gmt;
$post->post_content_filtered = '';
$post->post_parent = 0;
$post->guid = get_home_url( '/' . $this->slug );
$post->menu_order = 0;
$post->post_type = $this->type;
$post->post_mime_type = '';
$post->comment_count = 0;
$posts = array( $post );
$wp_query->is_page = true;
$wp_query->is_singular = true;
$wp_query->is_home = false;
$wp_query->is_archive = false;
$wp_query->is_category = false;
unset( $wp_query->query['error'] );
$wp_query->query_vars['error'] = '';
$wp_query->is_404 = false;
}
return ( $posts );
}
}
}
function mp_create_virtual_page() {
$url = trim( parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ), '/' );
$pages = [
[
'url' => 'petrov-virtual-page-1',
'slug' => 'petrov-virtual-page-1',
'title' => 'Це віртуальна сторінка 1',
'content' => "Контент віртуальної сторінки 1 <br> Рядок 2",
'author' => 1,
//'date' => '14:01:2017:15:30:25',
'type' => 'post',
],
[
'url' => 'petrov-virtual-page-2',
'slug' => 'petrov-virtual-page-2',
'title' => 'Це віртуальна сторінка 2',
'content' => "Контент віртуальної сторінки 2 <br> Рядок 2",
'author' => 1,
//'date' => '14:01:2017:15:30:25',
'type' => 'post',
],
[
'url' => 'petrov-virtual-page-3',
'slug' => 'petrov-virtual-page-3',
'title' => 'Це віртуальна сторінка 3',
'content' => "Контент віртуальної сторінки <br> Рядок 2",
'author' => 1,
//'date' => '14:01:2017:15:30:25',
'type' => 'post',
],
];
// перебір першого масиву з ел. 0,1,2...
foreach ( $pages as $page ) {
if ( $url == $page['url'] ) {
$pg = new mpVirtualPage( $page );
}
}
}
add_action( 'init', 'mp_create_virtual_page' );
У коді створюються 3 пости типу Запис з URL-адресами та слагами petrov-virtual-page-1, petrov-virtual-page-2, petrov-virtual-page-3 відповідно.
Спосіб 2
У цьому випадку для створеної віртуальної сторінки буде підставлятися окремий файл-шаблон із контентом.
Нехай потрібно створити сторінку за адресою https://site.com/petrov-virtual-page/.
add_filter( 'generate_rewrite_rules', function ( $wp_rewrite ) {
$wp_rewrite->rules = array_merge(
['petrov-virtual-page/?$' => 'index.php?custom=1'],
$wp_rewrite->rules
);
});
add_filter( 'query_vars', function( $query_vars ) {
$query_vars[] = 'custom';
return $query_vars;
});
add_action( 'template_redirect', function() {
$custom = intval( get_query_var( 'custom' ) );
if ( $custom ) {
include plugin_dir_path( __FILE__ ) . 'templates/template-content.php';
die;
}
});
У рядку include plugin_dir_path( __FILE__ ) . 'templates/custom.php' підставляється шаблон із контентом, який буде виводитися на сторінці. У файлі custom.php можете додати звичайний HTML-код або вивести дані через конструкції типу echo.
Оскільки будь-яка інформація про віртуальні сторінки для WordPress-середовища відсутня, вони не підтримуються СЕО-плагінами. А тому мета-теги за допомогою Yoast чи All In One SEO задати не вийде.
Віртуальні сторінки зручно використовувати, наприклад, для RSS-фідів або генерації інших XML-даних.
Як визначити мову сторінки в CSS
Для цього можна скористатись псевдокласом :lang(), який вибирає елементи, ґрунтуючись на мові сторінки, яка задана у тегові <html>:
<!-- Варіант 1 -->
<html lang="en">
<!-- Варіант 2 -->
<html lang="en-US">
<!-- Варіант 3 -->
<html lang="en_US">
Наприклад, потрібно на багатомовному сайті для всіх його україномовних сторінок змінити колір для тега <header>:
header:lang(uk) {
background-color: red;
}
Код підходить для усіх позначень локалі:
<html lang="uk">
<html lang="uk-UA">
<html lang="uk_UA">
Якщо потрібно для окремих мов сторінок сайту задавати різні CSS-властивості:
header:lang(uk) {
background-color: red;
}
header:lang(en) {
background-color: green;
}
Як у WordPress передати переклад рядків із PHP в JavaScript
Проблема виникає тоді, коли потрібно в коді JavaScript отримати та відобразити текстовий рядок відповідно до мови WordPress сайту (локалі).
Нехай десь у коді WordPress-теми зустрічаються текстові рядки "Title" та "Description", для яких у файлах локалізації (.po та .mo) вказані відповідні переклади.
Припустимо, що ресурс доступний 2-ма мовами — англійською та українською. Якщо відвідувач сайту обере українську мову, то повинен побачити перекладений текст цих рядків ("Назва" та "Опис" відповідно). У WordPress є вбудовані інструменти для автоматичного відображення вказаного рядка відповідно до мови (локалі) сайту. Зазвичай у коді тем та плагінів можна побачити наступний код
esc_html_e( 'Title', 'text-domain' );
esc_html_e( 'Description', 'text-domain' );
Але що робити якщо перекладену текстову фразу потрібно відобразити у коді JavaScript? Наприклад, змінити текст повідомлення форми про невірно введену адресу email відповідно до локалізації (мови) сайту. Може статися так, що розробнику не вдалося знайти та отримати доступ до цього рядка через PHP (наприклад, за допомогою хука). А тому він може спробувати це зробити через JavaScript.
Розгляну на прикладі WordPress-теми. Нехай у файлі functions.php активної теми під'єднується JavaScript-файл frontend-script.js, у якому повинен відображатися переклад того чи іншого рядка.
if ( ! function_exists( 'theme_scripts' ) ) {
add_action( 'wp_enqueue_scripts', 'theme_scripts' );
function theme_scripts() {
wp_enqueue_script( 'frontend-script', get_template_directory_uri() . '/assets/js/frontend-script.js', array(), '1.0.0', true );
wp_localize_script(
'frontend-script',
'frontend_script_object',
array(
'title' => esc_html__( 'Title', 'text-domain' ),
'description' => esc_html__( 'Description', 'text-domain' ),
)
);
}
}
Передачу рядка можна забезпечити за допомогою функції wp_localize_script(). Перший її параметр — назва (дескриптор) скрипта, якому буде передаватися переклад. Цей скрипт повинен бути зареєстрований перед викликом wp_localize_script(). У другому параметрі вказується унікальна назва об'єкту, що буде містити дані перекладу. Третій параметр функції — це власне масив рядків з перекладом. Ключем є унікальна назва рядка, значенням — переклад.
Щоб перевірити чи передалися переклади, у файлі frontend-script.js можна використати код
console.log(frontend_script_object.title);
console.log(frontend_script_object.description);
У коді через рядок frontend_script_object відбувається звернення до об’єкту з перекладами. Значення після крапки — елемент масиву, який відповідає конкретному рядку.
Функція
wp_localize_script(), згідно офіційної специфікації, призначена виключно для передачі локалізованих (перекладених) рядків із PHP у JavaScript. Але часто з її допомогою передають й інші дані. Це зв’язано з тим, що спочатку це був єдиний офіційний спосіб. Але, починаючи із WordPress 4.5.0, була представлена окрема функціяwp_add_inline_script(). Саме вона тепер є найкращою практикою для передачі даних із PHP у JavaScript.
Як відновити пароль у WordPress
Відновлення пароля через сторінку входу
Це найпростіший спосіб.
- У браузері відкрийте сторінку https://site.com/wp-login.php, де замість site.com вставте назву домену сайту.
- Під формою клацніть на посиланні Втратили свій пароль?.
- У новому вікні, у формі, впишіть ім'я користувача або його email-адресу та натисніть кнопку Отримати новий пароль. Система надішле електронний лист.
- У тексті листа перейдіть за посиланням, яке виглядає приблизно так:
https://site.com/wp-login.php?action=rp&key=faFjO1M1IX01ns6Rpf7y&login=admin&wp_lang=uk
Рядок login=admin означає, що пароль відновлюватиметься для користувача admin.
- У новому вікні задайте новий пароль та натисніть Зберегти пароль.
Якщо все пройшло успішно, ви побачите повідомлення "Ваш пароль скинуто". Тепер для входу використовуйте новий пароль.
Відновлення пароля за допомогою SQL-запиту до бази даних
Спосіб передбачає можливість доступу до бази даних WordPress-сайту. Зазвичай у панелі керування більшості хостингів є безкоштовна утиліта phpMyAdmin для зручної роботи із базами даних.
Для заміни пароля використайте невеликий SQL-запит, описаний у статті Корисні SQL запити для WordPress.
Відновлення пароля через файл functions.php
Метод передбачає можливість вносити зміни у файл functions.php, який знаходиться в активній темі на сайті WordPress.
Найпростіше отримати доступ до файлу — через файловий менеджер у панелі керування хостингом або FTP-клієнт.
Щоб змінити пароль, виконайте наступні дії.
- В кінці файлу функцій додайте код
wp_set_password( 'password', 1 );
Пароль буде змінено на password для користувача, який був створений при встановленні копії WordPress. За замовчуванням цей користувач має повний доступ до сайту, тобто є адміністратором.
- У браузері відкрийте будь-яку сторінку сайту, на якому потрібно відновити пароль. Якщо сайт вже відкритий, то оновіть сторінку за допомогою комбінації клавіш
[Ctrl]+[F5]. - Одразу видаліть або закоментуйте доданий вище рядок.
- На сторінці входу (зазвичай це https://site.com/wp-login.php) введіть ім'я користувача (адміністратора) та пароль
password. - Після входу в адмін-панель сайту перейдіть в адмін-меню Користувачі -> Обліковий запис та замініть пароль на довший та складніший.
Відновлення пароля через створення нового файлу
Спосіб передбачає наявність доступу до файлів сайту на сервері хостингу, а також потрібно точно знати ім'я користувача. Тут також зручно скористатися файловим менеджером панелі хостингу або клієнтом FTP.
- У кореневому каталозі вашого WordPress-сайту створіть файл password-reset.php із вмістом
<?php
require 'wp-load.php';
$user = get_user_by( 'login', 'username' );
if ( $user ) {
wp_set_password( 'new-password', $user->ID );
echo 'Новий пароль встановлено!';
} else {
echo 'Помилка: вказаний користувач не знайдений!';
}
У коді username та new-password замініть на ім'я користувача, пароль якого потрібно відновити, та вкажіть новий пароль для нього відповідно.
Файл password-reset.php повинен розміщуватися на одному рівні з папками wp-admin та wp-includes.
- У браузері перейдіть за адресою
https://site.com/password-reset.php
Код просканує базу даних сайту на предмет наявності вказаного імені користувача. Якщо користувач знайдений, то для нього буде змінений пароль на new-password. На екрані побачите повідомлення "Новий пароль встановлено!".
В іншому випадку — "Помилка: вказаний користувач не знайдений!". У такому разі перевірте чи вірно вказали ім'я користувача.
- На сторінці входу (зазвичай це https://site.com/wp-login.php) введіть ім'я користувача та новий пароль.
- Після успішного в ходу в систему видаліть файл password-reset.php.
- В адмін-меню Користувачі -> Обліковий запис замініть пароль на довший та складніший.
Повернути назад кириличні слаги WordPress після вимкнення плагінів транслітерації типу Cyr-To-Lat
/** Для сторінок/записів */
$posts = $wpdb->get_results( "SELECT ID, post_title, post_name FROM {$wpdb->posts} WHERE post_status = 'publish'" );
foreach ( (array) $posts as $post ) {
$orig_post_slugs = sanitize_title( $post->post_title );
$wpdb->update( $wpdb->posts, array( 'post_name' => $orig_post_slugs ), array( 'ID' => $post->ID ) );
}
/** Для рубрик/тегів */
$terms = $wpdb->get_results( "SELECT term_id, name, slug FROM {$wpdb->terms}" );
foreach ( (array) $terms as $term ) {
$orig_term_slugs = sanitize_title( $term->name );
$wpdb->update( $wpdb->terms, array( 'slug' => $orig_term_slugs ), array( 'term_id' => $term->term_id ) );
}
Автоматичне пересилання даних із WordPress-форм у Telegram
/**
* CF7 to Telegram
*
* https://t.me/mihdan_vent/3734
*
*/
const TELEGRAM_BOT_TOKEN = '6256497441:AAGv_5_iMSwLGGBih59l4GTNmB0CvaOpsF4';
const TELEGRAM_RECEIVERS = '278845427';
class MP_CF7_To_Telegram {
private $args;
public function __construct() {
$this->args = [
'bot_token' => TELEGRAM_BOT_TOKEN,
'receivers' => [
TELEGRAM_RECEIVERS,
],
];
}
public function mp_init_hooks() {
add_filter( 'wpcf7_mail_components', [ $this, 'mp_to_tlg_action' ], 10, 3 );
}
public function mp_to_tlg_send_message( $message, $receiver ) {
$params['text'] = wp_strip_all_tags( $message );
$params['chat_id'] = (int) $receiver;
$apiUrl = sprintf(
'https://api.telegram.org/bot%s/sendMessage?%s',
$this->args['bot_token'],
http_build_query( $params )
);
$response = wp_remote_get( $apiUrl );
if ( is_wp_error( $response ) ) {
error_log( 'Error in CF7 to Telegram: ' . $response );
} else {
$responseBody = json_decode( wp_remote_retrieve_body( $response ), true );
if ( ! $responseBody['ok'] ) {
error_log( 'Error in CF7 to Telegram: ' . json_encode( $responseBody ) );
}
}
}
public function mp_to_tlg_action( $components, $form, $instance ) {
foreach ( $this->args['receivers'] as $receiver ) {
$this->mp_to_tlg_send_message( $components['body'], $receiver );
}
return $components;
}
}
( new MP_CF7_To_Telegram() )->mp_init_hooks();
Заготовка Табів на HTML + CSS
.tabs input[type="radio"] {
display: none;
}
.tabs .tab-content {
display: none;
}
.tabs #tab-1:checked ~ #tab-content-1,
.tabs #tab-2:checked ~ #tab-content-2,
.tabs #tab-3:checked ~ #tab-content-3 {
display: block;
}
.tabs input[type="radio"]:checked + label {
font-weight: bold;
text-decoration: underline;
}
.tabs label:hover {
cursor: pointer;
}
<div class="tabs">
<input type="radio" id="tab-1" name="tab-group" checked>
<label for="tab-1">Таб 1</label>
<input type="radio" id="tab-2" name="tab-group">
<label for="tab-2">Таб 2</label>
<input type="radio" id="tab-3" name="tab-group">
<label for="tab-3">Таб 3</label>
<div id="tab-content-1" class="tab-content">Контент першої вкладки</div>
<div id="tab-content-2" class="tab-content">Контент другої вкладки</div>
<div id="tab-content-3" class="tab-content">Контент третьої вкладки</div>
</div>
Як у WordPress програмно додати у кінець меню свій елемент
/**
* Варіант 1
*
* Тут ID_меню - унікальний ідентифікатор локації, який створюється
* через register_nav_menus().
*/
add_filter( 'wp_nav_menu_items', function( $items, $args ) {
if ( $args->theme_location == 'ID_меню' ) {
$items .= '<li>СЮДИ ДОДАВАЙТЕ ДАНІ ДЛЯ ВИВЕДЕННЯ</li>';
}
return $items;
}, 10, 2 );
/**
* Варіант 2
*
* Додання пункту меню через клас $args->menu_class, який повинен
* однозначно визначати меню та знаходитися у тезі <ul>.
*/
add_filter( 'wp_nav_menu_items', function( $items, $args ) {
if ( $args->menu_class == 'клас_або_класи_через_пробіл' ) {
$items .= '<li>СЮДИ ДОДАВАЙТЕ ДАНІ ДЛЯ ВИВЕДЕННЯ</li>';
}
return $items;
}, 10, 2 );
Як змінити колір атрибуту placeholder у тегові input [CSS]
<input type="text" placeholder="Placeholder text...">
input[type="text"]::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */
color: blue;
opacity: 1; /* Firefox */
}
input[type="text"]:-ms-input-placeholder { /* Internet Explorer 10-11 */
color: blue;
}
input[type="text"]::-ms-input-placeholder { /* Microsoft Edge */
color: blue;
}
input[type="text"]::-webkit-input-placeholder {
color: blue;
}
input[type="text"]::-moz-placeholder {
color: blue;
}
Як обрізати текст у CSS [CSS]
Обрізання тексту для одного рядка
<div class="container">
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Maxime optio, explicabo maiores enim odio ab cupiditate sit consequuntur, dolore quas voluptatibus sed iusto necessitatibus at reprehenderit veniam magni aliquam cumque.</p>
</div>
.container {
width: 200px;
outline: 1px solid red;
}
p {
width: 150px;
/* Обрізання тексту */
white-space: nowrap; /* текст в один рядок */
overflow: hidden; /* приховує все, що виходить за зону контейнера */
text-overflow: ellipsis; /* замінює прихований текст на трикрапку */
}
Обрізання тексту для блоку з декількома рядками
.container {
width: 400px;
outline: 1px solid red;
}
p {
width: 400px;
/* Обрізання тексту */
line-height: 2rem;
max-height: 8rem;
-webkit-box-orient: vertical;
display: block;
display: -webkit-box;
overflow: hidden!important;
text-overflow: ellipsis;
-webkit-line-clamp: 4;
}
Як стилізувати лише посилання без класу [CSS]
<a class="top-menu__item" href="#">Page 1</a>
<a class="footer-menu__item" href="#">Page 2</a>
<a href="#">Page 3</a>
.top-menu__item {
color: red;
font-size: 16px;
}
.footer-menu__item {
color: black;
font-size: 25px;
}
/* Посилання без класу */
a:not([class]) {
color: green;
font-size: 45px;
}
Чому слід уникати post__not_in у користувацьких запитах WP_Query
Аргумент WP_Query post__not_in здається корисною опцією, але він може призвести до низької продуктивності на завантаженому та/або великому сайті через вплив на частоту потрапляння у кеш.
Зазвичай він використовується для виключення певних ідентифікаторів (ID) постів (записів) з результатів запиту. Наприклад, є віджет, який показує останні 5 публікацій на кожній сторінці, але у ньому потрібно виключити із виведення на екран поточну публікацію.
Вивести 5 останніх постів можна за допомогою коду
// Display the most recent news posts
function my_recent_news_widget() {
$args = array(
'category_name' => 'news',
'posts_per_page' => 5,
'post_status' => 'publish',
'ignore_sticky_posts' => true,
'no_found_rows' => true,
);
$recent_posts = new WP_Query( $args );
echo '<div class="most-recent-news"><h1>News</h1>';
while ( $recent_posts->have_posts() ) {
$recent_posts->the_post();
the_title( '<h2><a href="' . get_permalink() . '">', '</a></h2>');
}
echo '</div>';
wp_reset_postdata();
}
Типовий підхід до вирішення задачі виключення із виводу на екран поточної публікації — модифікувати цю функцію, додавши необов'язковий аргумент функції та параметр запиту post__not_in:
// Display the most recent news posts (but not the current one)
function my_recent_news_widget( $exclude = array() ) {
$args = array(
'category_name' => 'news',
'posts_per_page' => 5,
'post_status' => 'publish',
'ignore_sticky_posts' => true,
'no_found_rows' => true,
'post__not_in' => $exclude,
);
$recent_posts = new WP_Query( $args );
echo '<div class="most-recent-news"><h1>News</h1>';
while ( $recent_posts->have_posts() ) {
$recent_posts->the_post();
the_title( '<h2><a href="' . get_permalink() . '">', '</a></h2>');
}
echo '</div>';
wp_reset_postdata();
}
Цю функцію можна викликати десь у файлі-шаблоні WordPress-теми:
<?php my_recent_news_widget( [ get_the_ID() ] ); ?>
В результаті будуть виведені останні 5 публікацій, за винятком поточної (тієї, що переглядається відвідувачем сайту у цей момент). Так, цей спосіб повністю вирішує задачу, але є не зовсім коректним у відношенні продуктивності. І ось чому.
В чому проблема post__not_in
Запит, який раніше використовував вбудований кеш запитів, тепер є унікальним для кожного допису або сторінки завдяки доданому AND ID not in ( '12345' ). Це пов'язано з тим, що ключ кешу (хеш аргументів) тепер включає список принаймні одного ідентифікатора, який є різним для всіх дописів. Таким чином, замість того, щоб наступні сторінки отримували список із 5 дописів із кешу об'єкта, він буде пропущений кешем, і база даних виконає ту ж роботу на декількох сторінках.
В результаті кожен з цих запитів тепер кешується окремо, невиправдано збільшуючи використання Memcached. Для сайту з сотнями тисяч публікацій це потенційно може вплинути на розмір об'єктного кешу і призвести до передчасного видалення (очищення) кешу.
Це по суті ламає ідею кешування, тому що так як запит унікальний, то і кеш буде унікальним для кожного запиту. В результаті, замість того, щоб отримати останні пости з кешу, виконається повноцінний запит на сервер та нова вибірка цих постів із бази даних.
Який вихід
Майже у всіх випадках досягти значного покращення швидкості можливо, обираючи більше записів і пропускаючи виключені із запиту.
Ви можете підвищити продуктивність, переконавшись, що запит публікацій є узгодженим для всіх URL-адрес, і що він отримує останні 6 дописів з об'єктного кешу. Якщо ви очікуєте, що список $exclude буде більшим, ніж один пост, встановіть більший ліміт, наприклад, 10. Зробіть це число фіксованим, а не змінним, щоб зменшити кількість варіантів кешу.
Оновлена функція більше не виключає публікації в SQL через post__not_in, а використовує умови в циклі:
// Display the most recent news posts (but not the current one)
function my_recent_news_widget( $exclude = array() ) {
$args = array(
'category_name' => 'news',
'posts_per_page' => 10,
'post_status' => 'publish',
'ignore_sticky_posts' => true,
'no_found_rows' => true,
);
$recent_posts = new WP_Query( $args );
echo '<div class="most-recent-news"><h1>News</h1>';
$posts = 0; // count the posts displayed, up to 5
while ( $recent_posts->have_posts() && $posts < 5 ) {
$recent_posts->the_post();
$current = get_the_ID();
if ( ! in_array( $current, $exclude ) ) {
$posts++;
the_title( '<h2><a href="' . get_permalink() . '">', '</a></h2>');
}
}
echo '</div>';
wp_reset_postdata();
}
Ще один приклад:
$exclude_id = get_the_ID();
$args = array(
'posts_per_page' => 11,
'post_status' => 'publish'
);
$recent_posts = new WP_Query( $args );
echo '<h2>Recent posts</h2>';
while( $recent_posts->have_posts() && $count < 10 ) : $recent_posts->the_post();
if ( $recent_posts->post->ID === $exclude_id ) {
continue; // skip the loop iteration if it is an excluded post
}
the_title( '<h3><a href="' . get_permalink() . '">', '</a></h3>' );
$count++;
endwhile;
wp_reset_postdata();
Хоча цей підхід вимагає трохи логіки в PHP, він краще використовує кеш запитів і дозволяє уникнути створення багатьох варіантів кешу, які можуть вплинути на масштабованість і стабільність сайту.
Як вимкнути плагіни WordPress без доступу до адмін-панелі
Спосіб 1. Через файловий менеджер хостингу
Перейменуйте каталог plugins. Можна просто додати цифру на початку або символ підкреслення. Наприклад, 0plugins чи _plugins.
Спосіб 2. Через FTP (FileZilla або інший клієнт)
Під'єднайтесь до сервера хостингу за допомогою FTP-клієнта (наприклад, FileZilla) та перейменуйте каталог /wp-content/plugins.
Спосіб 3. Через базу даних PhpMyAdmin
- Перейдіть до бази даних свого сайту
- Знайдіть та відкрийте таблицю
wp_options. - У таблиці знайдіть поле із назвою
active_plugins. - У комірці праворуч від неї натисніть 2 рази і замініть значення на
a:0:{}.
Спосіб 4. Через SQL-запит
UPDATE wp_options SET option_value = '' WHERE option_name = 'active_plugins'
