Вторник , 19 Март 2024
ДомойПубликацииСоздание простого плагина для WordPress

Создание простого плагина для WordPress

Друзья, привет-привет!

Сегодня создадим простой плагин для CMS WordPress. Будет это не стрёмная мифическая всевнушка, а простенький пак из кнопок «поделиться» для разных соцсетей и смежных сервисов. Думаете, никому не нужно? Не скажите, я то пользуюсь.

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

Пишем плагин для WordPress

Вообще, программирование под CMS совсем не то же самое, что написание скрипта на заказ. Система управления контентом предоставляет богатую функциональность, но при этом диктует «правила общения». Для примера, у многих веб-программистов есть свой набор библиотек для разработки. Подключение, допустим, класса для работы с базами данных — моветон. CMS содержит эти инструменты, и глупо их не использовать. Программист, которому в будущем потребуется дополнять код, будет очень «благодарен» за нежданную возможность покопаться в чужом классе.

Дабы не заморачиваться особенностями «шаринга» разных сервисов, сделаем оболочку на основе предоставленного Яндексом блока «Поделиться». Конечно же, можно добавить три строки «шаринга» сразу в файлы темы, но плагин имеет несколько преимуществ:

  1. не придётся вносить изменения в файлы index.php, single.php, page.php и прочих, если автор определил самостоятельный вывод каждого типа страницы;
  2. при обновлении или изменении темы не придётся править файлы;
  3. если захотите временно или навсегда скрыть кнопки, достаточно деактивировать/удалить плагин.

Простейшая реализация плагина

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

Создайте файл с именем YandexShareLite.php или любым другим и скопируйте в него код. После этого загрузите данный файл по фтп в каталог <корень_сайта>/wp-content/plugins/, зайдите в админку, в меню выбираете Плагины → Установленные, и жмёте ссылку Активировать для YandexShareLite.

<?php
/*
Plugin Name: YandexShareLite
Description: Добавление кнопок «поделиться» разных социальных сетей
*/

// подключим фильтр, срабатывающий перед выводом содержимого страницы (поста)
add_filter'the_content''yandexshare_run' );

// функция добавляет кнопки расшаривания перед постом
function yandexshare_run($content) {
    
// код со страницы https://tech.yandex.ru/share/
    
$data '
        <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script>
        <script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script>
        <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,gplus,twitter"></div>
    '
;
    
    
// возвращаем новое содержимое — код от Яндекса + старое содержимое
    
return $data $content;
}

Как это работает? С помощью add_filter() цепляется обработчик хука the_content. Обработчиком будет наша функция — yandexshare_run(). В качестве параметров передаётся содержимое поста. Таким образом, с ним можно делать вообще всё, что захочется. В данном случае, возвращаем код для генерации кнопок и старое содержимое.

WordPress славится своей расширяемостью. Это обеспечивает мехнанизм хуков, которые придуманы едва ли не на все возможные случаи. Полный список состоит из более, чем 1700, для версии движка 4.1, штук. Для написания плагинов знать всё не нужно. Официальной документации, обычно, хватает.

Продвинутая реализация плагина

Lite-версия получилась элементарной, верно? Не успели начать, а уже всё оказалось готово. Кто-то даже загорелся, что так же просто можно добавить код Google Adsense. Не буду разочаровывать — конечно же можно!

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

  1. выводить кнопки до и после поста;
  2. предоставлять интерфейс настройки размера кнопок (большие или маленькие) и выбора сервисов, интересных веб-мастеру;
  3. добавлять удобную ссылку «Настройка» в списке плагинов, чтобы хозяин блога мог сразу перейти к управлению внешним видом вывода;
  4. подчищать за собой данные при удалении.
<?php
/*
Plugin Name: YandexShare
Plugin URI: https://a-panov.ru/plagin-dlya-wordpress/
Description: Добавление кнопок «поделиться» разных социальных сетей
Version: 1.0
Author: Andi Panov <a@a-panov.ru>
Author URI: https://a-panov.ru/
License: GPLv2
*/

