Комментарии
Совести у вас нет, человек старался, писал код, а тут вы со своим Та-да…
Нормальное решение, кстати. Только почти для любой livejournal-подобной блогплатформы не подходит. Livejournal, dreamwidth и Li.ru — там на favicon-ах не человечки
Тоже хорошее решение!

Но не очень гибкое — например, у Ли.рушечки два эккаунта, для мальчиков и для девочек.
Вам шашечки или ехать? :) Я думал что суть в
показывать рядом с ником человека, на которого я ссылаюсь, ещё и значок его сервиса"
а не статус аккаунта…
Вам нужно — вы и делайте. Суть плагина не в этом же.

Ну честное слово, люди, имейте капельку уважения к автору.
Аaaaa! читайте про замыкания в JS и вам не понадобиться эта простыня.
init : function(ed, url) {
    for ( i in newButtons) {
        var itemTitle = newButtons[i];
        (function(itemTitle) {
            var itemCommand = 'mce'+itemTitle;
            ed.addCommand(itemCommand, function() {
                var newcontent = '[userid type="'+itemTitle+'"]' + tinyMCE.activeEditor.selection.getContent({format : 'raw'}) + '[/userid]';
                    tinyMCE.activeEditor.selection.setContent(newcontent);
                });
            ed.addButton(itemTitle, {
                title : itemTitle,
                cmd : itemCommand,
                image : url + '/img/'+itemTitle+'.gif'
            });
        })(itemTitle);
    }
}
И к стати все со стандартным способом передачи строк в JS должно работать просто надо это повесить на
admin_print_scripts-post-php в данном случае
И еще, я не понимаю зачем нужен github, если плагин уже есть в svn wordpress-а с кучей плюшек типа автоапдейта на сайтах и прочее?
Потому что писалось сперва локально и надо было где-то хранить изменения.

Недописанный огрызок кода в директорию wordpress-а не возьмут.
Я обычно пишу код в дропбоксе, а когда он уже рабочий, отправляю на wordpress.org
С git-ом оно ещё проще — можно делать коммиты локально, без синхронизации.
\
Другое дело, что когда я заканчивал код, я ещё не знал, куда его правильно заливать.
С svn-ом тоже проще, можно делать коммиты в ветку (branches), без синхронизации ;) а когда наберётся достаточно комитов, можно мерджить. Только вот мерджи в svn плохо работают когда более 1 человека на проекте, git лучше справляется с конфликтами :)
В директорию WordPress.org возьмут любой недоработанный код, главное readme.txt правильно оформлять. На то и даётся вам репозиторий с директорией trunk :)
Когда в JS есть цикл и вместо нормальных последовательных значений вдруг всегда только последнее — значить нужно замыкание :)
А передачу строк в JS лучше бы таки сделали — константы надо описывать один раз.
Способ нужный и полезный.

Однако в этом случае ещё важна возможность настройки — какие кнопки показывать, какие нет. Страшновато вставлять 12 кнопочек сразу.
Внёс изменение в статью. Что не отменяет того факта, что в tinyMCE — баг :)
10500 кнпочек в редакторе ради вставки картинки, вы шутите? Одна кнопка которая вставляет ссылку, а дальше уже идет ее разбор на принадлежность к платформе.

Ну и CSS объявить описать классом и выводить в заголовок, с возможностью отключения.
Здорово, спасибо за статью! Есть немного замечаний :)

* Класс «socialusers» и шорткод «userid» могут вызвать конфликт с другими плагианами, которые решили свои классы и шорткоды так же назвать. Берите более уникальные называния, например с префиксом: Rikki_Social_Users и [rikki_userid]. Было много примеров где знаменитые плагины были вынуждены менять свои шорткоды.

* Функция add_shortcode появилась в WordPress 2.5. Если вы не собираетесь поддерживать WordPress 2.4, вам не нужно проверять её наличие с function_exists.

* Callback функции в объекте класса нужно было передавать по ссылке в php 4, а в php 5 все объекты по умолчанию будут передаваться по ссылке, поэтому можно писать array( $this, 'mce_buttons' ); без &.

* Не стоит забывать о безопасности. Пользователь может ввести что-нибудь вроде: foo.com' onclick='...' в вместо URL, и ваш код подставит его XSS в вашу ссылку, даже если он не имеет право публиковать unfiltered_html. В данном случае нужно esc_url(). Подробнее: codex.wordpress.org/Data_Validation

Вообще идея клёвая, но я бы не стал её реализовывать таким образом. Я бы лучше добавил 10 своих иконок (а скорее даже один спрайт) + 10 правил в CSS, и в постах добавлял бы класс:

<a href="http://twitter.com/kovshenin" class="twitter">kovshenin</a>


