• DONATE to NULLED!
    Вы можете помочь Форуму и команде, поддержать финансово.
    starwanderer - модератор этого раздела будет Вам благодарен!

Информация Настройка, оптимизиция и допиливание wordpress

Костюшка

Постоялец
Регистрация
22 Июн 2017
Сообщения
111
Реакции
110
В данном разделе обсуждается все, что касается модификации, усовершенствование и оптимизации CMS WordPress-а.

Отключение автоматического создания картинок при загрузке через медиатеку
При загрузке картинке через встроенный меда загрузчик (медиафайлы) по-умолчанию wordpress создает аж 4 копии загружаемой картинки разного размера, что писец как не круто, особенно когда это не нужно.

upload_2020-2-18_14-0-5.png

Что можно сделать, а делаем следующие можно отключить данную опцию в админке.

upload_2020-2-18_14-5-9.png
Но бывает, что в шаблоне прописаны свои размеры и генерация картинок происходит все равно, тогда в футоре вставляем следующий код для того чтобы узнать какие размеры зарегистрированы в системе.

Код для вставки в footer:

PHP:
<?
function get_image_sizes( $unset_disabled = true ) {
    $wais = & $GLOBALS['_wp_additional_image_sizes'];

    $sizes = array();

    foreach ( get_intermediate_image_sizes() as $_size ) {
        if ( in_array( $_size, array('thumbnail', 'medium', 'medium_large', 'large') ) ) {
            $sizes[ $_size ] = array(
                'width'  => get_option( "{$_size}_size_w" ),
                'height' => get_option( "{$_size}_size_h" ),
                'crop'   => (bool) get_option( "{$_size}_crop" ),
            );
        }
        elseif ( isset( $wais[$_size] ) ) {
            $sizes[ $_size ] = array(
                'width'  => $wais[ $_size ]['width'],
                'height' => $wais[ $_size ]['height'],
                'crop'   => $wais[ $_size ]['crop'],
            );
        }

        // size registered, but has 0 width and height
        if( $unset_disabled && ($sizes[ $_size ]['width'] == 0) && ($sizes[ $_size ]['height'] == 0) )
            unset( $sizes[ $_size ] );
    }

    return $sizes;
}

die( print_r( get_image_sizes() ) );
?>
(после того как получите названия зарегистрированных размеров вышеуказанный код удалить)


Код вернет ответ вот такого вида:
PHP:
Array
(
    [thumbnail] => Array
        (
            [width] => 150
            [height] => 150
            [crop] => 1
        )

    [medium] => Array
        (
            [width] => 250
            [height] => 250
            [crop] =>
        )

    [medium_large] => Array
        (
            [width] => 768
            [height] => 0
            [crop] =>
        )

    [large] => Array
        (
            [width] => 350
            [height] => 350
            [crop] =>
        )
)
Отсюда нам нужны те размеры, что хотим удалить ну допустим (medium, medium_large, large).

ВНИМАНИЕ: Размер thumbnail (миниатюра) нужно оставить, этот размер нужен при создании стандартной галереи и в превью загруженных файлов в админ-панели.
Если уберете, то ст. галерея не будет работать нормально, медиатека будет грузить оригиналы файлови тормозить админку.


Далее вставляем код указанный ниже в functions.php
PHP:
add_filter( 'intermediate_image_sizes', 'delete_intermediate_image_sizes' );
function delete_intermediate_image_sizes( $sizes ){
    // размеры которые хотим удалить
    return array_diff( $sizes, array(
        'medium',
        'medium_large',
        'large'
    ) );
}
В итоге на выходе вы получите 2 файла пример: img.jpg и img-150x150.jpg вместо 4 копий и оригинала картинки то есть вместо 5 файлов 2, что есть круто!

Автоматически заполняем атрибут title на основе заголовка изображения при его вставки в контент поста.

upload_2020-2-18_14-39-34.png

Для этого необходимо вставить следующий код в functions.php
PHP:
function lcb_restore_image_title( $html, $id ) {

    $attachment = get_post($id);
    if (strpos($html, "title=")) {
        return $html;
        }
    else {
        $mytitle = esc_attr($attachment->post_title);
        return str_replace('<img', '<img title="' . $mytitle . '" '  , $html);
}
}
add_filter( 'media_send_to_editor', 'lcb_restore_image_title', 15, 2 );

