Задать вопрос
Ответы пользователя по тегу MySQL
  • Система "уровней(экспинга)" для wordpress. Как лучше организовать хранение данных в mysql?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Все можно (и разумно) реализовать встроенными средствами.
    1. Храните данные в таблице wp_usermeta
    2. Используйте WP_User_Query, а именно meta_query для получения данных по уровням/опыту + date_query для группировки и сортировки результатов по периодам.

    ЗЫ: Это в случае, если ваши юзеры-игроки являются и аккаунтами (юзерами) WordPress. Если нет, например игрок это custom post type - тогда используйте WP_Query.
    Ответ написан
    6 комментариев
  • WordPress get_num_queries() в среднем 100 запросов для главной, это много?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. ~100 - это и не мало, и не много. Вполне себе рабочее значение, особенно для WP + ACF (в этом случае это даже скорее мало).
    2. Объем используемой памяти очень даже в норме.
    3. Время выполнения 200мс - нормально. Не супер, но вполне норм. Ведь речь тут идет о выполнении всего, а не только запросов к БД. Вот если бы только эти 100 запросов в БД столько выполнялись - то это уже печалька.

    Дополнительно:

    4. Используйте плагин Query Monitor для детальной статистики, в том числе по времени выполнения запросов к БД.
    5. Используйте object cache (memcached / redis на сервере + плагин для WordPress), и сам WP, и ACF складывают туда запросы к БД, что заметно ускоряет работу.

    И главный можно ли понять по этой информации сколько посетителей выдержит хостинг

    Нет :) Нужно знать параметры хостинга + настройки nginx/apache, php, mysql, того же memcached/redis (если они есть). Да и самой ОС на сервере, если честно. I/O, лимиты открытых файлов, кеши дескрипторов, даже TCP Congestion Control может иметь колоссальное значение.
    Ответ написан
    1 комментарий
  • Как реализовать условие вставки кастомного логотипа в шаблон?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Проверка так
    if( ! empty( $image_field ) ) {
        // Переменная содержит ссылку на загруженное изображение
        return '<img src="' . $image_field . '">';
    } else {
        // Переменная пустая, выводим стандартную картинку
        return '<img src="' . get_template_directory_uri() . '/images/default_logo.png">';
    }

    В контекст Customizer API сами уже подставите.
    Ответ написан
  • От куда информация скриптом получается быстрее, с сессий или базы данных?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Хранить в сессии. А саму сессию - в Redis / Memcached (то есть, в памяти).
    Ответ написан
    Комментировать
  • Как исправить кодировку?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вопросительные знаки - это тоже проблема с кодировкой, не всегда каракули. Зависит от того, какая исходная и какая конечная кодировка. Конечная скорее всего UTF, значит изначальная, вероятнее всего, cp-1251.
    Ответ написан
    Комментировать
  • Если есть, то покажи - в Wordpress, вредно ли?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    А есть у вас Memcached / Redis на сервере? Вообще, когда вы получаете пост / посты, то по умолчанию WP запрашивает и кеширует их метаданные. Так что все вызовы get_post_meta() внутри Loop не дают никакой нагрузки на БД, эти запросы обращаются исключительно в кеш (runtime или persistent). Так что спокойно можно использовать такой код и не беспокоиться о нем.

    Что касается самого MySQL - подержите работающим хотя бы с недельку (оптимально - месяц), чтобы статистику накопить. Анализируйте - через MySQL Tuner, PHPMyAdmin, через SQLProfiler, mysqlslap, смотрите slow query log, ищите утечки памяти или залипающие запросы.
    Ответ написан
    5 комментариев
  • Как правильно построить структуру бд для мультиязычных записей?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Архитектура мультиязычных данных - штука занимательная. Там есть варианты и нюансы. Почитайте для начала вот эту статью.
    Ответ написан
    Комментировать
  • Как правильно сменить кодировку базы данных Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Доступ непосредственно к MySQL у вас вряд ли есть, так что используйте PHPMyAdmin или HeidiSQL. Синтаксис команд:
    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    Ответ написан
    2 комментария
  • Как конвертировать базу данных MySQL сайта на Wordpress из utf8mb4_general_ci в utf8_general_ci?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Вы шутите? VDS - это же виртуальный сервер, а не shared-хостинг. Одна из основных прелестей VDS/VPS - возможность установки нужного софта и его обновление до любых версий. Просто обновите MySQL. Если же на этом VDS у вас нет доступа для этого, то что это вообще за сервис такой? +1 к Дмитрий Энтелис - уходите оттуда.

    И еще хинт - если не будете переходить, а будете использовать обычную utf8 - отключите Emoji. Именно им нужна mb4 в первую очередь, а раз вы не будете их использовать - отключите их поддержку, чтобы WordPress не пихал вам в страницы ненужные скрипты и стили.
    Ответ написан
  • Какая CMS выдержит большую нагрузку?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    1. Статические генераторы.
    2. WordPress как бекэнд + WP REST API + фронтэнд на каком-нибудь Angular.
    Ответ написан
    Комментировать
  • Как правильно реализовать в БД и PHP размеры одежды для интернет-магазина?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Стандартный подход:
    1 Таблица - товар и его стандартные характеристики
    2 Таблица - дополнительные характеристики (цвета, размеры, габариты, наличие/остатки и прочее)
    3 Таблица - связи между первыми 2мя таблицами
    Выборка из этих таблиц с помощью LEFT JOIN / INNER JOIN, например.
    Бывает еще промежуточная таблица "типы связей", тогда в таблице 2 хранятся только сами опции и внешний ключ на поле ID из таблицы "типы связей". То есть, Т1 - товары, Т2 - типы связей (цвет, размер, вес, наличие и тд), Т3 - характеристики (все варианты цветов, размеров и тд), Т4 - связи. Такие схемы встречаются, но, ИМХО, редко имеют смысл. Стандартной модели обычно достаточно.
    Ответ написан
    Комментировать
  • Как увеличить скорость работы WP?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Медленно, потому что идет перебор по всем строкам в таблице wp_postmeta, в которой отсутствуют индексы. И если у вас постов 5-6 тыщ, то postmeta у вас будет в разы больше. Но все равно такая скорость - это слишком долго. Видимо, беда все-таки и в сервере. Упомянутый где-то в комментах Sphynx решает задачу со сложными запросами по метаданным.
    Ответ написан
    Комментировать
  • Как побороть sql инъекцию на joomla 2.5?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Перестать использовать Joomla 2.5 целиком либо тот модуль, в котором это происходит (если это не ядро системы).
    Ответ написан
    Комментировать
  • Как восстановить сайт WordPress Multisite-а, имея базу данных?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Проверьте wp-config.php, блок связанный с multisite. Также, смотрите .htaccess если у вас apache. Ну и сделайте в PHPMyAdmin SQL-поиск по всем таблицам на предмет вхождения /corporative. Результаты покажут оба варианта, возможно не везде поправили. И еще я бы ребутнул PHP, Memcached/Redis и MySQL, для верности. Может из кеша до сих пор инфа тянется.
    Ответ написан
    Комментировать
  • Почему работает запрос со взаимоисключающими параметрами?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Надо смотреть сам SQL запрос, который получился. Подозреваю, что у вас из-за оператора OR происходит что-то типа "если есть посты по этому tax_query - вернуть их, иначе - стандартные результаты". Могу ошибаться, но без самого SQL запроса дебажить нереально. Установите плагин Query Monitor - все решится за пару минут.
    Ответ написан
    Комментировать
  • Есть ли бесплатный хостинг sql?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Да у любого адекватного хостера возьмите облачный VPS, тот же Digital Ocean. Подняли сервак, сделали что надо, грохнули. Заплатите по итогу пару копеек.
    Ответ написан
    Комментировать
  • Как использовать свою БД?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    WordPress позволяет использовать стороннюю таблицу wp_users, но тогда надо класс WP_Users переписать под свою структуру и данные (наследовать или заменить). Можно сделать свой oAuth сервер, один общий на все ресурсы - сайт, форум, WP. Во избежание дополнительных танцев с бубном над форумом я бы использовал BBPress - движок форума на базе WordPress. Он будет использовать тот же механизм юзеров, что и WP, а значит работы меньше.
    Ответ написан
    Комментировать
  • Правильно ли организована моя лента для Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Внимательно читайте документацию и best practices в блогах опытных разработчиков. На русском языке действительно качественной информации по WordPress очень мало. Читайте хотя бы Константина Ковшенина (блог на английском, блог на русском).

    1. Никогда не используйте query_posts. Это неэффективно - данная функция заменяет основной запрос (Main Query), но выполняется ПОСЛЕ него. То есть, выполняет запрос к БД повторно, уже с новыми аргументами. Кроме того, практически гарантированно вылезут проблемы с постраничной навигацией. И не забывайте, что все дополнительные данные (виджеты с категориями, последними постами и комментами и т.д.) будут продолжать пытаться использовать данные из основного запроса, а данная функция глобальные переменные заменит, большая часть template tags будет выдавать совершенно неожиданные вещи. Бардак обеспечен. При использовании этой функции нужно не забывать в нужных местах вставлять wp_reset_query(), с чем точно запутаетесь. Данную функцию можно использовать только в одном случае - вызывать ДО основного loop, чтобы изменить параметры запроса. В этом случае WordPress проигнорирует те параметры, которые получит в запросе (GET / ваш урл), и будет использовать те, которые ему передать через query_posts. Но для этих задач есть более правильные решения.

    2. Функция get_posts() предназначена для получения небольших, конкретных списков постов мимо основного Loop. Когда не нужна постраничная навигация и все дополнительное добро. Например, под статьей вывести список 5 последних статей из этого раздела. Или в боковой колонке вывести 10 статей, помеченных тем же тегом, что основная статья.

    3. Если КРОМЕ основного запроса нужно сделать еще один, используйте новый loop:

    $myquery = new WP_Query( $args );
    if( $myquery->have_posts() ) :
        while( $myquery->have_posts() ) : $myquery->the_post();
        ...
        endwhile;
    endif;

    Например, есть раздел "События", и этот раздел - не обычные posts, а custom post type 'event'. И нам в ленте надо вывести не в обычном виде, а 2 блока - первый это ближайшие события (по дате от сегодня и в будущее), второй - прошедшие события (по дате от сегодня и в прошлое). Первый блок выводим модифицированным основным запросом (см. дальше про модификацию основного запроса), второй - нашим новым лупом.

    3. Если нужно модифицировать основной запрос, и все что с ним связано (глобальные переменные и т.д.), единственно правильный способ - через хук pre_get_posts. Использовать надо в файле functions.php

    add_action( 'pre_get_posts', 'my_function' );
    function my_function( $query ) {
        // здесь можно (и нужно) использовать conditional проверки 
        // и модифицировать запросы для разных страниц и исловий, 
        // все в одной фукнции.
        if( $query->is_archive() && $query->is_main_query() ) :
            $query->set(
                'tag_id'                  => '1,10,15,2,30,31,32,35,89,55,120,140,150,4',
    	    'author'                 => '1,2,3,50,150,140,35',
    	    'posts_per_page'   => '10',
    	    'orderby'                => 'date',
            );
        endif;
    }

    Данный способ не плодит дополнительных запросов, модифицирует напрямую основной запрос, при этом остается возможность модифицировать его дополнителньо из других мест (например, из плагинов - тот же WPML или Polylang для мультиязычной подддержки), не вызывает никаких проблем с постраничной навигацией, правильно устанавливает все глобальные переменные, отчего все дополнительные плюшки (виджеты, последние комменты и посты, меню и прочее) работают корректно.
    Ответ написан
  • Как решить MySQL проблему "Failed to read auto-increment value from storage engine" при установке Wordpress?

    HeadOnFire
    @HeadOnFire
    PHP, Laravel & WordPress Evangelist
    Проблема 100% на уровне MySQL, WordPress тут вообще ни при чем. Простая переустановка не факт что поможет. С обычным MySQL давно не работаю, советую сделать то же самое - установить MariaDB 10 (и модуль php-mysqlnd понадобится).

    1. Здесь выбираем свою версию убунты и MariaDB, полученные данные добавляем в список репо
    2. Удаляем MySQL
    3. Устанавливаем MariaDB и php-mysqlnd
    4. Делаем mysql_secure_install
    5. Профит
    Ответ написан