Правилният начин за регистриране на езиците за даден WordPress plugin

Доволно количество часове загубих в борене на мега-странният бъг с няколко разширения в една моя инсталация на WordPress с BuddyPress, в която кожата реагираше на смяната на езика (ползвайки qTranslate), докато разширенията продължаваха изкарват само английски надписи. CodeStyling Localization ми разпознаваше файловете, преведените езици, генерираха се .mo файловете и в кода се добавяха същите тия файлове уж както си му е реда. Е явно не съвсем. Ето как се било правело:

/* LOAD LANGUAGES */
function plugin_name_load_textdomain() {
   $locale = apply_filters( ‘wordpress_locale’, get_locale() );
   $mofile = dirname( __File__ ) . „/languages/PLUGIN-NAME-$locale.mo“;

   if ( file_exists( $mofile ) )
      load_textdomain( ‘text-domain-name’, $mofile );
}
add_action ( ‘plugins_loaded’, ‘plugin_name_load_textdomain’, 7 );

SMS известия от Мтел за писма в GMail

Като как да си настроим известия за пристигнали писма на пощата, ако операторът ни е Мтел? Лесно. Ей тъй:

  1. Разрешаваме mail2sms услугата през сайта им: http://www.mtel.bg/sms_mail2sms Предполага се че имаме профил там и че сме си регистрирали актуалния телефон. Накрая на процедурата разполагаме с пощенски адрес 35988НОМЕРЪТ@sms.mtel.net
  2. В гугълската поща отиваме на Settings -> Forwarding and POP/IMAP (тук някъде: https://mail.google.com/mail/u/0/#settings/fwdandpop), където цъкваме бутона Add forwarding email, и въвеждаме пощата, която получихме в първата стъпка. Продължаваме напред.
  3. Казва ни се, че трябва да въведем код за потвърждение на пренасочването. До минутка-две би трябвало да получите sms с част от заглавието на гугълското служебно писмо. В него има и един #, след който има поредица от цифри. Това е кодът за потвърждение. Въвеждате го на страницата на gmail, която го очаква, и с това процесът по въвеждането на пощата за препращане е приключил.
  4. На същата страница за препращане (там дето цъкнахме бутонът за добавяне на адрес) вече имаме въведеният адрес и радиобутон за включването на препращането. Избираме enable и определяме останалите настройки по собствен вкус.

Ако пощата ви е твърде натоварена по принцип, това нещо ще започне в даден момент да досажда. А в по-следващ момент Мтел могат да решат да не препращат всеки sms, ако прекалявате с безплатността на услугата. Не гарантират 100% доставяне, if you know what I mean.

.exe файловете не се изпълняват, а питат за асоциация (Open with…)

При възстановяване на стара конфигурация на Windows XP може да се загуби асоциацията на exe файловете. Малко вероятно, но се случва. Резултатът – всеки shortcut или exe файл отварят прозорчето за избор на програма за стартирането, както се случва обичайно с неизвестните файлове. Забавното е, че не можеш да си пуснеш regedit-а.

Най-лесният вариант, който е хубаво да се пробва на първо място е да идеш на Folder options (Windows Explorer -> Tools, View или Edit, в зависимост от версията на бозата), и от там на File types. Целта е да се възстанови EXE разширението като асоциация за Applications. Ако го има в списъка, би трябвало да има бутон Restore. Ако няма бутон, триеш асоциацията и я създаваш на ново. Ако я няма, просто добавяш нова такава.

Това може и да не свърши работа. Тогава създаваш един файл, който трябва да завършва на .reg и в себе си като текст има следното:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT.exe]
@=“exefile“
„Content Type“=“application/x-msdownload“

[HKEY_CLASSES_ROOT.exePersistentHandler]
@=“{098f2470-bae0-11cd-b579-08002b30bfeb}“

[HKEY_CLASSES_ROOTexefile]
@=“Application“
„EditFlags“=hex:38,07,00,00
„TileInfo“=“prop:FileDescription;Company;FileVersion“
„InfoTip“=“prop:FileDescription;Company;FileVersion;Create;Size“