function lcb_restore_title_to_gallery( $content, $id ) {
    $thumb_title = get_the_title($id);
    return str_replace('<a', '<a title="' . esc_attr($thumb_title) . '" ', $content);
}
add_filter('wp_get_attachment_link', 'lcb_restore_title_to_gallery', 10, 4);
На выходе получите автоматическое добавление title при вставке картинки в статье или посте:

upload_2020-2-18_14-41-14.png

Заполняет поле для атрибута alt на основе заголовка изображения при его вставки в контент поста.

upload_2020-2-18_14-49-20.png

Для этого необходимо вставить следующий код в functions.php
PHP:
function change_empty_alt_to_title( $response ) {
    if ( ! $response['alt'] ) {
        $response['alt'] = sanitize_text_field( $response['title'] );
    }

    return $response;
}
add_filter( 'wp_prepare_attachment_for_js', 'change_empty_alt_to_title' );
На выходе получите автоматическое добавление title при вставке картинки в статье или посте:

upload_2020-2-18_14-49-58.png

Удаление авто-добавления тегов P и BR

У Wordpress есть такая дебильная штука добавлять теги br и p где то удобно но в большинстве случаев они мешают, вот классное решение.

Для этого необходимо вставить следующий код в functions.php
PHP:
remove_filter( 'the_content', 'wpautop' );// для контента
remove_filter( 'the_excerpt', 'wpautop' );// для анонсов
remove_filter( 'comment_text', 'wpautop' );// для комментарий
Авто обновление ядра/тем/плагинов/перевода

параметр __return_true - включает автоматическое обнавление

параметр __return_false - отключает автоматическое обнавление

Для этого необходимо вставить следующий код в functions.php
PHP:
// Обновления ядра (движка)
add_filter('auto_update_core', '__return_true');
// Авто-обновление минорных версий (версии внутри ветки)
add_filter( 'allow_minor_auto_core_updates', '__return_true' );
//  Авто-обновление мажорных версий (версии между ветками)
add_filter( 'allow_major_auto_core_updates', '__return_true' );
// Авто-обновление версий разработчиков
add_filter( 'allow_dev_auto_core_updates', '__return_true' );
// Включение авто-обновлений для всех плагинов
add_filter( 'auto_update_plugin', '__return_true' );
// Включение авто-обновлений для всех тем
add_filter( 'auto_update_theme', '__return_true' );
// Включение авто-обновлений всех  файлов перевода
add_filter( 'auto_update_translation', '__return_true' );
Удаление файлов license.txt, readme.html и т.д. по списку

При установке WP создаются txt и html файлы которые могу дать злоумышленнику информацию
о версии WP, плагине, что может помочь быстро выявить уязвимость и т.д. да и вообще меньше знает крепче спит)

Список можно дополнить, если есть необходимость, данный скрипт при заде в админку удалит файлы если они существуют на автомате.

Для этого необходимо вставить следующий код в functions.php
PHP:
if( is_admin() && ! defined('DOING_AJAX') ){
    $license_file = ABSPATH .'/license.txt';
    $readme_file = ABSPATH .'/readme.html';
    $imglicense_file = ABSPATH .'/wp-includes/images/crystal/license.txt';
    $pllicense_file = ABSPATH .'/wp-includes/js/plupload/license.txt';
    $tinlicense_file = ABSPATH .'/wp-includes/js/tinymce/license.txt';
    $swlicense_file = ABSPATH .'/wp-includes/js/swfupload/license.txt';
    $idlicense_file = ABSPATH .'/wp-includes/ID3/license.txt';
    $idreadme_file = ABSPATH .'/wp-includes/ID3/readme.txt';
    $idcommercial_file = ABSPATH .'/wp-includes/ID3/license.commercial.txt';


    if( file_exists($license_file) && current_user_can('manage_options') ){
        $deleted = unlink($license_file) && unlink($readme_file) && unlink($imglicense_file) && unlink($pllicense_file) && unlink($tinlicense_file) && unlink($swlicense_file) && unlink($idlicense_file) && unlink($idreadme_file) && unlink($idcommercial_file);

        if( ! $deleted  )
            $GLOBALS['readmedel'] = 'Не удалось удалить файлы: license.txt и readme.html из папки `'. ABSPATH .'`. Удалите их вручную!';
        else
            $GLOBALS['readmedel'] = 'Файлы: license.txt и readme.html удалены из из папки `'. ABSPATH .'`.';

        add_action( 'admin_notices', function(){  echo '<div class="error is-dismissible"><p>'. $GLOBALS['readmedel'] .'</p></div>'; } );
    }
}
Удаляем логин админа в стилях «comment-author-» при коментариях от администратора