И если вдруг плагин сломался, перестал поддерживаться автором, не совместим с WordPress версией 3.6, или же просто надоел, то все мои существующие посты будут всё равно отображаться, пусть без иконок, но всё же не придётся бегать по базе и искать все [userid.

Ещё раз спасибо за статью!

P.S. WordPress правильнее писать с заглавной буквы P: capitalp.org/
Спасибо на за подробный разбор.

> * Класс «socialusers» и шорткод «userid» могут вызвать конфликт с другими плагианами, которые решили свои классы и шорткоды так же назвать. Берите более уникальные называния, например с префиксом: Rikki_Social_Users и [rikki_userid]. Было много примеров где знаменитые плагины были вынуждены менять свои шорткоды.
==

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

> * Функция add_shortcode появилась в WordPress 2.5. Если вы не собираетесь поддерживать WordPress 2.4, вам не нужно проверять её наличие с function_exists.

Это проверяется. См. строчку:

if (!function_exists ('add_shortcode') ) return;

> * Callback функции в объекте класса нужно было передавать по ссылке в php 4, а в php 5 все объекты по умолчанию будут передаваться по ссылке, поэтому можно писать array( $this, 'mce_buttons' ); без &.

Это для совместимости с версиями Wordpress младше 3.2 Gershwin, которые ещё могли работать на PHP4. Не знаю динамики, но возможно где-то ещё остались пользователи старых версий (3.2 вышла год назад).

> * Не стоит забывать о безопасности. Пользователь может ввести что-нибудь вроде: foo.com' onclick='...' в вместо URL, и ваш код подставит его XSS в вашу ссылку, даже если он не имеет право публиковать unfiltered_html. В данном случае нужно esc_url(). Подробнее: codex.wordpress.org/Data_Validation

Надо будет поставить. Хотя есть элемент свободы — плагины всё равно можно ставить только на standalone, и если блоггеру угодно ломать свой standalone через XSS — это его право :).

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

> И если вдруг плагин сломался, перестал поддерживаться автором, не совместим с WordPress версией 3.6, или же просто надоел, то все мои существующие посты будут всё равно отображаться, пусть без иконок, но всё же не придётся бегать по базе и искать все [userid].

Это тоже хорошая идея. И вполне можно бы было ограничиться JS-дополнением — от PHP требовалось бы только инциализировать кнопки.

Но опасаюсь конфликта с CSS-настройками текущей theme. Мало ли, что у них на уме.

> P.S. WordPress правильнее писать с заглавной буквы P

Это да. Впрочем, и статьи надо писать днём, а не в час ночи, как я :). Тогда и буква P будет на месте.
Рад что мой ответ принёс какую-то пользу =)

> Это проверяется. См. строчку:
> if (!function_exists ('add_shortcode') ) return;

Прочитайте внимательно ещё раз: «Если вы не собираетесь поддерживать WordPress 2.4, вам не нужно проверять её наличие с function_exists.» :)

> Не знаю динамики, но возможно где-то ещё остались пользователи старых версий (3.2 вышла год назад).

Статистику можете посмотреть здесь: wordpress.org/about/stats/ и обратите внимание на версии PHP — 99.5% версии 5 и выше. Поддерживать всё, что ниже двух последних версий не стоит, ровно так же как и IE6 ;) А если всё же вас кто-нибудь спросит насчёт поддержки 3.1, вы можете смело попросить их обновиться.

> Надо будет поставить. Хотя есть элемент свободы — плагины всё равно можно ставить только на standalone, и если блоггеру угодно ломать свой standalone через XSS — это его право :).

Защита в данном случае от пользователей которые не имеют доступ к FTP или админ-права на сайте. Если бы все standalone сайты имели только одного пользователя админ, то проблем бы не возникало, но у нас ведь есть ещё и авторы, и редакторы, и контрибюторы, и за счёт плагинов может быть ещё масса ролей без права на unfiltered_html, как в оригинальном WordPress, так и в сетевом варианте WordPress Multisite.

Короче говоря, это не «элемент свободы» а дырка :) и как только пользователи на неё пожалуются на WordPress.org, ваш плагин оттуда исчезнет, так что поторопитесь :)

> Но опасаюсь конфликта с CSS-настройками текущей theme. Мало ли, что у них на уме.

Да, вы правы, нужен снова префикс, rikki-twitter :)
На wordpress svn и в github я тоже обновил. Так что смело устаскивайте в свой fork обновления :)
>обратите внимание на версии PHP — 99.5% версии 5 и выше. Поддерживать всё, что ниже двух последних версий не стоит, ровно так же как и IE6 ;) А если всё же вас кто-нибудь спросит насчёт поддержки 3.1, вы можете смело попросить их обновиться.

ну, изредка появляются товарищи на php4. Были просьбы сделать плагин совместимым, потому как хостинг такой
Таким товарищам нужно помогать. Помогать выбирать хороший и безопасный хостинг. Ровно так же, как и помогать заказчикам переходить на более свежие версии IE, нежели писать поддержку IE6 в своих работах.
Сложно сказать что лучше для меня, для пользователя или для кармы. Чуток подправить обьявление классов и ссылки или решать чужие проблемы? А с IE6 я делаю просто — если платят ( причем за IE6 как за всех остальных ) я делаю, хотя таких уже не осталось. Те что были со старыми версиями сидели не от хорошей жизни.
> Чуток подправить обьявление классов и ссылки

