• Вирус постоянно меняет права к файлам сайта на Wordpress?

    irtek
    @irtek
    Wordpress-addicted
    У вас где-то залит shell-скрипт. В идеале нужно все переустановить.
    Wordpress в обязательном порядке, тему и все плагины. Если на сервере под одним пользователем несколько сайтов, то такой враг может быть в любом из них.

    Если у вас есть доступ к серверу по SSH, то выполните команду

    find . -type f -name '*.php' | xargs grep -l "x63" --color


    или

    find . -type f -name '*.php' | xargs grep -l "x47" --color


    "точка" после find обозначает искать в папке, в которой находитесь, замените ее на путь к папке, где лежат ваш сайт или сайты или вообще заменить на слеш / тогда искать будет по всему серверу.

    Команда ищет файлы в содержании, которых есть текст "x63" или "x47". В 99% случаях из таких кодов состоит шифровка вражеских вирусов. Обратите внимание на файлы, которые найдет команда. Откройте их и посмотрите содержание. Код вируса вы сразу увидите, он весь шифрованный base64 и присутствуют команды eval. Чистите или восстановите данные файлы на чистые.
    Ответ написан
    Комментировать
  • Нагрузка на Wordpress?

    irtek
    @irtek
    Wordpress-addicted
    Вопросы будут и к хостингу (нужен VPS настроенный)
    И к Вордпрессу. В ситуации с 300 тыс записей 100% категоричный отказ от встроенных функций ВП. Даже не пытайтесь. Все фильтры писать вручную с оптимизированными запросами в базу. Стараться по максимуму сократить переборы базы, т.к. его meta_query и прочие встроенные фильтры делают многократные бессмысленные переборы таблиц.

    О цифрах по опыту
    При оптимизированном VPS на 1 ядре + 1 Гб ОЗУ спокойно работают встроенные фильтры ВП (140 тыс записей) + 7 параметров фильтрации. Но при более сложном фильтре, чем простой отбор параметров появились проблемы даже при росте мощностей до 4 ядер + 4 Гб ОЗУ. Тормоза ощутимые, особенно при одновременной пользовательской активности в 150-200 человек. Оптимизировали сложные запросы, сделали их вручную и все вернулось к прежним 1 ядро + 1 Гб ОЗУ.

    На сайте с 420 тысячами записей появились проблемы с фильтрами встроенными сразу. Переписали вручную и проблему сняли, для надежности работает на VPS 3 ядра + 2 Гб ОЗУ.
    Обязательное использование кэширования запросов, например сервера Memcache. Также использовать встроенное транзитное кэширование ВП. Эти два подхода снимут любую проблему нагрузки на базу и фильтры наполовину.

    Переход на php 7.0 в последнее время положительно сказался на работу ВП.

    Насчет серверной оптимизации
    При работе публично в обязательном порядке закрыть wp-login.php, xmlrpc.php, а также wp-json REST API. Данные мероприятия исключат любую лишнюю нагрузку от ботов. Отфильтровать доступ к папкам wp-admin и wp-includes, а также закрыть доступ к php кроме сервера к wp-content/plugins и папки темы.
    Ответ написан
    5 комментариев
  • Как отключить jq на определённой страницы в Wordpress?

    irtek
    @irtek
    Wordpress-addicted
    Есть функции, которые отключают регистрацию скрипта jquery в Wordpress, в которых можно настраивать разные url к скриптам.

    Эти функции отменят регистрацию скрипта jquery (функции вставляются в файл functions.php темы)
    wp_deregister_script( 'jquery' );
    wp_deregister_script( 'jquery-core' );


    Есть функция, которая регистрирует скрипт jquery в Wordpress (НО НЕ ПОДКЛЮЧАЕТ). также вставляется в functions.php
    wp_register_script('jquery', 'URL скрипта', false, null, true );


    И есть функция, которая ПОДКЛЮЧАЕТ скрипт
    wp_enqueue_script('jquery', 'URL скрипта', false, null, true );


    Таким образом вы можете, во первых функциями deregister отменить текущее подключение и скрипт jquery, командой wp_register_script зарегистрировать скрипт, а затем подключать где нужно простой командой
    wp_enqueue_script('jquery'); там где нужно.

    1. Вы можете подключить скрипт на нужной странице добавив
    wp_enqueue_script('jquery');  // если ранее jquery был зарегистрирован или напрямую функцией
    wp_enqueue_script('jquery', 'URL скрипта', false, null, true );

    Функции вставлять ДО в шапке get_header();

    Вы также можете настроить подключение в functions.php конструкцией ниже. Обращаю внимание, что команда определения страницы is_page() не работает в functions php, поэтому можно добавить через функцию, повесив ее на хук. В рамках этой функции будет работать условная команда определения на какой странице включать jquery, а на какой нет.

    add_action('wp_enqueue_scripts', 'toster_q_479904', 99);
    function toster_q_479904() {
    if(is_page('about') {
    	wp_enqueue_script('jquery', 'URL скрипта', false, null, true );
    }
    }
    Ответ написан
  • WordPress - получить мета поля постов и сложить их?

    irtek
    @irtek
    Wordpress-addicted
    // параметры для запроса WP_Query
                $args = array(
                    'post_type' => 'post'
                );
    
                $query = new WP_Query( $args );
                $posts = $query->posts;
    
                $summ = 0;
    
                foreach ($posts as $post) {
    
                    $summ += get_post_meta($post->ID, 'meta_key', true);
    
                }
    
                wp_reset_postdata();
    
                echo $summ;
    Ответ написан
    Комментировать
  • Как в wordpress перехватить get запрос?

    irtek
    @irtek
    Wordpress-addicted
    1. Грубый метод
    Создать папку sitemap в корне и создать там index.php
    Если нужны функции WordPress и доступ к базе, то включить в файл основной файл загрузки WP

    require '../wp-load.php';

    2. Если нужно прямо в WordPress
    Скрипт нужно повесить на хук "init", который происходит до передачи заголовков страницы.
    Данный код добавить в functions.php темы

    add_action( 'init', 'qna_habr_q_971257' );
    
    function qna_habr_q_971257() {
    
    	global $wp;
    
    	// Получить базовый url
    	$current_url = home_url();
    
    	// Получить текущий url
    	$current_url = $current_url . $_SERVER['REDIRECT_URL'];
    
    	// Получить ID поста/страницы
    	$id = url_to_postid( $current_url );
    
      // Получить массив get запроса
    	print_r( $_GET );
    
    
    	// Здесь ваш скрипт... //
    
    
    	// Завершить функцию выходом если не хотите продолжать загружать страницу
    	wp_die();
    
    }


    Для условия определения страницы, на которой находимся я привёл пример нескольких функций. Вы можете определить по данным из глобального $_SERVER, можете воспользоваться определением ID страницы по url и определять по ID на какой странице находитесь. Но учтите, что is_page() функция на данном этапе загрузки еще не работает.

    И завершить функцию можно выходом wp_die(); если вам не нужно продолжение загрузки страницы.
    Ответ написан
    1 комментарий
  • Как разом удалить все медиа в wordpress?

    irtek
    @irtek
    Wordpress-addicted
    DELETE FROM `wp_posts` WHERE `post_type` = "attachment";
    DELETE FROM `wp_postmeta` WHERE `meta_key` = "_wp_attached_file";
    DELETE FROM `wp_postmeta` WHERE `meta_key` = "_wp_attachment_metadata";


    Эти 3 запроса в базе данных удалят все основные записи о медиа, если не создавали каких-то индивидуальных полей для изображений.
    Ответ написан
    1 комментарий
  • Как в WP делать переадресацию url в в зависимости от utm метки?

    irtek
    @irtek
    Wordpress-addicted
    В файл functions.php темы

    add_action( 'template_redirect', 'toster_q_1004505_redirect' );
    
    function toster_q_1004505_redirect() {
    
    	if ( ( isset( $_GET['link'] ) && ! $_GET['link'] ) || ! isset( $_GET['link'] ) ) {
    
    		$url = '/example'; // Куда переадресуем, если utm метка link пустая или отсутствует
    		wp_safe_redirect( $url ); // либо функция wp_redirect($url); если нужно переадресовать на внешний url
    		exit();
    
    	}
    
    }


    Замените функцию wp_safe_redirect($url) на функцию wp_redirect($url) если вам нужно переадресовать на внешний сайт.
    Ответ написан