При коментариях от учетки админа, в html палится админская учетка в стилях «comment-author-» , что упростит работы для любителей брута так как админку они узнают и останется сбрутить пароль.

Для этого необходимо вставить следующий код в functions.php
PHP:
function remove_comment_author_class( $classes ) {
foreach( $classes as $key => $class ) {
if(strstr($class, "comment-author-")) {
unset( $classes[$key] );
}
}
return $classes;
}
add_filter( 'comment_class' , 'remove_comment_author_class' );
Редирект с запроса ?author на главную

Скрытие логина админа через запрос ?author
В скрипте нужно указать небходимое количество учеток ?author=1, ?author=2 и т.д.

Для этого необходимо вставить следующий код в functions.php
PHP:
function redirect_author_page() {
    $page_viewed = basename($_SERVER['REQUEST_URI']);

    if( $page_viewed == "?author=1" || $page_viewed == "?author=2" || $page_viewed == "?author=3" || $page_viewed == "?author=4" || $page_viewed == "?author=5") {
        wp_redirect( '/' );
        exit;
    }
}
add_action('init','redirect_author_page');
Пилим .htaccess

вставляем полсе # END WordPress


RedirectMatch Permanent ^/author/
RedirectMatch Permanent ^/feed/ запрещаем фиды если не используем RSS

# Модифицируем .htaccess против MySQL-инъекций и других хаков

RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC]
RewriteRule ^(.*)$ - [F,L]
RewriteCond %{REQUEST_URI} (timthumb\.php|phpthumb\.php|thumb\.php|thumbs\.php) [NC]
RewriteRule . - [S=1]
RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (;|<|>|'|"|\)|\(|%0A|%0D|%22|%27|%28|%3C|%3E|%00).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]
RewriteCond %{THE_REQUEST} \?\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} \/\*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} etc/passwd [NC,OR]
RewriteCond %{THE_REQUEST} cgi-bin [NC,OR]
RewriteCond %{THE_REQUEST} (%0A|%0D) [NC,OR]

# Закрываем доступ к файлам

<files wp-config.php>
order allow,deny
deny from all
</files>

<Files wp-config-sample.php>
Order deny,allow
Deny from all
</Files>


<FilesMatch "xmlrpc.php">
Order Deny,Allow
Deny from all
</FilesMatch>

Двойная авторизация

Так как при бруте бот делает кучу обращений к файлу wp-login.php что грузит саму cms, может вызвать нагрузку на сервер после чего хостер заблочит сайт ну или в конце концов могут сбрутить пароль от сайта. Данный скрипт не дает обратится к файлу wp-login.php пока не авторизуются через данный скрипт, очь крутая штука!



вставляем полсе в .htaccess после # END WordPress

<Files wp-login.php>
AuthName "Access Denied"
AuthType Basic
AuthUserFile /home/c/test/website/public_html/.htpasswd //абсолютный путь к файлу .htpasswd
require valid-user
</Files>
# END WordPress


Создаем в корне сайта файл с именем .htpasswd в той же папке, где и файл .htaccess и потом в .htpasswd добавляем строку

пример:

admin:$aepr1$f3dVaHch40$ZvIWhiYS0MngH7NJ14wyK0 //пароль сгенерировать нужно свой

для генерации закодированного пароля Для просмотра ссылки Войди или Зарегистрируйся


Если не знаете абсолютного пути то можно вот такой штукой воспользоваться
в корне сайта создаем файл test.php и добаляем туда код:
PHP:
<?php
echo $_SERVER['DOCUMENT_ROOT'];
?>
Функция для вставки PHP кода в тело статьи

