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

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

Тег: wordpress

Как сделать, чтобы активный пункт меню 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' );

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' );