[HKEY_CLASSES_ROOTexefileDefaultIcon]
@=“%1″

[HKEY_CLASSES_ROOTexefileshell]

[HKEY_CLASSES_ROOTexefileshellopen]
„EditFlags“=hex:00,00,00,00

[HKEY_CLASSES_ROOTexefileshellopencommand]
@=““%1″ %*“

[HKEY_CLASSES_ROOTexefileshellrunas]

[HKEY_CLASSES_ROOTexefileshellrunascommand]
@=““%1″ %*“

[HKEY_CLASSES_ROOTexefileshellex]

[HKEY_CLASSES_ROOTexefileshellexDropHandler]
@=“{86C86720-42A0-1069-A2E8-08002B30309D}“

[HKEY_CLASSES_ROOTexefileshellexPropertySheetHandlers]

[HKEY_CLASSES_ROOTexefileshellexPropertySheetHandlersPEAnalyser]
@=“{09A63660-16F9-11d0-B1DF-004F56001CA7}“

[HKEY_CLASSES_ROOTexefileshellexPropertySheetHandlersPifProps]
@=“{86F19A00-42A0-1069-A2E9-08002B30309D}“

[HKEY_CLASSES_ROOTexefileshellexPropertySheetHandlersShimLayer Property Page]
@=“{513D916F-2A8E-4F51-AEAB-0CBC76FB1AF8}“

Файлът се изпълнява или от контекстното меню (дясно копче върху него) се избира merge. Проблемът би трябвало да е решен. Иначе – лошоооо.

Отново напомням, че всичко това е решение, до което стигнах от ровене в нета, и което може да не ви свърши никаква работа или да ви навлече неприятности. При мен свърши работа при отстраняването на подобен проблем. Оригиналният източник с подробно описание на решението на английски – тук.

 

Успешна борба със scareware

На първо място, какво е scareware:

Това е софтуер, който се разпространява като вирус и се опитва да се държи като такъв, максимално гръмко при това, за да изкара акъла на потребителя до там, че да го докара до свалянето или закупуването на нещо, от което не се нуждае. Примерно „антивирусна“, която или ще го съсипе съвсем, или просто ще спре изпълнението на scareware-а, задоволявайки авторите само с покупката ви на този „чудесен софтуер“. Търсенето за решения в интернет твърде често водят до страници, където „спасилите се“ горещо препоръчват „решения“. Демек още тонове зловреден софтуер, който ви решава този проблем, за сметка на което съвсем спокойно и с вашето разрешение започва да ви краде данни или да ползва ресурсите на машината ви. Давайки ви спокойствието, че вече имате яката антивирусна.

Та, борим се с нещо, което се е качило на компа, пречи на работата, имитира някаква антивирусна, евентуално дори Security Center-а на Windows, и след като сканира компа и открива десетки троянски коня, ви препоръчва да закупите и/или свалите невероятен спасителен софтуер.

След като ви изкара акъла тая чудесия, тя евентуално спира възможността ви да си работите на компютъра, деактивирайки декстопа, иконките ви, евентуално дори task manager-а и т.н. При вкарване на flash-ка автоматично се копира и там, още преди да се води flash-ката „Ready to use“.

Можете да се борите геройски с него, или просто да възстановите стара конфигурация на windows-а. Start -> Programs -> Accessories -> System tools -> System restore (или там квото беше). Избирате задна дата на възстановяване и това ще реши проблемът.

Как се постига резултатът? Зловредния код е някакво exe, вероятно няколко, които са разхвърляни на скрити директории из файловата система и се изпълняват при стартирането на компа, при пускането на task manager-а и всякакви други ситуации, за да внесат безпокойство в душата ви. Restore на системата към по-ранен етап всъщност ще заличи всички тези записи в регистъра, които предизвикват изпълнението на зловредния код. Файловете ще останат, но няма да ви причиняват повече неприятности, освен ако не ги стартирате сами.

Очевидно решението е скалъпено и не гарантира никаква сигурност занапред. По-дългосрочен резултат ще има преинсталация на бозата или заместването й с Linux. Антивирусният софтуер е като дядо Коледа. Създадени, с цел повече продажби и облагодетелстване на авторите. В същото време, безкрайно безполезни.