В теле статьи вот в [exec] таких тегах [/exec] можно вставить любой PHP скрипт

Для этого необходимо вставить следующий код в functions.php
PHP:
function exec_php($matches){
    eval('ob_start();'.$matches[1].'$inline_execute_output = ob_get_contents();ob_end_clean();');
    return $inline_execute_output;
}
function inline_php($content){
    $content = preg_replace_callback('/\[exec\]((.|\n)*?)\[\/exec\]/', 'exec_php', $content);
    $content = preg_replace('/\[exec off\]((.|\n)*?)\[\/exec\]/', '$1', $content);
    return $content;
}
add_filter('the_content', 'inline_php', 0);

Если любите плагины то есть замечателный плагин Для просмотра ссылки Войди или Зарегистрируйся он может многое из данного списка и есть еще свои хорошие фишки.
 
Последнее редактирование:
Удаление всех мета генераторов

сms wordpress и установленные плагины создают мета генераторы, если нажать сочетание клавиш на своем сайте Ctrl + U то модно увидеть тэги такого вида <meta name="generator" content="Powered by WPBakery Page Builder - drag and drop page builder for WordPress."/> что ну очень не хорошо касаемо темы защиты, так вот чтобы такого не было привожу ниже код отключающий вывод мета генерации.

Для этого необходимо вставить следующий код в functions.php
PHP:
function remove_meta_generators($html) {
$pattern = '/<meta name(.*)=(.*)"generator"(.*)>/i';
$html = preg_replace($pattern, '', $html);
return $html; }
function clean_meta_generators($html) {
ob_start('remove_meta_generators'); }
add_action('get_header', 'clean_meta_generators', 100);
add_action('wp_footer', function(){ ob_end_flush(); }, 100);

Полное отключение RSS

Для этого необходимо вставить следующий код в functions.php
PHP:
function fb_disable_feed() {
wp_die( __('No feed available,please visit our <a href="'. get_bloginfo('url') .'">homepage</a>!') );
}
add_action('do_feed', 'fb_disable_feed', 1);
add_action('do_feed_rdf', 'fb_disable_feed', 1);
add_action('do_feed_rss', 'fb_disable_feed', 1);
add_action('do_feed_rss2', 'fb_disable_feed', 1);
add_action('do_feed_atom', 'fb_disable_feed', 1);

Убрать версию WordPress из шапки и rss-лент:

Проверить можно так добавить в url к своему сайту /feed/
и там будет такая штука <generator>Для просмотра ссылки Войди или Зарегистрируйся
приведенный ниже код уберет данное недоразумение )
ну или если не нужно вовсе RSS то можно использовать код выше Полное отключение RSS

Для этого необходимо вставить следующий код в functions.php
PHP:
function complete_version_removal() {
return '';
}
add_filter('the_generator', 'complete_version_removal');

Отключаем REST API

Для этого необходимо вставить следующий код в functions.php
PHP:
add_filter('rest_enabled', '__return_false');
remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
remove_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );
remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
remove_action( 'auth_cookie_malformed', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_expired', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_bad_username', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_bad_hash', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_valid', 'rest_cookie_collect_status' );
remove_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );
remove_action( 'init', 'rest_api_init' );
remove_action( 'rest_api_init', 'rest_api_default_filters', 10, 1 );
remove_action( 'parse_request', 'rest_api_loaded' );
remove_action( 'rest_api_init', 'wp_oembed_register_route' );
remove_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );

