wordpress | Владимир Бычко об управлении проектами

Владимир Бычко об управлении проектами

пиэм разъясняет, предостерегает, рекомендует

Тег: wordpress

Как отключить автосохранение в wordpress

Изображение с unsplash.com, автор Onur Buz

Вордпресс слишком буквально понял призыв о священности введённых пользователем данных, поэтому сохраняет всё, что вы вводите, постоянно. По-умолчанию, каждые 30 секунд в браузере и каждые 60 секунд в БД. Всё это выливается в крайне неприятное поведение — вы вводите текст поста, а движок сохраняет его в фоне, блокируя кнопку сохранения, из-за чего вы, чтобы сделать полноценную редакцию, вынуждены ждать, когда кнопку расклинит. Отстой.

Как с этим бороться? Я вычитал такой рецепт. Открываем:

ваш домен → wp-content → themes → название вашей темы → functions.php

И вписываем туда код:

// Отключаем автосохранение
add_action( 'admin_init', 'disable_autosave' );
function disable_autosave() {
wp_deregister_script( 'autosave' );
}

Об этом способе пишут на многих сайтах, но он почему-то не работает.

Единственный способ реально избавиться от автосохранения в БД — выставить очень длинный период автосохранения. И для этого нужно лезть в другой файл. Открываем:

ваш домен → wp-config.php

И вписываем туда инструкцию:

/** Интервал автосохранения в секундах **/
define('AUTOSAVE_INTERVAL', 10000 ); 

После этого описанное выше поведение больше не будет вас беспокоить. Нет, вводить 0 смысла нет, в этом случае автосохранение будет каждую секунду.

И ещё одна вещь, о которой хотелось бы поговорить. Редакции постов. По-умолчанию вордпресс при каждом сохранении пишет в БД новую редакцию вашего поста. Это неплохо, когда вы экспериментируете со всякими лишайными плагинами и хотите иметь возможность откатывать похеренное сложное форматирование.

Но если у блога несколько авторов и они пишут каждый день по несколько постов, у вас засрётся БД. Давайте ограничим количество редакций. В тот же самый wp-config.php вписываем:

/** Количество редакций в штуках **/
define('WP_POST_REVISIONS', 20);

Всё, теперь количество редакций каждой записи ограничено двадцатью.

Как убрать из admin bar wordpress ненужные пункты

Каждый админ wordpress-блога сталкивался с тем, что нужные плагины пихают свои пункты в admin bar (это такая чёрная панелька вверху сайта, которая отображается администраторам). Эти пункты там совершенно не нужны и занимают полезное место.

В интернете есть инструкции, как их убрать, не используя плагинов, но в этих инструкциях есть одно упущение, которое заставило меня немного поломать голову. Итак, рассказываю, как правильно.

Убирать будем пункт плагина, добавляющего новые блоки в гуттенберговский редактор, называется Gutenverse, он в этой панели абсолютно бесполезен.

Сначала щёлкаем правой кнопкой на этом пункте и открываем инспектор:

Видите айдишник элемента? wp-admin-bar-gutenverse

Важный момент. Из названия айдишника „wp-admin-bar-gutenverse“ удаляем „wp-admin-bar-“ и тогда всё заработает.

Скопируйте его куда-нибудь.

Шаг второй. Лезем по FTP на свой хостинг и открываем:

ваш домен → wp-content → themes → название вашей темы → functions.php

Вставляем туда следующий код, где gutenverse — айдишник вашего пункта:

add_action( 'wp_before_admin_bar_render', 'remove_item_from_admin_bar', 99 );
function remove_item_from_admin_bar() {
	global $wp_admin_bar;
	$wp_admin_bar->remove_menu( 'gutenverse' );
}

Если хотите удалить ещё какой-нибудь пункт, например, нафиг там ненужного Aioseo, добавляйте новую строку вот так:

