Вы здесь: Главная » Wordpress » Полезные мелочи для тем и плагинов на WordPress

Полезные мелочи для тем и плагинов на WordPress

Ошибки, связанные с переходом WordPress на версию PHP 7.1 и выше

Ошибка в плагине qTranslate X

qTranslate X - это достаточно популярный плагин для перевода вашего сайта на различные языки. Был. Потому что на данный момент он уже года 4 как не поддерживается, поэтому корректировки, связанные с его работоспособностью, никто в файлы плагина не вносит.
Тем не менее, плагин установлен на достаточно большом количестве сайтов и отлично работает с версией PHP 5.4-5.6. Как только вы соберетесь изменить версию PHP вашего сайта на 7.1 и выше, этот плагин выдаст вам ошибку вида "Warning: Parameter 2 to qtranxf_postsFilter() expected to be a reference, value given in /var/www/DOMAIN/htdocs/wordpress/wp-includes/class-wp-hook.php on line 298" или очень похожую.

На самом деле вы легко можете справится с этой ошибкой самостоятельно, удалив всего 2 символа &, использующихся при вызове методов в файле qtranslate_frontend.php, который размещен в папке wp-content/plugins/qtranslate-x, а именно:

Сохраняем файл qtranslate_frontend.php, загружаем его по FTP на свой сайт, если изменения проводили на локальной машине, и обновляем страницу в админке. Все должно заработать.

Ошибка при вызове конструктора класса

Ранее вызов конструктора, т.е. главной функции класса в PHP можно было осуществить с помощью функции, имеющей такое же имя, как и класс, а также с помоощью специальной функции __construct(). В версии PHP 7 первый способ объявлен устаревшим (Deprecated) и будет вызывать примерно такую ошибку:

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP;

Для того чтобы избавится от этой ошибки в плагине или теме, вам нужно заменить имя функции-конструктора на __construct() и сохранить файл. Например, это можно сделать так:

Ошибка в плагине qtranslate-x вида "continue" targeting switch is equivalent to "break"

При обновлении  версии PHP до 7.3 плагин qtranslate-x/qtranslate_frontend.php выдал в строке 497 ошибку такого вида: Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

Решение очень простое: замените continue на continue 2 и перезапишите файл плагина на сервере.

continue 2 в q-translate

Ошибка типа Uncaught Error: Call to undefined function mb_strimwidth()

Функция mb_strimwidth() предназначена для обрезки какого-либо текста или заголовка до указанного количества символов. В WordPress используется довольно часто для того, чтобы сократить длину заголовков-ссылок или начального контента записи, указав в качестве продолжения ... или [...]. Код, например, может быть таким:

Для работы этой функции необходим модуль PHP, который называется mbstring.В PHP версии 5.x он обычно включен по умолчанию. В PHP 7.x в зависимости от настроек вашего хостинг-провайдера может быть, напротив, отключен по умолчанию. Поэтому исправление такого рода ошибки нужно начинать с CPanel. Найдите в контрольной панели хостинга пункт "Версия PHP" и установите флажок для нужной опции:
PHP mbstringСохраните настройки, если нужно и проверьте страницы сайта на наличие этой ошибки. Она должна исчезнуть, как правило.

Примечание:  вы знаете, что в PHP для вывода текста на страницу вместо  echo можно использовать такую конструкцию?

Автор: Админ