remove_action( 'rest_api_init', 'wp_oembed_register_route');
remove_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );
remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'xmlrpc_rsd_apis', 'rest_output_rsd' );
remove_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );
remove_action( 'template_redirect', 'rest_output_link_header', 11, 0 );
remove_action( 'auth_cookie_malformed', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_expired', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_bad_username', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_bad_hash', 'rest_cookie_collect_status' );
remove_action( 'auth_cookie_valid', 'rest_cookie_collect_status' );
remove_filter( 'rest_authentication_errors', 'rest_cookie_check_errors', 100 );

Отключение emojii

Для этого необходимо вставить следующий код в functions.php

PHP:
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
remove_action( 'admin_print_styles', 'print_emoji_styles' );
remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
add_filter( 'tiny_mce_plugins', 'disable_wp_emojis_in_tinymce' );
function disable_wp_emojis_in_tinymce( $plugins ) {
if ( is_array( $plugins ) ) {
return array_diff( $plugins, array( 'wpemoji' ) );
} else {
return array();
}
Отключение генерации всяких ненужных мета тэгов

Может подойти не всем, смотрим, что нужно оставляем.

Для этого необходимо вставить следующий код в functions.php

PHP:
remove_action( 'wp_head', 'wp_generator');
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'previous_post_rel_link', 10, 0);
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', '_ak_framework_meta_tags');

Автоматическое создание ROBOTS.TXT


Для этого необходимо вставить следующий код в functions.php

PHP:
add_action( 'do_robotstxt', 'my_robotstxt' );
function my_robotstxt(){
$protocol = (!empty($_SERVER['HTTPS']) && 'off' !== strtolower($_SERVER['HTTPS'])?"https://":"http://");

    $lines = [
        'User-agent: Yandex',
        'Disallow: /wp-admin',
        'Disallow: /wp-includes',
        'Disallow: /wp-content/plugins',
        'Disallow: /wp-json/',
        'Disallow: /wp-login.php',
        'Disallow: /wp-register.php',
        'Disallow: */embed',
        'Disallow: */page/',
        'Disallow: /cgi-bin',
        'Disallow: *?s=',
        'Allow: /wp-admin/admin-ajax.php',
        '',
        'Host: '.$protocol.$_SERVER['SERVER_NAME'], //автоматом поставляет домен
        '',
        'User-agent: *',
        'Disallow: /wp-admin',
        'Disallow: /xmlrpc.php',
        'Disallow: /images/',
        'Disallow: /wp-content/ ',
        'Disallow: /wp-includes',
        'Disallow: /wp-content/plugins',
        'Disallow: /wp-json/',
        'Disallow: /wp-login.php',
        'Disallow: /wp-register.php',
        'Disallow: */embed',
        'Disallow: */page/',
        'Disallow: /cgi-bin',
        'Disallow: *?s=',
        'Allow: /wp-admin/admin-ajax.php',
        '',
        'Sitemap: '.$protocol.$_SERVER['SERVER_NAME'].'/sitemap.xml', //автоматом поставляет домен
];
    echo implode( "\r\n", $lines );
    die;
}
Для robots есть плагин хороший Для просмотра ссылки Войди или Зарегистрируйся кто любит плагины, обнова была 11 месяцев назад но он хорошо работает на последней версии WP.


Отключаем стандартные виджеты в WORDPRESS

Выбираем что не используем и отключаем

Для этого необходимо вставить следующий код в functions.php
PHP:
add_action('widgets_init', 'unregister_basic_widgets' );
function unregister_basic_widgets() {
    unregister_widget('WP_Widget_Pages');            // Виджет страниц
    unregister_widget('WP_Widget_Calendar');         // Календарь
    unregister_widget('WP_Widget_Archives');         // Архивы
    unregister_widget('WP_Widget_Links');            // Ссылки
    unregister_widget('WP_Widget_Meta');             // Мета виджет
    unregister_widget('WP_Widget_Search');           // Поиск
    unregister_widget('WP_Widget_Text');             // Текст
    unregister_widget('WP_Widget_Categories');       // Категории
    unregister_widget('WP_Widget_Recent_Posts');     // Последние записи
    unregister_widget('WP_Widget_Recent_Comments');  // Последние комментарии
    unregister_widget('WP_Widget_RSS');              // RSS
    unregister_widget('WP_Widget_Tag_Cloud');        // Облако меток
    unregister_widget('WP_Nav_Menu_Widget');         // Меню
}
Ограничение количества редакций записей

Для этого необходимо вставить следующий код в wp-config.php

PHP:
define('WP_POST_REVISIONS', 3);// 3 или 5 сколько нужно.
Те редакции которые были созданы ранее они остануться. удалить можно способом который я указал ниже.

Если есть куча ненужных редакций их можно убить, опять же если не нужны

Перед тем, как удалить все редакции, необходимо удалить их мета-данные и таксономию, если они имеются. В MySQL через командную строку cделать это можно с помощью запроса:

удаление мета-данных:
DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%');

удаление таксономии:
DELETE FROM wp_term_relationships WHERE object_id IN (SELECT ID FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%');

удаление редакций:
DELETE FROM wp_posts WHERE post_type = 'revision' AND post_name LIKE '%revision%';


Отключение агрессивной проверки обновлений

Для этого необходимо вставить следующий код в functions.php
PHP:
if( is_admin() ){
// отключим проверку обновлений при любом заходе в админку...
remove_action( 'admin_init', '_maybe_update_core' );
remove_action( 'admin_init', '_maybe_update_plugins' );
remove_action( 'admin_init', '_maybe_update_themes' );

// отключим проверку обновлений при заходе на специальную страницу в админке...
remove_action( 'load-plugins.php', 'wp_update_plugins' );
remove_action( 'load-themes.php', 'wp_update_themes' );
add_filter( 'pre_site_transient_browser_'. md5( $_SERVER['HTTP_USER_AGENT'] ), '__return_true' );
}
 
Последнее редактирование:
Наиболее правильный вариант для автопрописывания тегов для картинок, вставляемых стандартным редактором в контентную часть (вперемешку с текстом).
На просторах пока что нет этого кода в моем варианте, НИГДЕ)))
PHP:
//этот метод получает заголовок записи и вставляет его в соответствующие поля формы загрузки картинки,
//метод никуда ничего не сохраняет, а просто отображает форму перед отправкой в базу данных, это важно понимать,так как далее проявляется глюк WP!
function change_empty_alt_to_title( $response ) {
    if ( ! $response['alt'] ) {
        $response['alt'] = sanitize_text_field( $response['uploadedToTitle'] );//берем заголовок записи и вставляем в alt
    }
    if ( $response['title'] ) {
        $response['title'] = sanitize_text_field( $response['uploadedToTitle'] );//берем заголовок записи и вставляем в title,НО ТУТ НЮАНС, эта вставка живет ровно до момента сохранения записи, поле в БД не пишется, почему зачем так и не разобрался, этот глюк исправляется дальше
    }
    return $response;
}
add_filter( 'wp_prepare_attachment_for_js', 'change_empty_alt_to_title' );
//исправляем глюк, описанный выше,этот метод срабатывает при сохранении записи- берет сформированный в первом методе alt и пишет его в  title.
function filter_function_name_11( $html, $id, $caption, $title, $align, $url, $size, $alt ){
    if (strpos($html, "title=")) {
        return $html;
    } else {
        return str_replace('<img', '<img title="' . $alt . '" '  , $html);
    }
}
add_filter( 'image_send_to_editor', 'filter_function_name_11', 10, 8 );
 