add_action( 'wp_before_admin_bar_render', 'remove_item_from_admin_bar', 99 );
function remove_item_from_admin_bar() {
	global $wp_admin_bar;
	$wp_admin_bar->remove_menu( 'gutenverse' );
	$wp_admin_bar->remove_menu( 'aioseo-main' );
}

Собственно, это всё, что вам нужно знать об удалении пунктов из admin bar.

А теперь бонус. Если хотите, чтобы admin bar автоматически скрывалась и отображалась при наведении курсора, ставьте бесплатный плагин Auto Hide Admin Bar и будет вам счастье.

Изображение с zazzle.com

Как сделать, чтобы активный пункт меню wordpress не содержал ссылку на себя

По правилам юзабилити, ничего не должно содержать ссылку на себя. Если пользователь переходит на страницу, например, «Контакты», пункт меню «Контакты» должен потерять интерактивность, это правильное и хорошее поведение. Как это сделать в wordpress? При помощи правки functions.php

Для начала, поместите в functions.php следующий код:

/**
 * Extension for wp_nav_menu()
 * Remove element "a" from current menu item
 *
 * Optional $args contents additional arguments
 * string replace_a_by - Whether to wrap the link text node, and what to wrap it with. Default 'span'.
 * string xpath        - xPath expression.
 *
 * @param $args
 * @see wp_nav_menu()
 * @return mixed Menu output if $echo is false, false if there are no items or no menu was found.
 */
function wp_nav_menu_extended($args = array()) {
    $_echo = array_key_exists('echo', $args) ? $args['echo'] : true;
    $args['echo'] = false;

    $menu = wp_nav_menu($args);

    // Load menu as xml
    $menu = simplexml_load_string($menu);

    // Find current menu item with xpath selector
    if (array_key_exists('xpath', $args)) {
        $xpath = $args['xpath'];
    } else {
        $xpath = '//li[contains(@class, "current-menu-item") or contains(@class, "current_page_item")]';
    }

    $current = $menu->xpath($xpath);

    // If current item exists
    if (!empty($current)) {
        $text_node = (string) $current[0]->children();

        // Remove link
        unset($current[0]->a);

        // Create required element with text from link
        $element_name = $args['replace_a_by'] ? $args['replace_a_by'] : 'span';

        $dom = dom_import_simplexml($current[0]);
        $n = $dom->insertBefore(
            $dom->ownerDocument->createElement($element_name, $text_node),
            $dom->firstChild
        );

        $current[0] = simplexml_import_dom($n);
    }

    $xml_doc = new DOMDocument('1.0', 'utf-8');
    $menu_x = $xml_doc->importNode(dom_import_simplexml($menu), true);
    $xml_doc->appendChild($menu_x);

    $menu = $xml_doc->saveXML($xml_doc->documentElement);

    if ($_echo) {
        echo $menu;
    } else {
        return $menu;
    }
}

А затем разместите в header.php вот такой вызов:

<?php wp_nav_menu_extended( array( 'theme_location' => 'primary', 'menu_class' => 'nav-menu') ); ?>

Остаётся понять, как проделать эту же операцию с заголовком блога. Лечится заменой вызова заголовка в header.php вот таким образом:

<h1 class="vcard author">
<?php if ( is_front_page() && !is_paged())
echo bloginfo('name');
else echo "";
?>
</h1>

<h1 class="vcard author">
<a href="<?php echo get_option('home'); ?>/" title="На главную страницу">

<?php if ( is_front_page() && !is_paged())
echo "";
 else 
 echo bloginfo('name');
?>

</a>
</h1>

Как на wordpress сайте сделать страницу со ссылками на файлы в каталоге

Администраторы школьных сайтов столкнулись с новым вызовом от наших доблестных контролирующих инстанций. Сначала пришла инструкция о том, что на школьном сайте должна появиться страница site.ru/food/, на которой должны размещаться ссылки на файлы ежедневного меню горячего питания. А эти самые файлы нужно положить в каталог site.ru/food/, причём файлам нужно давать имена по специальному шаблону.

