Ответы пользователя по тегу WordPress
  • [Решено] Как исправить ошибку "There was an error. You are probably offline" при сохранении виджетов?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Недавно тоже столкнулся с данной проблемой на нескольких проектах, когда в WordPress при сохранении черновика появляется надпись "updating failed. you are probably offline" (рус. - обновление не удалось). И да, эта проблема часто возникает у тех, кто пользуется Gutenberg.

    Кроме решения от ТС в виде обращения к Хостеру ниже напишу пару вариантов решений от себя.

    Буквально недавно я каким-то образом проникся Gutenberg, хотя всё предыдущее время постоянно ставил плагин "Classic Editor", который возвращал старый добрый вордпрессовский редактор. Для решения "updating failed" пришлось копать весь Google, но большинство решений сводилось к тому, чтобы установить плагин "Classic Editor" и не мучиться.

    Но скажем честно, классический редактор - это костыль. Так как со временем все перейдут на новый Gutenberg, т.к. он удобнее априори. Итак, если вы хотите быстрое решение в виде костыля - бежим и устанавливаем плагин Classic Editor.

    Ну а тем, кто хочет разобраться - я подскажу направление куда копать. Реальная проблема заключается в SSL и здесь два варианта:

    1. Установлен непонятный SSL
    2. Криво сделана переадресация на HTTPS.


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

    Второй вариант заключается в том, что есть, скажем так, конфликт переадресаций. Обычно после установки WordPress на сайт с SSL в настройках мы прописываем HTTPS, плюс у WP есть внутренняя умная переадресация. Но также есть редирект на сервере с HTTP на HTTPS. И когда всё настроено криво, то при редактировании статей мы получаем ошибку "Mixed content", которую можно увидеть в консоли (например):

    63e642df142f3642525190.jpeg

    Какие действия можно предпринять?

    1. После установки SSL на сервер мы прописываем в настройках (Настройки -> Общие) адрес Адрес WordPress (URL) и Адрес сайта (URL) с HTTPS.

    2. Можно более жестко прописать в корне сайта в файле wp-config.php строки:

    define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
    define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');


    Если вы пропишете эти строки, то не сможете редактировать адреса через настройки.

    3. Устанавливаем плагин Really Simple SSL и активизируем его. Включаем редиректы в нем.

    4. Далее мы можем прописать в файле .htaccess следующие строчки:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
    </IfModule>


    Зачем они нужны? Очень часто при установке SSL и настройки переадресации с HTTP на HTTPS мы забываем делать переадресацию, например, с WWW на без-WWW, т.е. когда URL https://www.site.ru редиректит на https://site.ru. Эти строчки выше прописываются в htaccess с этой целью.

    Конечно, вы должны понимать, что случаи бывают разные и как правило лучше всего обращаться к хостеру, но если у вас на сервере Apache, то решение выше вполне может вам подойти.
    Ответ написан
    Комментировать
  • При переносе сайта пропали картинки. Сайт написан на WordPress. Какие могут быть варианты решения?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Смена домена. Через PHPmyAdmin запускаем SQL (меняем URL на свои):

    UPDATE wp_options SET option_value = replace(option_value, 'http://domain.ru', 'http://newdomain.ru') WHERE option_name = 'home' OR option_name = 'siteurl';
    UPDATE wp_posts SET guid = replace(guid, 'http://domain.ru','http://newdomain.ru');
    UPDATE wp_posts SET post_content = replace(post_content, 'http://domain.ru', 'http://newdomain.ru');
    UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://domain.ru','http://newdomain.ru');


    По поводу главной и других страниц:

    Нужно зайти в "Настройки" в Админке, потом "Постоянные ссылки" и просто нажать "Сохранить изменения".
    Ответ написан
    Комментировать
  • Почему не отображаются страницы в wp?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    1. С большой долей вероятности проблема с Базой Данных. Вы переносили сайт недавно? Создавали сайт и БД? Импортировали может быть БД?

    Попробуйте отредактируйте wp-config.php и добавить:
    define('WP_ALLOW_REPAIR', true);

    Затем нажмите на URL "ремонта" базы данных (но прежде не забудьте сделать бэкап):

    SITE/wp-admin/maint/repair.php

    2. Такое бывает на мультисайтах.

    3. Еще попробуйте стандартный способ с отключением плагинов.

    4. Проверьте functions.php темы на проблемный код.
    Ответ написан
    Комментировать
  • Идентификация действий пользователя на сайте Wordpress?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Вы можете использовать функцию get_current_user_id() и использовать её на всех активных элементах для отслеживания:

    <?php $user_id = get_current_user_id(); ?>
    <a href="/my-plugin-url<?php echo $user_id; ?>">View/Download plugin</a>


    Или просто использовать в ссылках:

    https://www.example.com/somepage/?userid=12

    Считается, что это не всегда безопасно и на 100% точно, т.к. некоторые "умные люди" любят копировать ссылки и удалять лишнее.

    Может быть есть смысл задавать переменную сеанса для отслеживания доступа к вашему сайту после авторизации пользователя.

    На зарубежных сайтах предлагали такое решение:

    1. создать GUID-значение, уникальное для этого пользователя после входа в систему и сохранить его на сеанс
    2. создать другие нужные переменные
    3. связать GUID с другими переменными
    4. добавить это значение к URL-адресу
    5. дать посетителю URL-адрес
    6. когда пользователь нажимает на URL-адрес проверяем значение GUID с переменной сеанса, чтобы убедиться, что оно совпадает с GUID в URL

    Если всё ок, то ок, а если нет - если нет пишем посетителю предупреждение/сообщение об ошибке с просьбой войти в систему и повторить попытку.

    GUID может быть легко скомпрометирован, поэтому сделайте его длиной в 40 символов. Генераторы GUID можно нагуглить.

    Храните его в качестве переменной сессии, тогда он будет доступен пользователю до тех пор, пока он остается на вашем сайте.
    Ответ написан
    Комментировать
  • Что значит и как убрать Index of /?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Неправильно настроен хостинг или что-то неверно указали в htaccess.

    Вы можете добавить в конец htaccess:

    Options -Indexes

    И на всякий случай для того, чтобы директории не открывались нужно добавлять index.php пустой, который есть во многих папках самого Wordpress с таким содержанием:

    <?php
    // Silence is golden
    ?>
    Ответ написан
  • Как убрать или изменить заголовок x-robots-tag?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Если смотреть по вашему скрину, то непонятно зачем вам изменять /wp-json, т.к. он и должен быть в noindex.

    Если вопрос в общем, то этот тег может задаваться на уровне:
    1. SEO плагин Wordpress
    2. robots.txt
    3. на уровне сервера

    Обычно и довольно часто в robots.txt можно найти такую директиву (или очень похожую):
    Disallow: */wp-json/*

    Дальше смотреть на целесообразность запрета.
    Ответ написан
  • Есть галерея Wordpress с возможностью пользователем с фронта загружать картинки?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Ответ написан
    Комментировать
  • Как сделать чтобы верхняя выдвижная панель вела себя стандартно?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    У вас в одном из файлов (custom) есть функция из-за которой видимо проблема и возникает. Её можно попробовать переписать таким образом:

    sticky_header: function () {
    
                        var position = jQuery('header').scrollTop(); 
                        var headerBar = jQuery('header').height();
    
                        jQuery(window).scroll(function() {
    
                            var scroll = jQuery(window).scrollTop();
    
       		if(scroll < position + headerBar) {   
    
                            jQuery(".sticky-header").removeClass("stick");
                            $(".search-wrapper").removeClass("open");
    
                            }else{
    
                            jQuery(".sticky-header").addClass("stick");
    
                            }
    
                        });            
    
            },


    Нужно пробовать, так сразу поведение не могу предсказать, но вроде должно помочь двигаться в нужном направлении.
    Ответ написан
    Комментировать
  • Как сделать подобный блок?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Непонятно, что вы имеете ввиду - стили или функционал характеристик для растений?

    Если вы про стили - то можно таблицей. А если про функционал, то тут есть два простых варианта:

    1. Использовать Woocommerce просто как каталог без корзины и возможности продажи товаров. И тогда вы просто выбираете подходящий шаблон и настраиваете Woocommerce.

    2. Использовать "Произвольные поля". Подробнее можно прочитать здесь.
    Ответ написан
    Комментировать
  • Как вывести название только дочерних категорий в Вордпресс?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Можно попробовать:

    <?php 
     $catsy = get_the_category();
     $myCat = $catsy->cat_ID;
        wp_list_categories('orderby=id&child_of='.$myCat); 
    ?>
    Ответ написан
    Комментировать
  • Как решить ошибку wc-ajax?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Скорее всего спасет просто чистка кукис в браузере.

    Также можно добавить вот это в wp-config.php:

    define( 'ADMIN_COOKIE_PATH', '/' );
    define( 'COOKIE_DOMAIN', '' );
    define( 'COOKIEPATH', '' );
    define( 'SITECOOKIEPATH', '' );


    Также в интернете есть мнение, что проблема связана с переадресацией и SSL, некоторым помогла эта строка:

    define( 'FORCE_SSL_ADMIN', true );
    if ( strpos( $_SERVER['HTTP_X_FORWARDED_PROTO'], 'https' ) !== false ) {
    	$_SERVER['HTTPS'] = 'on';
    }


    Ну и еще может быть стоит добавить вот эту строку в functions.php:

    add_filter( 'wc_session_use_secure_cookie', '__return_true' );
    Ответ написан
  • WooCommerce для товаров создает доп. картинки (450x450 и 100x100). Как это отключить?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Скорее всего тут у вас вопрос в том, что в XML есть указание ненужных вам размеров. И вам нужно удалить из самого XML эти строки с изображениями и размерами.

    Есть, конечно, пара вариантов отключить создание размеров.

    Первый вариант - это поиск в шаблоне темы Woocommerce подобных строк и их удаление:

    add_theme_support( 'woocommerce', array(
    'thumbnail_image_width' => 200,
    'gallery_thumbnail_image_width' => 100,
    'single_image_width' => 500,
    ) );


    Второй вариант - применение подобного сниппета:

    // Remove default WC image sizes
    function remove_wc_image_sizes() {
        remove_image_size( 'woocommerce_thumbnail' );
        remove_image_size( 'woocommerce_single' );
        remove_image_size( 'woocommerce_gallery_thumbnail' );
        remove_image_size( 'shop_catalog' );
        remove_image_size( 'shop_single' );
        remove_image_size( 'shop_thumbnail' );
    }
    add_action('init', 'remove_wc_image_sizes');
    Ответ написан
    Комментировать
  • Как сбросить цикл с помощью wp_reset_postdata();?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Если вы используете get_posts() вместо query_posts(), то wp_reset_postdata() можно использовать после foreach.

    Это же (wp_reset_postdata()) работает в случае WP_Query вместо query_posts().

    Если использовали query_posts(), то wp_reset_query() должна вызываться сразу после произвольного цикла и нужна, чтобы все условные теги работали правильно и глобальные переменные соответствовали текущей странице.

    Пример использования get_posts() вместо query_posts():

    $args = array( 'posts_per_page' => 3 );
    $lastposts = get_posts( $args );
    foreach( $lastposts as $post ){ setup_postdata($post);
    	?>
    	<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    	<?php 
    	the_content(); 
    }
    wp_reset_postdata();
    Ответ написан
    Комментировать
  • Как отключить у WP автоматическое редактирование страниц?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    От добавления p-тега можно избавиться таким сниппетом в functions.php темы:

    function disable_wp_auto_p( $content ) {
      remove_filter( 'the_content', 'wpautop' );
      remove_filter( 'the_excerpt', 'wpautop' );
      return $content;
    }
    add_filter( 'the_content', 'disable_wp_auto_p', 0 );


    Но подозреваю, что в вашем случае лучше всего делать через плагины шорткодов. Есть удобный Shortcoder:

    1. Создаете шорткод через плагин,
    2. Добавляете через "редактор кода" в плагине нужный код,
    3. Вставляете в то место в статье или на страницы, где должен выводиться код.

    Всё, верстка в чистом виде без лишних тегов. Можно вставлять JS, CSS, HTML.
    Ответ написан
    Комментировать
  • Почему не работает 404.php на основном домене в Wordpress multisite?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Походу это баг самого WP. Есть обращение WordPress Trac ticket (#21573).

    Может быть такое решение поможет - удалением функции:

    remove_action( 'template_redirect', 'maybe_redirect_404' );


    Добавить в .php файл в каталоге wp-content/mu-plugins. Не забываем добавить <?php в начале файла.

    Также нужно проверить htaccess и написать хостеру, очень часто хостер в таких ситуациях может подсказать с учетом настроек серверов.
    Ответ написан
    Комментировать
  • Sidebar уходит вниз в мобильной версии?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Смотря какая верстка у шаблона и как реализована адаптивность.

    Если, грубо, так:

    || Шапка ||
    _______________________________________
    || Сайдбар 1 || Каталог || Сайдбар 2 ||
    _______________________________________
    || Футер ||

    То "Сайдбар 2" в большинстве случаев будет на мобилках уходить под "Контент", т.е. так:

    || Шапка ||
    ________________
    || Сайдбар 1 ||
    || Каталог ||
    || Сайдбар 2 ||
    ________________
    || Футер ||

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

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Простое решение для сортировки по дате изменения такое:

    $the_query = new WP_Query( array(
         'post_type'   => $post_type,
         'orderby'     => 'modified',
         'order'       => 'DESC',
     ));
    Ответ написан
  • Как можно сделать, чтобы get_calendar() выдавала только посты из определенной категории?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Аналогичный вопрос и решение было на StackOverflow здесь.

    Вызов get_calendar():

    $cc = new YourSite_Category_Calendar('your-category');
    echo $cc->get_calendar();


    Класс PHP и код:

    <?php 
    
    class YourSite_CategoryCalendar {
      var $category;
      var $initial;
      var $echo;
      static function on_load() {
        add_shortcode('category-calendar',array(__CLASS__,'shortcode'));
        add_action('init',array(__CLASS__,'init'));
        global $wp_rewrite;
        $wp_rewrite->add_rule('^events/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)/?$',
          'index.php?post_type=event&year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&category_name=$matches[4]',
          'top');
        $wp_rewrite->flush_rules(false);  // Remove this after you've got it working
      }
      static function shortcode($attributes) {
        $attributes = wp_parse_args($attributes,array(
          'category' => false,
        ));
        $cc = new YourSite_CategoryCalendar($attributes['category']);
        echo $cc->get_calendar();
      }
      static function init() {
        register_post_type('event',array(
          'hierarchical'    => true,
          'label'          => 'Events',
          'public'          => true,
          'show_ui'         => true,
          'query_var'       => 'event',
          'rewrite'         => array('slug' => 'events'),
          'supports'        => array('title','editor','custom-fields'),
          'taxonomies'      => array('category'),
        ));
      }
      function __construct($category,$initial=true,$echo=true) {
        $this->category = $category;
        $this->initial = $initial;
        $this->echo = $echo;
      }
      function get_calendar() {
        add_filter('query',array(&$this,'query'));
        ob_start();
        get_calendar($this->category,$this->initial,$this->echo);
        $calendar = ob_get_clean();
        remove_filter('query',array(&$this,'query'));
        list($header,$body) = explode('<tbody>',$calendar);
        $find = '#(href="http://[^/]+)(/[0-9]{4}/[0-9]{1,2}/[0-9]{1,2}/)#';
        $replace = '$1/events$2'.$this->category.'/"';
        $body = preg_replace($find,$replace,$body);
        return "{$header}<tbody>{$body}";
      }
      function query($query) {
        if ($this->category) {
          global $wpdb;
          $find = "FROM {$wpdb->posts}\\s+WHERE";
          $add =<<<SQL
    INNER JOIN {$wpdb->term_relationships} calendar_term_relationship ON calendar_term_relationship.object_id={$wpdb->posts}.ID
    INNER JOIN {$wpdb->term_taxonomy} calendar_term_taxonomy ON calendar_term_taxonomy.term_taxonomy_id=calendar_term_relationship.term_taxonomy_id
    INNER JOIN {$wpdb->terms} calendar_term ON calendar_term.term_id=calendar_term_taxonomy.term_id
    WHERE calendar_term_taxonomy.taxonomy='category' AND calendar_term.slug='%s' AND
    SQL;
          $replace = "FROM {$wpdb->posts} {$add} ";
          $query = preg_replace("#{$find}#Us",$replace,$query);
          $query = preg_replace("#post_type\s*=\s*'post'#","post_type='event'",$query);
          $query = $wpdb->prepare($query,$this->category);
        }
        return $query;
      }
    }
    YourSite_CategoryCalendar::on_load();


    Автор ответа даже добавил использование шорткода, например [category-calendar category="party"].
    Ответ написан
    Комментировать
  • Как сделать перенаправление по IP на поддоменах?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Это серьезная задача. Для каждого города не один IP, а очень много, есть много справочников IP.

    Всего существует 4,22 миллиарда IPv4 адресов. Они делятся между странами. Внутри стран между интернет-операторами. Последние в свою очередь распределяют их между городами присутствия. А потом перераспределяют по необходимости.

    Существуют специальные реестры где зафиксировано это самое распределение

    Вам нужно начать с этой статьи на Хабре для понимания. Дальше уже решать с техникой решения задачи.
    Ответ написан
  • Код из head грузится в body - Wordpress, как исправить?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    В основном, когда браузер впервые сталкивается с элементом, который не должен быть в head, например, с элементом img, он закрывает head и вместо этого запускает body. Так что возможно, что есть что-то перед wp_head, что вызывает проблему.

    Вам нужно изучить фактический вывод HTML на наличие ошибок, а не смотреть на PHP, чтобы выяснить, что является причиной проблемы. Попробуйте запустить сайт через validator.w3.org и посмотреть на первые несколько ошибок, которые он найдет.

    Вы, вероятно, смотрите на исходник страницы с помощью инспектора браузера, который показывает вам DOM в памяти после того, как браузер исправил его, а не истинный исходник страницы, который, вероятно, будет в другом порядке. В Chrome, например, сравните разницу между использованием Web-инспектора и View->Developer->View Page Source, который покажет вам реальный код вывода до того, как браузер обработает его).

    Еще можно попробовать поставить wp_head в самое начало перед head. Может быть есть ошибки в scripts.js, который идет перед head.

    В любом случае, это попытка вашего браузера избежать недействительной разметки. Сайт выводит что-то, что не принадлежит тегу head, поэтому браузер закрывает его и открывает тег body. Если не плагины, то может быть в functions.php. Надо смотреть хуки для подключения CSS, JS, jQuery и добавления мета-тегов.

    Например, во всех wp_enqueue_script добавить $in_footer = true для вывода скриптов в футере.
    Ответ написан
    Комментировать