// подключим фильтр, срабатывающий перед выводом содержимого страницы (поста)
add_filter'the_content''yandexshare_run' );

// функция добавляет кнопки расшаривания перед и после поста
function yandexshare_run($content) {
    
// получить сервисы для иконок
    
$sharebtn get_option('yandexshare_bnts');
    
    
// если ни одного сервиса не выбрано, будем использовать только основные
    
if ( !$sharebtn $sharebtn 'vkontakte,odnoklassniki,facebook,twitter,gplus';
    
    
// показывать ли большие иконки
    
$bigbtn get_option('yandexshare_bigbtn');
    
    
// непосредственно код Яндекс Share. Детали — https://tech.yandex.ru/share/
    // необходимые скрипты
    
$script '
        <script type="text/javascript" src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js" charset="utf-8"></script>
        <script type="text/javascript" src="//yastatic.net/share2/share.js" charset="utf-8"></script>'
;
    
// здесь учитываем желаемые иконки и их размер
    
$data '<div class="ya-share2" data-services="' $sharebtn '"' . ($bigbtn '' ' data-size="s"') . '></div>';
    
    
// вывод данных: подключение скриптов единожды, блок кнопок до статьи,
    // статья и ещё один аналогичный блок кнопок
    
return $script $data $content $data;
}

// добавим пункт в основное админ-меню WP
add_action('admin_menu''yandexshare_admin_menu');
function 
yandexshare_admin_menu(){
    
add_options_page('YandexShare''Настройки YandexShare''manage_options''yandexshare-options''yandexshare_admin_manage');
}

// «морда» для управления настройками
function yandexshare_admin_manage() {
    
// какие иконки соцсетей доступны
    
$share_bnt_list = array(
        
'vkontakte'     => 'ВКонтакте',
        
'facebook'      => 'Facebook',
        
'odnoklassniki' => 'Одноклассники',
        
'moimir'        => 'МойМир',
        
'gplus'         => 'Google+',
        
'twitter'       => 'Twitter',
        
'blogger'       => 'Blogger',
        
'linkedin'      => 'LinkedIn',
        
'lj'            => 'Livejournal',
        
'viber'         => 'Viber',
        
'whatsapp'      => 'WhatsApp',
    );
    
    
// POST-параметры передаются из нашей формы настроек
    
if (isset($_POST['yandexshare_bigbtn'])) {
        
// большая кнопка
        
$bigbtn = empty($_POST['yandexshare_bigbtn']) ? 1;
        
        
// если установлено — добавляем в опции, иначе — удаляем,
        // т. к. значение по умолчанию и так ноль
        
if ($bigbtnupdate_option('yandexshare_bigbtn'1);
        else 
delete_option('yandexshare_bigbtn');
        
        
// если массив требуемых кнопок установлен...
        
if (isset($_POST['yandexshare_bnts']) && is_array($_POST['yandexshare_bnts'])) {
            
// приводим его к ожидаемому формату
            
$sharebtn =  $_POST['yandexshare_bnts']
                       ? 
implode(','$_POST['yandexshare_bnts'])
                       : 
'';
        }
        
        
// если сняты все отметки...
        
if (empty($sharebtn)) {
            
// удаляемся из настроек WP
            
delete_option('yandexshare_bnts');
            
// и оставляем значения по умолчанию
            
$sharebtn 'vkontakte,odnoklassniki,facebook,twitter,gplus';
        } else {
            
// иначе — установим требуемые кнопки
            
update_option('yandexshare_bnts'$sharebtn);
        }
        
$success true;
    } else {
        
// получить содержимое наших опций
        
$bigbtn get_option('yandexshare_bigbtn');
        
$sharebtn get_option('yandexshare_bnts');
        
        
// если ни одного сервиса не выбрано — выводим основные;
        // для деактивации плагина его нужно отключить!
        
if ( !$sharebtn $sharebtn 'vkontakte,odnoklassniki,facebook,twitter,gplus';
    }
    
$sharebtn_list explode(','$sharebtn);
?>
<div class="wrap">
    <h2>Настройки YandexShare</h2>
    <?php if ( isset($success) ) {
        echo 
'<div class="updated"><p>Настройки успешно сохранены.</p></div>';
    } 
?>
    <form action="" method="post">
      <table class="table">
        <tbody>
          <tr>
            <th>Использовать большие кнопки</th>
            <td>
              <select name="yandexshare_bigbtn">
                <option value="0">Нет</option>
                <option<?= $bigbtn ' selected="selected"' '' ?> value="1">Да</option>
              </select>
            </td>
          </tr>
          
          <tr>
            <th>Какие сервисы использовать</th>
            <td>
              <select name="yandexshare_bnts[]" size="<?= count($share_bnt_list?>" multiple>
                <?php foreach ($share_bnt_list as $k => $v) {
                    echo 
'<option ' in_array($k$sharebtn_list) ? 'selected="selected" ' '' 'value="' $k '">' $v '</option>';
                } 
?>
              </select>
              <p class="description">Убирать/отмечать произвольные сервисы можно с зажатой клавишей Ctrl</p>
            </td>
          </tr>
        </tbody>
      </table>
      <p class="submit"><input type="submit" value="Сохранить изменения" class="button button-primary"></p>
    </form>
</div>
<?php
}

// добавим ссылку на Настройки в списке плагинов
add_filter('plugin_action_links''yandexshare_links'102);

// подцепим ссылку на Настройки
function yandexshare_links($links$file) {
    
$plugin_file basename(__FILE__);
    if (
$file == $plugin_file) {
        
$settings_link '<a href="options-general.php?page=yandexshare-options">Настройки</a>';
        
array_unshift($links$settings_link);
    }
    return 
$links;
}

// если плагин удаляется, подчистим все следы деятельности
register_uninstall_hook(__FILE__'yandexshare_remove');

// функция для удаления устанавливаемых плагином опций
function yandexshare_remove(){
    
delete_option('yandexshare_bnts');
    
delete_option('yandexshare_bigbtn');
}

Кода стало гораздо больше, но логически за всё отвечают 4 блока.

Вывод кнопок

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

Настройка функций плагина

Подключение настроек выполняется в 2 этапа. Сначала подцепляем экшен admin_menu, который вызывает функцию yandexshare_admin_menu. Данная функция определяет страницу с настройками. Ссылка появится в меню Настройка, под названием Настройки YandexShare, видна будет только администратору — опция manage_options. Идентификатором меню будет строка yandexshare-options, а за отображение страницы наших настроек отвечает функция yandexshare_admin_manage().

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

Добавление ссылки настройки в списоке плагинов

Реализуется с помощью фильтра plugin_action_links. Функция-обработчик — yandexshare_links() — принимает список установленных ссылок и имя файла-плагина. Нам нужно узнать вызов «своего» плагина и добавить туда новый элемент.

Удаление сохранённых данных

С помощью функции register_uninstall_hook() можно указать свою функцию, которая будет вызвана при удалении плагина. Хорошо, если плагин подчищает за собой, не оставляя ненужных данных. У нас определяются две настройки: yandexshare_bigbtn для вывода маленьких кнопок и yandexshare_bnts, содержащая список сервисов.

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

Успехов!

Рейтинг: 0

Автор публикации

2 070
не в сети 11 месяцев

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (5 голосов, в среднем: 5,00 из 5)
Загрузка...

77 комментариев

  1. О, это гениально, я как раз собиралась подобрать себе такой плагин, но все какие-то большие и из-за них сайт медленно грузится.
    smile Вовремя я к тебе заглянула!!!!

    Рейтинг: 2
  2. Андрей, поздравляю вас с Днем защитника Отечества! Желаю крепкого здоровья и чистого неба над нашими головами!
    Большое спасибо за нужную информацию. Я поставила маленький первый плагинчик у себя на сайте. Набралась храбрости и немного его изменила, как-то уяснив, что если поменять местами переменные $data и$content , то вначале будет выводиться содержимое статьи, а потом кнопки социальных сетей, что мне и нужно было, так перед статьей кнопки у меня уже стояли.

    Рейтинг: 2
    • Софья, благодарю за поздравления!
      Совершенно верно: если поменять эти переменные, то блок кнопок будет после статьи. Для определения внешнего вида нужно описа́ть класс в css-файле:
      .ya-share2 {}

      Рейтинг: 1
      • Андрей, спасибо за дополнение, а еще в конце плагина я поставила ?> или это по умолчанию ставится?

        Рейтинг: 2
        • Софья, для php-файлов это совершенно необязательно. Даже рекомендации встречаются не делать этого. smile

          Рейтинг: 0
          • Есть наблюдения, что если после закрывающей скобки PHP кода нет тегов HTML и присутствуют пробелы или другие, «незримые» символы — вместо выполнения кода PHP на экран может быть выведен сам листинг кода.

            Это опасно, так как может быть использовано для взлома сайта.

            Если после окончания кода PHP нет тегов HTML, то безопаснее закрывающую скобку ?> не ставить. Интерпретатор PHP сам поймет, что код закончился, а больше — никому ничего понимать не требуется. Отследить отсутствие «незримых» символов за скобкой ?> очень проблематично, особенно когда файлов с кодом PHP много.

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

            Рейтинг: 1
            • Денис, когда ты всё успеваешь? Уже и пых учишь)

              Рейтинг: 1
              • Анди, если бы я успевал… В час по чайной ложке начал с пыхом знакомиться.

                Принимаю пожертвования помощи от более опытных товарищей.

                Не-е! Это не намек, ни в коем случае… Просто просьба smile

                Рейтинг: 1
                • Лучше так: «приму в жертву программиста, способного реализовывать в кратчайшие сроки все задания, согласного работать за еду, которую добудет самостоятельно» laugh
                  Денис, есть вещи второстепенной важности. ЯП — одна из них)

                  Рейтинг: 0
                  • Лучше так: «приму в жертву программиста, способного реализовывать в кратчайшие сроки все задания, согласного работать за еду, которую добудет самостоятельно»

                    Не… Такой не подойдет. ЯП (добавлено позже: *я глубоко заблуждался, думая, что ЯП — это Яндекс Поиск, оказалось язык программирования, каюсь*) — один из них. Редко кто пишет понятно, а если и сделал такое чудо, то оно, как правило, морально устарело.

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

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

                    Можно, конечно, расписаться в собственной несостоятельности, но это не совсем мой случай dash boast dash

                    Рейтинг: 1
                    • Денис, тут смотря что и как рассматривать.
                      Если вещь, то «одна из». Если «Язык Программирования», то вроде как «один из», но Ада — всё же «она» (:

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

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

                      Кстати, пока я новичок — я стараюсь делать конспекты. Хочешь скажу тебе на почту, где я это делаю? Будешь за мной приглядывать smile

                      Рейтинг: 1
                    • Денис, вот она, яркая иллюстрация твоих слов.
                      Извини, даже в голову не пришло, что могут подумать про Яндекс Поиск sad
                      Денис, если про конспекты скажешь — будет здорово! Может где-то даже сумею помочь.

                      Рейтинг: 0
  3. Тема интереснейшая. Но, похоже, до уровня самостоятельного создания плагинов для WordPress дорасту не скоро. Так что, наверное, пока воспользуюсь готовым предложенным решением — от сторонних сервисов с кучей ненужных кнопок пора избавляться.

    Рейтинг: 2
    • Константин, если что-то создавать не требуется, да и вообще, эти знания не пригодятся, продуктивнее забить мозг полезной информацией smile

      Рейтинг: 1
      • К некоторым вещам порой подход нелогичный. Вроде бы и не надо, но интересно же! Если бы не постоянный дефицит времени, на развитие совершенно не нужных на первый взгляд навыков уходила бы уйма времени.

        Рейтинг: 1
        • Константин, не верю, что Вы тратите время на развитие ненужных навыков!

          Рейтинг: 0
          • Так о том и речь, что времени нет, потому и не трачу. Ответственность не позволяет. А так, если вспомнить школьные, студенческие годы и чуть позже, то сколько человеко-часов было потрачено на изучение не нужных, по-сути, языков, подумать страшно ) В школе, помимо немецкого, отучился на курсах эсперанто, самостоятельно, из любопытства, пытался освоить идиш — просто попался хороший самоучитель. Поступив институт, сразу же записался на курсы японского (до сих пор где-то лежат таблицы с катаканой и хираганой). Затем был шведский, но на нем я хотя бы несколько месяцев пообщался с носителями языка. Последний пункт — английский, который, опять же, по собственной воле, начал изучать со старшей дочерью. Внимание, вопрос: ну и нафига мне эти знания, если обладая ими на любительском уровне, я никогда не смогу сделать их источником своего дохода? То же можно сказать и о музыке: гитара пылится в углу за шторой, синтезатор — в коробке под кроватью. Ненужные навыки, получается — это все то, в чем не достигаешь профессионализма, т.е. не зарабатываешь на этом.

            Рейтинг: 1
            • Константин, с другой стороны, если не пробовать что-то новое, как узнать, что занимаешься именно тем единственным, к чему наивысшая склонность? smile

              Рейтинг: 0
              • Константин

                Хорошо, Андрей, перефразирую вопрос: А как быть, если наивысшая склонность — к тому, в чем навсегда суждено остаться любителем? История знает примеры нищих деятелей искусства, того же Ван Гога, которому при жизни не удалось продать ни одной своей картины (по другим сведениям — всего одну). Я к тому веду, что занимаясь любимым делом, можно и семью заморить, и самому зубы на полку положить. В наш век большинству приходится заниматься не тем, что нравится, а тем, за что платят или возможно заплатят. Поэтому и осваивать приходится вовсе не то, к чему есть склонность. Ну да ладно, от темы статьи и так уже далеко ушли, не буду больше засорять страницу ))

                Рейтинг: 1
                • Гений — 10% таланта и 90% труда (встречаются вариации 5%/95% или 1%/99%).
                  Хочется стать великим или хотя бы известным? Пашем, возможно даже, в ущерб семье. Но это личный выбор конкретного человека. В любом случае, жертвовать чем-то придётся.
                  Не исключается вариант работы на себя с целью узнать больше. Но какие у этого перспективы? Разве что выучить одно/другое/третье дабы понять, что нужно было четвертое/пятое/шестое.
                  Популярность Ван Гога не понимаю, объяснить можно разве что маркетингом: настоящего Искусства так мало, а людей, готовых платить за него деньги — очень много. Проводим пиар кампанию популяризации какого-нибудь художника с большим числом картин → Профит!
                  Александр Андреевич Иванов творил главный труд жизни 20 лет. Получилось действительно величественно, аж дух захватывает! Одна из немногих картин, которые запомнились после «Третьяковки».
                  К чему портянка выше? Развитие «в себя» мало продуктивно. Поэтому, что-то делаем для людей и даём им это, не обязательно бесплатно. А интернет здесь очень хороший помощник.
                  Нравится, допустим, вязание. А чем плохи вязаные чехлы для айфона? Уж всяко лучше палки для селфи. Вяжем, фотаем, выкладываем в соц-сети, собираем заинтересованных в группу, и далее, далее, далее…
                  Константин, да где же оффтоп-то? smile Простое обсуждение со взглядом с разных сторон. Очень ценно!
                  Спасибо!

                  Рейтинг: 0
  4. Это очень интересно и удобно. Тем более, что мой блог на WordPress. Но с первого прочтения пока не все поняла. Явно программирование «моя тема» smile Вечером попытаюсь второй раз прочитать!

    Рейтинг: 2
  5. Надежда Давыдова

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

    Отношусь к числу тех, кто копаться не любит и предпочитает простой плагин ковырянию в кодах )

    Рейтинг: 2
  6. То есть, добро получено) Будет муза, можно писать о любви к программисту), его покорении и захвату в плен)

    Рейтинг: 1
  7. Мне в этом во век не разобраться.

    Рейтинг: 1
  8. Это Вам так кажется. Есть у меня блог на Вордпресс, но я могу писать только статьи, поэтому он у меня где-то так далеко болтается в интернете, что посещаемость нулевая, как впрочем и пузомерки.

    Рейтинг: 1
  9. Ну например без ТИЦ 20 на биржу Блогун не берут, на Ротапjсте тоже никому не нужен. С другой стороны если бы была большая посещаемость то и пузики не нужны бы были. Мой скайп nadiyaevgen

    Рейтинг: 1
  10. Согласна. Это только какой нибудь залетный не опытный рекламодатель закажет рекламу, хотя на это рассчитывать не стоит. Но опять же таки денег на раскрутку не имею, врач на пенсии, да еще и вдова, а пенсия примерно 33 доллара. Вот поэтому и написала что статьи писать умею, а раскручивать блог ума не хватает. Вы уж извините, что-то я разоткровенничалась.

    Рейтинг: 1
  11. Свой код, конечно, всегда удобней. Можно сделать все, что угодно. Но я предпочитаю готовые плагингы, иногда их только слегда дорабатываю

    Рейтинг: 1
  12. Андрей, ну, вот что тут скажешь мастер ты. И всё. smile
    А ваш диалог с Заюшей — просто супербонус к сложной (для гуманитариев) статье smile crazy Кстати, идею о статье с лайфхаком «Как выйти замуж за программиста» очень поддерживаю! smile Думаю, с ней вы вырветесь в ТОП всех возможных систем. ;) smile

    Рейтинг: 1
    • Светлана, благодарю. Вспомнился отрывок из к/ф Хоттабыч, правда, там не совсем про программиста:
      — Да укради ты хотя бы чайник из интернета. Иначе ты не хакер, а придурок какой-то.
      — Лааадно…

      Рейтинг: 0
      • Хакер=программист=спец по железу, многие думают, если ты связан с компьютером значит должен все уметь и все знать! Так что давай, хакер чайничек новенький crazy

        Рейтинг: 1
  13. Вот, хорошо, когда семья работает в одном направлении, но не скрою, что хорошо просто иметь рядом понимающего человека, пусть и работающего совершенно в иной сфере.
    Поддерживаю идею со статьей из личного опыта — как выйти замуж за программиста. smile

    Рейтинг: 1
  14. Имею две специальности технические, и убеждён, что надо заниматься своим делом. Программисты пусть программируют, блогеры пусть пишут. Не получится ничего путного из симбиоза того и другого. Как все в стране — все знают обо всём понемногу…

    Рейтинг: 1
  15. У меня из за стилей шаблона выходит см. скрин

    Рейтинг: 1
  16. Как исправить? В CSS не силен особо.

    Рейтинг: 1
  17. Придется удалять (

    Рейтинг: 1
  18. Вмешиваются стили списка. Я проповал прописать свои в селекторе .ya-share2 {} но ничего не произошло. Некоторые из ваших комментаторов, я заметил, тоже его установили и у них аналогичная ошибка. Выходит у всех так.

    Рейтинг: 1
  19. Не зная точно, что именно влияет, можно только гадать по теме «чего ж им не хватает, заразам?»
    У кого из комментаторов аналогичная ошибка? smile
    Если напишите адрес, по которому можно посмотреть проблемный вывод, скажу, что поправить. Без кода можно много чего посоветовать, и всё же не угадать.

    Рейтинг: 0

Оставить комментарий

Политика конфиденциальности

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

Принять