Ничего не могу сказать за Битрикс или Ukoz, но вот WordPress такой финт сделать не позволяет. Если сделать и раздел site.ru/food/, и каталог site.ru/food/, при попытке открытия раздела будет отображаться ошибка с кодом 403.

Чуть позже в официальном чате скинули новую инструкцию. Как оказалось, изначальная инструкция была некорректна и от администраторов школьных сайтов требуется только создать каталог и складывать в него файлы меню, никакого визуала не нужно.

Тем не менее, если вы всё-таки хотите, чтобы по адресу site.ru/food/ у вас открывалась страница со ссылками на файлы, есть два способа это сделать.

Способ первый, кривой и трудоёмкий. Положите в каталог site.ru/food/ файл index.html и редактируйте его как обычный html-файл, добавляя в него ссылки на файлы меню вручную.

Способ второй. Откройте в корне вашего домена файл .htaccess и пропишите в нём следующую инструкцию:

Options +Indexes

Засада в том, что эта инструкция откроет возможность просматривать через браузер содержимое любого каталога на сайте, адрес которого знает конечный пользователь. Решайте сами, надо ли вам это. Но да, после применения этого лайфхака, site.ru/food/ будет открываться вот в таком виде:

Если знаете, как открыть таким образом конкретный каталог, напишите, пожалуйста, в комментариях.

Как починить загрузку изображений в WordPress

После обновления на 5.5.0 вылезла проблема. При попытке загрузить любое изображение в галерею, сообщение об ошибке:

Постобработка изображения не удалась, возможно потому, что сервер перегружен или не имеет достаточно свободных ресурсов. Возможно поможет загрузить меньшее изображение, рекомендуемый максимальный размер — 2500 пикселов.

Файл при этом грузится и отображается в виде превью в галерее после перезагрузки страницы. В целом, работать можно, но тяжко, нужно делать много лишних движений.

Долго дёргал за все ручки в настройке параметров веб-сервера, ничего не помогало. Пробовал увеличивать разные параметры максимального веса загружаемых файлов через контрольную панель хостинга и конфиг самого вордпресса, всё без толку.

В итоге помогла замена фоторедактора по-умолчанию. Делается вставкой в functions.php (лежит в корне вашей темы) такого кода:

function hs_image_editor_default_to_gd( $editors ) {
$gd_editor = 'WP_Image_Editor_GD';
$editors = array_diff( $editors, array( $gd_editor ) );
array_unshift( $editors, $gd_editor );
return $editors;
}
add_filter( 'wp_image_editors', 'hs_image_editor_default_to_gd' );
Изображение с imgbin.com

Svg-графика на wordpress-сайте

Современные браузеры замечательно поддерживают векторную графику. svg-картинки суперски смотрятся на любом экране, от маленького мобильного до Retina-дисплея. Только вот wordpress «из коробки» не умеет вставлять такие картинки через форму «Добавить медиафайл». Ругается, что загрузка svg отключена по соображениям безопасности.

Конечно, никто не мешает залить файл напрямую, посредством ftp-клиента, но встроенные средства wordpress быстрее.

Во многих темах wordpress есть файл functions.php Основная цель данного файла — предоставить дополнительные функции необходимые для полноценной работы темы, а также установить некоторые параметры для ядра WordPress, например размер миниатюр, путь к файлам локализации темы, разделы для виджетов и другие.

Файл functions.php загружается при каждом запросе любой страницы в WordPress, включая запросы в панель администрирования и AJAX запросы. Это дает разработчикам темы возможность изменять любые аспекты их проекта на WordPress, а не только то, что связано с внешним видом.

Если добавить в этот файл следующую конструкцию, wordpress подружится с svg-графикой:

function cc_mime_types( $mimes ){
    $mimes['svg'] = 'image/svg+xml';
    return $mimes;
}
add_filter( 'upload_mimes', 'cc_mime_types' );