Ответы в темах

Просмотр 15 ответов — с 16 по 30 (всего 36)
  • Добрый день!

    С этим, скорее всего, придётся немножко повозиться, поскольку в шаблоне фида нет фильтров для отдельных тегов и частей разметки. Элегантного решения я не вижу, но можно заменить шаблон целиком. Он хранится в файле wp-includes/feed-rss2.php.

    Последовательность действий примерно такая:
    1. Скопировать содержимое шаблона в отдельный php-файл.
    2. Отредактировать шаблон под свои нужды. В данном случае удалить строчку с тегом автора:
    <dc:creator><![CDATA[<?php the_author() ?>]]></dc:creator>.
    3. Сохранить этот модифицированный файл где-нибудь в пределах wp-content/, чтобы не затёрся при обновлениях движка.
    4. Отключить стандартный шаблон с помощью хука:
    remove_action( 'do_feed_rss2', 'do_feed_rss2', 10 );.
    5. Подключить с помощью того же хука свой шаблон:

    function my_override_do_feed_rss2( $for_comments ) {
        
        // Для комментариев используем стандартный шаблон из папки wp-includes
        if ( $for_comments ) {	
            load_template( ABSPATH . WPINC . '/feed-rss2-comments.php' );
    
        // Для постов подтягиваем файл с модифицированным шаблоном (указать путь)
        } else {
            load_template( 'path/to/my-feed-rss2-template.php' );
        }
    }
    
    add_action( 'do_feed_rss2', 'my_override_do_feed_rss2' );
    

    Желательно оформить всё это в виде плагина и, соответственно, хранить модифицированный шаблон в его папке. При этом путь к шаблону будет задаваться через plugin_dir_path( __FILE__ ).

    Код теоретический, приблизительный, на основе документации. Я не тестировал этот метод на практике. Но по идее должно сработать.

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

    Успехов!

    что это вообще за фигня и стоит ли с ней бороться?

    а wp-json вообще можно сделать Noindex или он имеет какоето значение?

    Добрый день!

    Адреса wp-json/ предназначены для поддержки REST API.

    Грубо говоря, это технология обмена данными с сайтом, которая позволяет управлять контентом удалённо. Например, искать или публиковать посты через собственное мобильное приложение, сделать нестандартную админку или какую-нибудь надстройку, типа системы учёта клиентов. То есть REST используется в основном там, где нужно расширить возможности сайта и превратить его в сервис, обслуживающий внешние запросы.

    Формально, начиная с версии 5.x REST API является частью администраторского интерфейса и отключать его не рекомендуется (англ.). Потому что API используется новым блочным редактором.

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

    Если вы не хотите возиться с фильтрами и вникать, можно попробовать плагин Disable REST API.

    Да, запятые — это моя опечатка, конечно. Рад, что вы с Юрием уже разобрались и всё получилось 🙂 Успехов!

    Отлично, теперь нужно восстановить настройки из админки. Меняем этот кусочек с заглушкой:

    wp_localize_script( $handler, 'color_blogObject', array(
            'menu_sticky' => 'on',
            'wow_effect'  => 'on'
        ) );
    

    …на вот такую примерно конструкцию:

    wp_localize_script( 'color-blog-custom-scripts', 'color_blogObject', array(
            'menu_sticky' => get_theme_mod( 'color_blog_enable_sticky_menu',   true ) ? 'on' : 'off';
            'wow_effect'  => get_theme_mod( 'color_blog_enable_wow_animation', true ) ? 'on' : 'off';
        ) );
    

    Здесь мы по сути воспроизводим действия из родительской темы: получаем из админки две предусмотренные разработчиком настройки с помощью функции get_theme_mod(). Если галочка включена, передаём в JS значение 'on', иначе 'off'. У меня нет возможности протестировать этот кусочек сейчас, но по идее настройки должны сработать.

    Не туда 🙂 Вот так:

    function replace_parent_js_scripts() {
        $handler = 'color-blog-custom-scripts';
        $version = null;
        
        // Отключаем вывод родительского скрипта (если он выводится)
        wp_dequeue_script( $handler );
    
       // Отзываем регистрацию и освобождаем хэндлер
        wp_deregister_script( $handler );
    
        // Регистрируем скрипт заново, уже со ссылкой на измененный файл
        wp_register_script( 
            $handler, 
            get_stylesheet_directory_uri() . '/mt-custom-scripts-fix.js', 
            array( 'jquery' ),
            $version,
            true
        );
    
        // Можно здесь же добавить и вывод скрипта, 
        // хотя я бы вызывал его выборочно 
        // в конкретных нужных шаблонах
        wp_enqueue_script( $handler );
       
        // Передаём в JS скрипт объект с настройками слайдера
        wp_localize_script( $handler, 'color_blogObject', array(
            'menu_sticky' => 'on',
            'wow_effect'  => 'on'
        ) );
    }
    
    add_action( 'wp_enqueue_scripts', 'replace_parent_js_scripts', 11 );
    

    Суть в том, что после вывода скрипта туда нужно передать объект с настройками (видимо из админки). Поскольку мы отключили родительский скрипт, этот объект не передался в ваш дочерний вариант. Он пытается найти настройки (объект color_blogObject), котрых нет. Поэтому скрипт выдаёт ошибку (вы можете её увидеть в консоли).

    Мы добавляем в код функцию wp_localize_script(), которая передаёт в JS объект «настроек» (временную заглушку). Если ошибка исчезнет и слайдер отобразится, можно будет добавить пару строк, чтобы туда передавались реальные настройки из админки.

    • Ответ изменён 6 лет, 1 месяц назад пользователем Norske. Причина: разметка

    Попробуйте добавить в мой код после wp_enqueue_script( $handler ); вот это:

    wp_localize_script( $handler, 'color_blogObject', array(
        'menu_sticky' => 'on',
        'wow_effect'  => 'on'
    ) );
    • Ответ изменён 6 лет, 1 месяц назад пользователем Norske.

    В дополнение: если сайт не слишком нагруженный, возможно, есть смысл просто использовать плагин. Например, Really Simple SSL. Если вы не слишком увлечены администрированием серверов на уровне сертификатов и протоколов, это хороший вариант, из серии «включил и забыл».

    Теоретически, должно хватить и первого — результат эквивалентный. Разница здесь только в том, что в первом случае вы «перезаписываете» родительский хендлер, а во втором сначала «удаляете» его, а потом «создаёте заново». Второй подход по идее слегка избыточен, но удобен для отладки при проблемах. Если первый код справляется, оставляйте его.

    Это похоже на фильтрацию тегов при выводе html. Посмотрите, разрешен ли у вас вывод ссылок в функциях kses.
    <?php echo allowed_tags(); ?>

    Возможно, эти ссылки содержат какие-то дополнительные атрибуты, не разрешенные при фильтрации wp_kses_post(). В этом случае весь тег <a ...></a> будет вырезаться при выводе. Тогда нужно либо удалить проблемные атрибуты в редакторе, либо разрешить их через фильтр pre_kses. (Либо выводить контент страницы без использования the_content(), с собственной фильрацией).

    • Ответ изменён 6 лет, 1 месяц назад пользователем Norske.
    • Ответ изменён 6 лет, 1 месяц назад пользователем Norske.

    Нужный вам хэндлер 'color-blog-custom-scripts'.

    Строчка вызова этого скрипта находится в файле inc/template-functions.php:
    wp_enqueue_script( ‘color-blog-custom-scripts’, get_template_directory_uri() .’/assets/js/mt-custom-scripts.js’, array(‘jquery’), esc_attr( $color_blog_theme_version ), true );

    Добрый день!

    Если вы хотите полностью исключить родительский файл, попробуйте отозвать его регистрацию с помощью функции wp_deregister_script(). Что-то наподобие:

    function replace_parent_js_scripts() {
        $handler = 'mt-custom-scripts';
        $version = null;
        
        // Отключаем вывод родительского скрипта (если он выводится)
        wp_dequeue_script( $handler );
    
       // Отзываем регистрацию и освобождаем хэндлер
        wp_deregister_script( $handler );
    
        // Регистрируем скрипт заново, уже со ссылкой на измененный файл
        wp_register_script( 
            $handler, 
            get_stylesheet_directory_uri() . '/mt-custom-scripts-fix.js', 
            array( 'jquery' ),
            $version,
            true
        );
    
        // Можно здесь же добавить и вывод скрипта, 
        // хотя я бы вызывал его выборочно 
        // в конкретных нужных шаблонах
        wp_enqueue_script( $handler );
    }
    
    add_action( 'wp_enqueue_scripts', 'replace_parent_js_scripts', 11 );

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

    Пара заметок:

    • Иногда «отключенный» скрипт попросту зависает в кэше и в результате даже правильный код не даёт нужного результата. В таких случаях может помочь добавление версии скрипта в переменную $version.
    • Часто проблемы возникают из-за путаницы с путями (пропущенный слэш, неправильный относительный путь внутри каталога — например, пропущенная подпапка скриптов «js/» и т.п.). Хорошо бы убедиться, что запрашиваемый файл лежит именно там, откуда вы его запрашиваете (в консоли).
    • Юрий верно заметил, что нужно правильно подобрать приоритет add_action() (третий параметр должен быть выше, чем в родительской теме; по-умолчанию там 10, но может оказаться и больше).
    • Ответ изменён 6 лет, 1 месяц назад пользователем Norske. Причина: разметка

    Добрый день!

    Если пропал блок настроек, причин может быть много, самые простые такие:

    а) Поле просто скрыто с экрана. Найдите в правом верхнем углу надпись «Настройки экрана», нажмите, посмотрите нет ли там галочки для вашей пропавшей настройки. Если есть, поставьте её и настройка появится на прежнем месте.

    б) При восстановлении страницы изменились какие-то её настройки, которые соответствовали условиям показа произвольных полей (если, например, ваш счетчик был сделан с помощью плагина Advanced Custom Fields и настройка выводилась только для записей с определенным адресом, типом или рубрикой). Попробуйте найти в левом меню админки (обычно снизу) пункт «Группы полей» (или Custom Fields). Если он есть, зайдите туда и поищите группу полей, связанную с вашей настройкой. Она может назваться как по типу поля (счётчик, обратный отсчёт и т.п.), так и по типу страницы (главная, спецпредложения или как-то ещё). Если найдётся, то там нужно просмотреть условия показа поля. И настроить так, чтобы ваша страница со счетчиком им соответствовала.

    в) случайно отключили/удалили какой-то плагин, который собственно и внедряд счётчик. Попробуйте перейти в настройки плагинов (Плагины -> Установленные) и найти там что-то похожее среди «Неактивных». Если найдётся — наведите мышку и нажмите ссылку «Активировать».

    Могут быть и другие причины, разные, но их нужно искать с чуть более глубоким уровнем знаний, т.к. требуется лезть в файлы сайта. А варианты указанные выше чисто «пользовательские» — из тех, которые вы сможете определить и исправить своими силами. Самые простые случаи, если опция пропала «сама».

    • Ответ изменён 6 лет, 1 месяц назад пользователем Norske. Причина: опечатки

    Добрый день!

    Интересный вопрос. Разобрался.

    Вкратце:
    1. Действительно, дополнительные размеры для больших картинок генерируются.
    2. Оказалось, это новое штатное поведение. Оно появилось в версии 5.3, относительно недавно. Поэтому и «никто не замечал».
    3. Можно отключить с помощью фильтров и напильника (теоретически, лично не тестировал).

    Теперь подробности.

    Первоисточник

    Новое поведение картинок описано в статье «Представляем обработку больших изображений в WordPress 5.3» (текст англоязычный). Обосновывается тем, что огромные изображения зачастую загружаются прямо с камер и нуждаются в подгонке под «веб-оптимальный максимальный размер». (Мнение авторов, не моё. Обсуждать само решение здесь не стоит, лучше сделать это в первоисточнике 🙂 Ниже выжимка из статьи и кое-какие заметки.

    Как происходит обработка полноразмерных картинок

    При загрузке нового изображения WordPresss проверяет его высоту и ширину. Если размер одной из сторон превышает порог big_image (по умолчанию равный 2560px), изображение считается «большим». Порог можно переопределить новым фильтром big_image_size_threshold.

    Если изображение «большое», автоматически создается его уменьшенная версия. Её максимальная ширина и высота ограничены значением порога. Такая уменьшенная версия используется в качестве наибольшего доступного формата изображения. Оригинал при этом сохраняется в папке загрузок и его имя хранится в массиве мета-данных изображения в ключе original_image. Путь к оригиналу можно получить с помощью новой функции wp_get_original_image_path().

    Как отключить всё это

    а) [Официальная рекомендация авторов:] Использовать всё тот же фильтр big_image_size_threshold, возвратив ему false.
    add_filter( 'big_image_size_threshold', '__return_false' );
    Пара нюансов есть в комментариях к первоисточнику. И ещё есть вот это замечание, о том, что может понадобиться отдельно вычистить и промежуточные форматы для ретинных изображений.

    function filter_image_sizes( $sizes) {
    	unset( $sizes['1536x1536']); // disable 2x medium-large size
    	unset( $sizes['2048x2048']); // disable 2x large size
    	return $sizes;
    }
    add_filter('intermediate_image_sizes_advanced', 'filter_image_sizes');
    

    б) [«Ленивый» пользовательский вариант:] Использовать плагин Disable Big Image Treshold.

    в) [Радикально, хардкор:] Перейти на ClassicPress. Тем самым, избавиться от всяких неожиданных сюрпризов, вроде Гутенберга в ядре, внезапно распухающих картинок и прочих сыроватых и неоднозначных идей, которые неконтролируемо навязываются с версии 5.0+.

    Дополнительные заметки в помощь

    1. Возможно, есть смысл просмотреть все зарегистрированные размеры изображений с помощью get_intermediate_image_sizes(). Обычно я пользуюсь ей, чтобы исключить подобные сюрпризы (в том числе в ядре, т.к. в последнее время нововведения появляются быстрее, чем успевают нормально документироваться и читаться).

    2. В критичных проектах с большой базой картинок иногда проще использовать белый лист разрешенных изображений, примерно так:

    function remove_unused_image_sizes() {
    
        $allowed_sizes = array( 'thumbnail', 'medium', 'large' );
        $registered_sizes = get_intermediate_image_sizes();
    
        foreach ( $registered_sizes as $size ) {
            if ( ! in_array( $size, $allowed_sizes ) ) {
                remove_image_size( $size );
            }
        }
    }
    
    add_action('init', 'remove_unused_image_sizes');
    

    Это страхует от распухания папки загрузок, но требует внимательности при подключении плагинов, работающих с изображениями (например, ACF Image Crop и т.п.).

    3. После всех манипуляций лучше пройтись по базе каким-нибудь чистильщиком, чтобы повырезать остатки от неиспользуемых форматов и битые ссылки. Плагинов море, я пользуюсь Media Cleaner Pro.

    Успехов!

    Добрый день!

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

    Именно эта функция позволяет подменять перевод в зависимости от числа [отзывов] и указывает программам перевода, что для данной строки нужно выделить несколько отдельных полей. Таким образом, в первую очередь нужно убедиться, что вы пытаетесь перевести строку, которая правильно подготовлена для перевода.

    Если строка размечена правильно, она попадает в соответствующий языковой файл (.po/.pot) именно как строка с учетом форм множественного числа (plural). И перевод файла с такими строками можно без проблем сделать практически любым профильным инструментом.

    Настройка Poedit

    Poedit тоже умеет работать со множественными числами. Режим работы зависит от языка и в случае WordPress может быть уже настроен по умолчанию. И даже если не настроен, это всегда можно сделать вручную следующим образом:

    1. Открыть меню «Каталог» > «Свойства»
    2. Найти на вкладке поле «Формы множественного числа» и переключить его в режим «Пользовательское выражение».
    3. Скопировать в него следующую строку: ‪nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);

    Пусть это выражение вас не пугает, оно всего лишь определяет нужную форму множественного числа с учетом норм русского языка.

    Скриншот настроек Poedit:
    https://habrastorage.org/webt/uj/o5/t4/ujo5t4qchfop02s30vzb_1up4ts.png

    Скриншот результата (см. вкладки для разных форм числа в поле перевода):
    https://habrastorage.org/webt/ge/ev/9z/geev9zra0argwap9f0bbbhg9dgo.png

    Как правило, Poedit нормально настроен по умолчанию, так что скорее всего дело ваша строка просто неразмечена в коде. Нужно выяснить, откуда конкретно она возникает (плагин, тема, произвольное поле, ваш собственный код, ещё что-то?) и дальше решать по ситуации.

    • Ответ изменён 6 лет, 2 месяца назад пользователем Norske.
    • Ответ изменён 6 лет, 2 месяца назад пользователем Norske.

    Добрый день!

    Делал подобное пару лет назад. Точное решение навскидку не вспомню, но по ощущению надо копать куда-то в сторону эндпоинтов: add_rewrite_endpoint() и смежных доков. Попробуйте начать отсюда: https://wp-kama.ru/function/add_rewrite_endpoint Типовой механизм преобразования GET-параметров в ЧПУ абсолютно точно существует и я почти уверен, что ответ где-то на расстоянии пары ссылок от эндпоинтов 🙂

    P.S. Если не сложится, напишите, постараюсь на неделе поискать исходники того проекта.

Просмотр 15 ответов — с 16 по 30 (всего 36)