Задать вопрос
  • 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 и написать хостеру, очень часто хостер в таких ситуациях может подсказать с учетом настроек серверов.
    Ответ написан
    Комментировать
  • Как привязать домен к openserver?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Читайте Документацию OpenServer.
    Ответ написан
    Комментировать
  • Sidebar уходит вниз в мобильной версии?

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

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

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

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

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

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

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Есть такой пример:

    Ответ написан
    Комментировать
  • Как сделать сортировку по обновлению записей?

    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 для вывода скриптов в футере.
    Ответ написан
    Комментировать
  • Как реализовать такую кнопку?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Такие кнопки можно делать двумя способами:
    1. Кнопку как картинка
    2. Задать свойство background-image для родительского элемента

    Или вот еще пример кнопок с фоном на чистом CSS3:

    Ответ написан
    2 комментария
  • Как вывести произвольно поле на странице таксономии через Pods?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Можно попробовать пару таких вариантов:
    <?php
    $servicesTax = get_post_meta($post->ID, 'services_tax', true);
    echo $servicesTax;
    ?>

    И второй вариант:
    <?php 
    $servicesTax = get_post_custom_values( 'services_tax' );
    foreach ( $servicesTax as $key => $value ) {
    echo $value;
    };  ?>

    И вывод должен быть в цикле между:
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

    и
    <?php endwhile; ?>
    Ответ написан
  • Как в верстке уменьшить расстояние внутри одного блока?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    По вашему описанию сложно сказать. Нужно для вашего конкретного шаблона line-height последовательно смотреть для всех тегов от дочернего до родительского - a, p, li, ul, div.

    Если у вас выделенный красным фрагмент - это список (ul, li), то скорее всего для li нужно менять line-height.

    В Google Chrome в консоли выделите элемент, посмотрите код и перейдите во вкладку "Computed" (рядом со Styles), она как правило покажет какой line-height и от кого наследуется.
    Ответ написан
    Комментировать
  • Почему шоткод выводится на странице два раза?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Не используйте функцию extract() (работает по аналогии с array_merge). Считается плохим стилем и ее использование устарело даже для ядра Wordpress. Это небезопасно, часто создает много конфликтов, а также перезаписывает некоторые данные. Вполне вероятно, что проблема в этом. Лучше так:

    $args = shortcode_atts( 
        array(
        'rating' => 5, 
        'type' => 'rating', 
        'number' => 0,
        ), 
        $atts
    );


    В wp_star_rating есть последний элемент в массиве 'echo', он по умолчанию true. Я не тестировал эти функции, но можно попробовать его сделать false.

    И еще - по идее wp_star_rating() это встроенная функция. Может быть вместо того, чтобы переопределять функцию wp_star_rating(), просто использовать встроенную функцию?

    Для того, чтобы использовать эту функцию ваш шаблон должен включать файл wp-admin/includes/template.php. В документации есть примеры.
    Ответ написан
  • Почему поле виджетов наезжает на footer?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Потому что вы не указали для плагина "q2w3 fixed widget" в настройках "Стоп ID".

    В вашем случае у футера есть ID "colophon_TesseractTheme". Его, скорее всего и нужно указать в настройках плагина.
    Ответ написан
    Комментировать
  • Как сделать импорт иерархии страниц через WP All Import (CSV)?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    WP All Import предоставляет два варианта иерархической или вложенной таксономии, также известной как "родительская" и " дочерняя" таксономии.

    Подробнее на английском есть у низ в Документации.
    Ответ написан
    1 комментарий
  • Как подключить Ip камеру на сайт wordpress?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Есть некоторые готовые решения. Например, плагин "Broadcast Live Video – Live Streaming : HTML5, WebRTC, HLS, RTSP, RTMP" (ссылка).

    Насколько он вам может подойти - сказать сложно.

    Есть еще такое решение, где нужно указать логин, пароль, URL и немного покопаться. Плюс я не знаю насколько рабочее решение:

    // **************************************************** showCamera ****************************************************
    // *                                                                                                                  *
    // *      showCamera will display the video feed from an IP-based camera.  It accepts the following parameters:       *
    // *      url - this is the url of the camera (http://dockcam.jkshay.com, for example)                                *
    // *      port - this is the port on which the camera is listening                                                    *
    // *      user - this is the username used to access the camera                                                       *
    // *             I suggest creating a camera user with the username 'guest'                                           *
    // *      password - this is the password for the user specified above                                                *
    // *             I suggest creating a password 'guest' for the user specified above                                   *
    // *      width - this is the width of the videostream                                                                *
    // *      refresh - the number of milliseconds between image refreshes for IE                                         *
    // *      class - a CSS class attribute applied to the videostream to facilitate styling via CSS                      *
    // *                                                                                                                  *
    // *     NOTE: The credentials necessary to view your camera WILL be available to anyone who views the page source    *
    // *               DO NOT USE ADMINISTRATOR CREDENTIALS UNLESS YOU WANT PEOPLE TO MESS WITH YOUR CAMERA               *
    // *                                                                                                                  *
    // ********************************************************************************************************************
     
    function showCamera($parameters)
    {
    // Define accepted parameters and convert to PHP variables
     
    extract(shortcode_atts(array('url' => 'http://dockcam.jkshay.com', 'port' => '84', 'user' => 'guest', 'password' => 'guest', 'width' => '480', 'refresh' => '1000', 'class' => 'alignleft',), $parameters));
     
    // Build string of HTML code to be returned by the function call
    $results = "";
     
    // IE is unable to accept the videostream.cgi viewing method, so we need to deliver an alternate viewing method
    // We do this by introducing a javascript that will reload static images at a predefined rate
     
    // Check if the user is using Internet Explorer
    $results = $results."
    <!--[if IE]>";
     
    // Introduce javascript function to determine when to reload static image
    $results = $results."
    <script language='JavaScript' type='text/javascript'>
    function reload()
    {
       setTimeout('reloadImg(\"refresh\")',".$refresh.")
    };";
     
    // Introduce javascript function to reload the static image
    $results = $results."
    function reloadImg(id)
    {
       var obj = document.getElementById(id);
       var date = new Date();
       obj.src = '".$url.":".$port."/snapshot.cgi?user=".$user."&pwd=".$password."&t=' + Math.floor(date.getTime()/1000);
    }
    </script>";
     
    // Insert the HTML <img> tag to load the static image
    $results = $results."
    <img src='".$url.":".$port."/snapshot.cgi?user=".$user."&pwd=".$password."&t=' name='refresh' id='refresh' class=".$class." onload='reload(this)' onerror='reload(this)' width='".$width."'>";
     
    // Close the 'User is using IE IF block'
    $results = $results."
    <![endif]-->";
     
    // Check if the user is NOT using IE
    $results = $results."
    <![if !IE]>";
     
    // Insert the HTML <img> tag to load the videostream
    $results = $results."
    <img src='".$url.":".$port."/videostream.cgi?user=".$user."&pwd=".$password."' class='".$class."' width='".$width."' alt='Live Feed'/>";
     
    // Close the 'User is NOT using IE IF block'
    $results = $results."
    <![endif]>
    ";
     
    // Return function results
    return $results;
    }
     
    // Register this function with the WordPress framework as a shortcode
    add_shortcode('showCamera', 'showCamera');
    // ********************************************************************************************************************


    Добавляете в functions.php темы. Потом выводите шорткод [showCamera] на страницу или в статью.

    Также вот список плагинов по теме (платные и бесплатные):

    1. VideoWhisper
    2. S3Bubble WordPress Video Streaming
    3. bzplayer Pro
    4. All-in-One Video Gallery
    5. EmbedPlus for YouTube
    Ответ написан
    Комментировать
  • Как сделать такое меню?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Есть готовые решения, их много. Этот элемент называется Burger Menu. Ниже пример, который можно переделать по аналогии.

    Ответ написан
    1 комментарий
  • Fancybox работет не на всех страницах, как исправить?

    sergeiermilov
    @sergeiermilov
    Веб-дизайн, фронтенд и WordPress разработка
    Когда добавляли в статьей фотографии или галереи - вы указывали, чтобы ссылка вела на медиафайл? Если забыли, то при добавлении фото выбирайте: ссылка -> медиафайл.

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