Make FT Calendar plugin to start week from Monday

It was a bit of a hassle but I  finally did it. The FT Calendar plugin (version 1.0.6) was starting the week from Sunday, which was rather annoying for me, being a Bulgarian… so I hacked it in order to start from Monday. That works for the thumb calendar shortcode. I just didn’t have the time to work around the whole thing, but it should be pretty easy, having achieved this little victory.

Installation of the „patch“ is actually replacing the existing class-shortcodes.php file with the one, attached here. It’s located in your plugins dir, probably wp-content/plugins/ft-calendar/classes/. DO make sure your plugin is version 1.0.6, or you might wipe out something useful or totally break it! I take no responsibility on the stuff you did or will do after downloading the patch.

Any feedback is welcome!

>>>DOWNLOAD THE PATCH<<<

Adding a button to TinyMCE – the Visual Editor in WordPress

I needed a simple button that would generate a shortcode on clicking. And that button had to be in the visual editor when adding or editing posts. That editor is implemented by TinyMCE, which is an opensource project too. Well, anyway, I wasted several hours fighting with existing plugins and themes that have introduced some custom buttons. I tried the Codex too, but that gave help for adding a custom style list only. Which was not the thing I needed.

Anyway, solution is almost simple. And I found it works about a day after I already implemented it. Theoretically speaking, it’s introducing a new „plugin“ to TinyMCE.

What happens in practice is the following:

add_filter(‘mce_external_plugins’, ‘tinymce_custplugin_register’);
function tinymce_custplugin_register($plugin_array)
{
$url = get_bloginfo(‘template_url’).’/js/custom-plugin.js’;
//url is the actual button with it’s label and action, when clicked
$plugin_array[‘custplugin’] = $url;
return $plugin_array;
}
add_filter(‘mce_buttons’, ‘tinymce_custplugin_addbutton’, 0);
function tinymce_custplugin_addbutton($buttons)
{
//Separator adds space before the button (obviously?)
array_push($buttons, ‘separator’, ‘custplugin’);
return $buttons;
}
We add this code in the functions.php of your theme OR in a new plugin, just to have it across all themes we might go through.
Here comes the JavaScript file:
function custplugin() {
return ‘[my-shortcode]’;
}
(function() {
tinymce.create(‘tinymce.plugins.custplugin’, {
init : function(ed, url){
ed.addButton(‘custplugin’, {
title : ‘My Custom Button’,
onclick : function() {
ed.execCommand(
‘mceInsertContent’,
false,
custplugin() //the real deal goes here
);
},
image: url + ‘/button-icon.png’
});
}
});
tinymce.PluginManager.add(‘custplugin’,tinymce.plugins.custplugin);
})();
UPDATE: Watch out for the ‘ and “ when coping the code from here. You’ll have to replace them with real ones, as these may lead to an js error.

Смяна на представка на таблиците в базата на WordPress

Защо би ни хрумнало такова нещо? Сигурност. wp_ отдалеч крещи, че системата отдолу е WordPress. А от време на време е хубаво това да се маскира. Какво правим за ръчната смяна на префиксите:

  1. Запазваме си някъде копие на базата, щото обикновено нещата се скапват, когато нямаме backup.
  2. Сменяме стойността на prefix променливата в wp-config.php файла с новата представка. На този етап сайтът би трябвало да спре да се отваря адекватно, просто защото се връзва с базата си, но не намира никоя от таблиците. Ще предложи нова инсталация, която реално ще бъде с новата представка. НЕ правете това.
  3. Отваряме базата и преименуваме всички таблици, сменяйки старата представка с новата. На този етап сайтът би трябвало вече да се отваря, но да нямате достъп до административния панел.
  4. Преименувате ключове и стойности в таблиците usermeta & options. Без значение е това, че тия стойности не са имена на таблици, те започват с wp_ (или какъвато там ви е представката) и съответно подлежат на преименуване.