14 комментариев

  1. Этого wp_kses() не нашел у себя.

    Код вот такой у меня functions.php:

    // Редактор в Биографии автора 2

    В файле admin-script.js такой код:

    • Жаль, Taras, что вы не удосужились посмотреть на код чуть выше в этой же статье. Там как раз описывается вариант, когда в стандартном поле ввода для биографических данных (описания) пользователя не сохраняются html-теги.
      Там отменяется функция, подобная wp_kses():

      При выводе информации о пользователе на странице поста можно также воспользоваться функцией wpautop():

  2. Я пробовал разными путями добавлять фото и как вы описали, но всеравно не получаеться. А может это из за того, что у меня https а не http?

    • Думаю, что https здесь ни при чем. Этот протокол автоматически подтянется в ссылку на изображение, когда вы его загрузили через медиа-загрузчик. Если, разумеется, у вас правильно настроен https на сайте и в админке, хоть это дело и несложное. В конце концов, кто мешает сделать ссылку вида //site.ru/wp-content/uploads/2019/11/foto-avtor.jpg, не вводя в нее протокол. Или еще меньше /wp-content/uploads/2019/11/foto-avtor.jpg?

      Есть вероятность, что где-то в коде при обработке вывода вашей информации есть функция типа wp_kses(), для которой запрещена обработка тега . А может, вы где-то допустили ошибку. Но точно можно сказать, только заглянув в код.

  3. Что-то не получается, та же проблема, что и писал в первом сообщении. Визуальный редактор должен быть включен? https://ibb.co/rQTJx0B

    Делал все так же:

    добавил код ниже в functions.php
    создал папку js в public_html и добавил туда файл с нужным кодом: /public_html/js/admin-script.js
    сделал путь до файла js: get_template_directory_uri( '/js/admin-script.js' ),

    // Редактор в Биографии автора
    add_filter( 'get_the_author_description', 'wptexturize' );
    add_filter( 'get_the_author_description', 'convert_chars' );
    add_filter( 'get_the_author_description', 'wpautop' );
    add_action( 'show_user_profile', 'your_slug_add_editor' );
    add_action( 'edit_user_profile', 'your_slug_add_editor');

    function your_slug_add_editor($user ){
    if ( !current_user_can('edit_users') ) return;
    $settings = array(
    'media_buttons'=>0,
    'textarea_name'=>'description',
    'quicktags'=>1,
    'teeny'=>0,
    'tinymce'=> 1,
    'textarea_rows'=>14,
    );

    $description = get_user_meta( $user->ID, 'description', true);
    wp_editor( $description, 'description', $settings );
    }
    function your_slug_add_scripts() {

    wp_enqueue_script(
    'your-slug-admin-script',
    get_template_directory_uri( '/js/admin-script.js' ),
    array( 'jquery' ), 1.0, true
    );
    }
    add_action( 'admin_enqueue_scripts', 'your_slug_add_scripts' );

    • Проблема не в коде, а в подходе. И лежит она здесь:

      создал папку js в public_html и добавил туда файл с нужным кодом: /public_html/js/admin-script.js

      public_html - это корневая папка сайта, а вам нужна корневая папка темы. Она расположена по пути public_html/wp-content/themes/название_вашей_темы.
      Путь к папке темы в проводнике Windows
      Для того чтобы удостоверится, что скрипт подгрузился в вашей админ-панели, необходимо нажать Ctrl + U на странице редактирования профиля пользователя или выбрать пункт "Исходный код страницы"/"Поcмотреть код страницы" из контекстного меню по правому клику в любом месте страницы
      Показать код страницы
      Затем нажмите CTRL+F и найдите свой скрипт на странице, введя название файла в поле поиска.
      Поиск скрипта в коде
      Если такого файла у вас на странице нет, то, возможно, нужно перезагрузить страницу с обновлением кэша браузера (нажимаем CTRL + F5) и еще раз поискать его.
      Если js-файла опять там нет - ищите ошибку в путях подключения или размещения файла.

      • Спасибо за подробности.

        А с точки зрения безопасности или каких-то других моментов, все эти изменения не отразятся в худшею стороно? Но информацию в поле "Биография" добавлять будет только я, доступ будет только у меня...

        • Нет, то, что вы добавите, необходимо для вывода на какой-либо странице темы или внутри поста.
          Безопасность здесь вряд ли будет задета.
          Все манипуляции вы выполняете в админке, чтобы сохранить в БД не голый текст, а текст с каким-то форматированием - выделением жирным, курсивом или добавлением ссылок и т.п.
          Возможность редактировать данные всех пользователей есть только у админа, так что вряд ли стоит беспокоится.

          • Спасибо, все заработало, но есть нюанс. Не сохраняеться и не выводиться фото в редакторе и на странице профиля автора. То есть: добавляю фото в редактор, сохраняю, а этот код пропадает в редакторе - вместо него пустота появляется:

            <img class="alignleft wp-image-877" src="https://site.ru/wp-content/uploads/2019/11/foto-avtor.jpg" alt="Фото-автор" width="280" height="167" />

          • Не могу точно объяснить, в чем у вас причина, т.к. у меня все сохраняется и выводится. Скриншот:
            Фото в редакторе
            Может проблема в том, как вы это делаете?
            В обычном редакторе постов есть специальная кнопка "Добавить медиафайл", которая вызывает окно медиа-загрузчика WordPress.
            Здесь ее нет. Вместо этого вам нужно переключится в текстовый вид редактора из визуального и нажать на кнопку img.
            Добавление фото в редакторе
            Возможно, вам стоит прочитать статью "Добавление фото пользователя в профиль WordPress" и воспользоваться кодом из нее?

  4. Здравствуйте.

    У меня вопрос по этой теме: Использование классического редактора WordPress (TinyMCE) для редактирования биографии пользователя в его профиле.

    Делал все как вы написали:

    Я добавил в файл functions.php код - https://ibb.co/dft26fz
    Создал в public_html файл - my-script.js и добавил туда код

    Но в админки все криво, два редавтора появилось - https://ibb.co/KFPk7vZ и https://ibb.co/gFRksz6

    В чем может быть причина? Спасибо.

    • Спасибо за вопрос. Дело в том, что в описании была ошибка.
      Вы делали все правильно, но у вас не сработал последний пункт, связанный с подключением скрипта к админке WordPress, т.к. именно там была ошибка.
      Последовательность действительно такова: сначала стандартный вид Биографии - https://prnt.sc/qcpoit, затем измененный с помощью фильтров, но нерабочий - https://prnt.sc/qcpr09.
      Ошибка была в 9-й строке - вместо
      add_action( 'admin_enqueue_scripts', 'your_slug_add_scripts' ); //подключает скрипт к админке
      было написано
      add_action( 'wp_enqueue_scripts', 'your_slug_add_scripts' ); //подключает скрипт к сайту (фронтэнду)
      После того, как вы это исправите и добавите скрипт с нужным кодом, должно все получится (https://prnt.sc/qcpz45)
      Имейте ввиду, что, если вы подключаете скрипт в теме, то вместо функции plugins_url( '/js/my-script.js', __FILE__ ) вам нужно использовать функцию get_template_directory_uri(). '/js/admin-script.js', которая указывает путь к файлам темы. В кавычках после слеша нужно указывать те папки и файлы, которые есть в вашей теме. Или создать их по этому пути.

      • Спасибо за ответ. А что значит "в теме"?

        Имейте ввиду, что, если вы подключаете скрипт в теме...

        • В WordPress есть 2 вида расширений - плагины и темы (шаблоны). И там, и там можно подключать скрипты.
          Основным файлом темы, в котором записываются различные функции, является файл functions.php. В нем обычно нужно прописывать пути для загрузки css- и js-файлов, используя функцию get_template_directory_uri().
          В плагинах основным файлом может быть любой. Чаще всего, его имя совпадает с названием папки с плагином. Для плагина загрузку css- и js-файлов обычно выполняют с помощью функции plugins_url( '/js/my-script.js', __FILE__ ).

Добавить комментарий

Ваш адрес email не будет опубликован.