Если писать для php4, то нужен весь цикл, нужно установить те версии WordPress, которые работают под php4 и нужно установить сам интерпрератор и всё протестировать от начала и до конца. Только после этого, можно будет говорить о совместимости.

А если вы поставили пару амперсандов и думаете, что оно всё заработает на php4 и WordPress 3.1, то вы ошибаетесь :)
Всё это напоминает дикие игры с Python 2/3. Половина примеров в сети — для 2.x, половина — для 3.x. В итоге приходится держать в голове 2 языка со всеми эквивалентами.
делать мне больше нечего как ставить php4
плагин у товарища работает, с дебуг флагом никаких варнингов нет — и ладушки

Тут для network activation все менялось в последних версиях — вот это засада. Конструкция уже выглядит ужасающе.
> делать мне больше нечего как ставить php4

Вот это всё и объясняет :)
Гы, я рад за вас.
Может приведете хоть один резон за php4?
Ха! Я изначально написал, что поддерживать WordPress 3.1 и особенно PHP4 не стоит, на что вы ответили:

> ну, изредка появляются товарищи на php4. Были просьбы сделать плагин совместимым, потому как хостинг такой

Поэтому если вы собираетесь делать поддержку PHP4 и WordPress 3.1, то нужно делать её правильно, а не тяп-ляп, что некогда даже интерпретатор установить =)

> Может приведете хоть один резон за php4?

В отличии от вас, нет. :)
WP с 2.9 до 3.4.1 у меня как раз стоят, причем в двух вариантах, а работоспособность в php4 просто фича, которая лично мне не интересна, но почему-то нужна некоторой публике и достигнута она была очень просто и без ущерба для функциональности.
За одно ближе к вечеру будет проведен краш-тест сайту lurkmore.to на сопротивление хабраэффекту :)
К стати забыл написать, что лучше проверять наличие инстанса класса прежде чем обьявлять класс и реализовывать. Я уже не помню когда и где, но были проблемы с тем что WP в каких-то случаях плагин инклюдит несколько раз.
При загрузке плагинов wp-settings.php использует include_once: core.trac.wordpress.org/browser/tags/3.3.1/wp-settings.php#L194 поэтому при нормальных обстоятелствах, файл будет исполнен только один раз.

Если вдруг ваш плагин подгрузился два раза за один запрос, значит что-то работает не правильно, где-то допустили ошибку, и нужно в этом разобраться, а не просто class_exists поставить. :)

Функция class_exists здесь будет полезена в том случае, если у вашего класса не совсем уникальное имя, как например «socialusers» или же, если ваш плагин является частью темы или другого, более крупного плагина, как например Jetpack и Polldaddy, Grunion Contact Form, WP-Stats, и т.д.
>при нормальных обстоятелствах

а еще бывают ненормальные :) это было где-то между версиями 2.9 и 3.2
мне лень смотреть когда это было и почему, а вот вставить пару проверок в шаблон плагина — это полезно
Не нужно обвинять WordPress, если вы воспользовались криво-написанным плагином или темой :) Ещё в версии 1.5 плагины загружались с include_once(). Вряд ли «где-то между версиями 2.9 и 3.2» это изменилось на include() а потом обратно.

core.trac.wordpress.org/browser/tags/1.5/wp-settings.php#L111

Поправьте меня, если я не прав :)
Плагины еще активируются с хуком, а еще бывает крон и аякс, и еще в разных местах wp_load инклюдиться
В принципе конечно это разные скопы, иначе ломается все, но если в конструкторе что-то делать зависимое от состояния то можно влететь

Но самый простой случай — это просто сдублировать файл плагина :) У меня один заказчик старые копии зачем-то в подпапку складировал.
Активируются плагины особым образом — опять же через редирект, чтобы если вдруг плагин сломанный, весь WordPress у вас не сломался.

core.trac.wordpress.org/browser/tags/3.4.1/wp-admin/includes/plugin.php#L533

WP_Cron запускается в отдельном HTTP запросе, даже если выставлен ALTERNATE_WP_CRON, то происходит всего лишь редирект. Никакой магии нет. И admin-ajax.php в этом плане ничем не отличается, wp-load.php он и в африке wp-load.php :)

А вот ваш «простой случай» всё объясняет, но WordPress тут, извините, абсолютно не причём. И не важно, версия 2.9 или 3.2 :)
Ваши инициалы случайно не К.О.? :)

Я лично наблюдал фишку с двойным вызовом с ошибками переопределения класса и так далее. Каким именно макаром оно там сдвоилось я без понятия.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.