След като свършите всички тези дела, можете да активирате отново разширенията, които би трябвало да се деактивирали предварително. Не че е фатално, но е препоръчително. Сега е моментът да направите цялостно изтестване на системата и да видите дали нещо някъде не се чупи по глупав начин. Малък шанс, но все пак възможен, е някой гений да е написал разширение с набухана представка вътре в кода. Е, ще трябва да я заместите с правилната променлива.

Като цяло всичкото действие, както и някои други извращения със смяна на адреси на папки за разширения, кожи и т.н., е хубаво да се планира и изпълнява преди инсталацията на разширенията и кожите, защото в последствие винаги може да изскочи от някъде някакво разминаване заради лошо написан код на разширенията.

Server Error 500 за PHP, засилено на IIS7

Дано на никого не му хрумва да ме пита защо търкалям PHP на Windows сървър. Как да е, наложи ми се. Приложението си работеше като пич на Apache, обаче в момента, в който го прехвърлих на новото място и уж всичко е настроено, взе да ми изскача грешка 500 за която и страница от PHP приложението да се опитам да отворя – локално на сървъра или отдалечено.

Дълго рових и търсих, като очаквах да е нещо, свързано с application pool-а, който и преди ми е създавал проблеми. В края на краищата установих, че просто глупостта е решила, че каква да е грешка в кода ми трябва да излиза като грешка 500, без да затормозява потребителя с описателни и разбираеми съобщения.

Решението бе просто да се смени съответната настройка за извеждане на съобщения през конфигуратура на IIS (inetmgr) -> нашия сайт -> Error Pages -> Edit Feature Settings -> Detailed errors вместо Detailed errors for local бла-бла-бла.

И се оказа, че съм забравил да вкарам настройките за базата. Headpalm.

Тук отиваме на Error Pages за проблемния сайт.

И влизаме в настройките за извеждане на грешка 500.


Където избираме Detailed errors. Това е всичко.

„Language is already enabled or invalid!“ when enabling new language to qTranslate

The error from the title pops-up when you enable a language you added a minute ago to the configuration (from the Settings -> Languages page). Usual case is you deal with an old database, that has collations, different from utf-8, and that messes up things. qTranslate FAQ will suggest you use a plugin called UTF Database Converter, but that one was last updated about two years ago the last time. And wiped out my content. That’s why I got a back-up ;)

What you’d better do (if you got WordPress 3.x) is get this one http://wordpress.org/extend/plugins/utf-8-db-converter/

It seems like an updated version of the previous one. The thing is that it does the business – just click a single button and it generates in several minutes a report on the results of the conversion. Do I need to say, that next thing is you check you’re website for issues with the content and plugins?

In the end you can go on with your qTranslate settings – add again the language of your choice and enable it. This time it’ll work like a charm!

Грешка при връзка с базата при миграция на WordPress Multisite

Днес разплитах един особен случай на сайт, при който WordPress (3.0) Multisite инсталация трябваше да се метне в поддиректория и към същата поддиректория да се насочи друг домейн.

Какво направих:

  1. Копирах всички файлове и базата данни. Създадох нова база и метнах в нея старата, като смених във wp_options записите url & home, които държат текущия домейн на сайта.
  2. Разположих файловете в поддиректорията, смених настройките за новата база във wp-config.php и насочих домейна към същата локация.

Резултатът беше Error establishing database connection. Подвеждащо и невярно твърдение.

Какво бях пропуснал:

  1. Да прочета в Кодекса, че миграция на Multisite не е толкова елементарна, колкото на обикновен сайт.
  2. Да редактирам записите във wp_blogs, за да е ясно за всяка инстанция, че вече е на нов домейн.
  3. Да редактирам следния ред във wp_config.php, така че текущия домейн да е новият:

define( ‘DOMAIN_CURRENT_SITE’, ‘example.com’ );

За да работят всички разширения като хората се наложи и някои други таблици да редактирам и да им вкарам новия домейн на мястото на стария, но това вече си зависи от конкретната ви инсталация и настройките. В някои случаи се налага да редактирате и .htaccess файла, ама да не дава Господ да се наложи.