Последнее редактирование:
В целях оптимизации бэка часто кэширую шорткоды, особенно если это какой-нибудь список постов со свойствами в кастомных полях.

PHP:
/**
 * Пример кэширования для Wordpress
 */
add_shortcode('my_pricesSh', function($atts, $content = ''){
    global $post;
    // дефолтные параметры
    $defaults = array(
        '_my-url-as-id' => ($post ? $post->ID : $_SERVER['REQUEST_URI']), // фикс кэширования
    );
    // смешиваем пришедшее и дефолт
    $atts = shortcode_atts($defaults, $atts);
    // пробуем в кэш
    $cache_key = 'my_shortcode_pricesSh'.md5(serialize($atts));
    $cached = get_transient( $cache_key );
    if ($cached){
        $out = $cached;
    } else {
        // начало вывода
        $out = '';
        // подгрузим по шаблону
        // Надо будет получить пришпиленные элементы прайса, их и будем перебирать в шаблоне
        // Пока - для демонстрации - просто шаблон
        ob_start();
        get_template_part( 'template_parts/elements/shortcodes/shortcode_pricesSh' );
        $out = ob_get_contents();
        ob_end_clean();
        set_transient( $cache_key, $out, 10 );
    }
    return $out . PHP_EOL . $content;
});
 
Назад
Сверху