Как разширение за WordPress с наличен код в GitHub направи $100k продажби за по-малко от година

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

В конкретния случай, който няма да преразказвам, добавка към платеното WordPress разширение Gravity Forms, оригинално правено за контактни формуляри, прави много сериозни пари, без да си крие кода зад система за плащане.

Просто прочетете:

GravityView has passed $100k in sales – GravityView

Да подкараш Tzar под Линукс

Известно време имах ужасяващата драма с невъзможността да подкарам Tzar: The burden of the crown на Linux Mint 17 заради някакъв проблем със Setup.exe, заради което не успявах да си затъркалям първоначалната конфигурация, която да позволи пускането на самата игра. Едва днес разбрах, че мога да пиша в конзолата:

wine Setup.exe

за да разбера какво точно се случва. Оказа се, че липсва dll файл:

err:module:import_dll Loading library MFC42.DLL

Решението пък е безкрайно просто. Инсталираме winetricks и го убеждаваме да ни реши проблема:

sudo apt-get install winetricks
winetricks mfc42

Предполагам, че по същия начин winetricks би работил и за други сравнително популярни dll библиотеки.

Error 500 when opening Statistics in OpenX 2.8

OpenX versions before 2.8.10 got an issue with PHP 5.4, so if you can’t access Statistics on your OpenX server, there is a good chance you’ve hit this incompatibility.

Fixing it is pretty easy once you know the solution – either go to OpenX v.2.8.10 or edit the following files in order to remove the pointers:

<openx-root-folder>/lib/OA/Admin/Statistics/Delivery/CommonEntity.php – the block starting at line 292:

$oPlugin->mergeAds(&$this->childrendata[‘ad_id’]); //BEFORE

$oPlugin->mergeAds($this->childrendata[‘ad_id’]); //AFTER

 

<openx-root-folder>/lib/OA/Admin/Statistics/Delivery/CommonEntity.php – the block starting at line 322:

$oPlugin->mergeZones(&$this->childrendata[‘zone_id’]); //BEFORE

$oPlugin->mergeZones($this->childrendata[‘zone_id’]); //AFTER

 

<openx-root-folder>/lib/OA/Admin/Statistics/Delivery/CommonHistory.php – the function starting at line 160:

parent::prepare(&$aParams); //BEFORE

parent::prepare($aParams); //AFTER

 

Credits for the solution go to Aleksandr Cherniyh, his article openx-2.8 and php-5.4 and  the comment with solution by Crow.

Internal Server Error при ползване на APC с WP Super Cache

При преместването на една WordPress инстанция към нов сървър, където се оказа пуснато APC кеширане, сайтът взе да изчезва в произволни моменти, изкарвайки Internal Server Error 500. Рестартиране на Apache оправяше проблемът до следващия уж случаен момент, в който отново сайта пукваше. Пуснах debug mode на WordPress, за да видя следната грешка:

Fatal error: Internal Zend error – Missing class information for in wp-cache-base.php on line 5

Това, което препоръчват за решаването на този проблем е да се вкара един ред в конфигурацията на APC (/etc/php5/conf.d/apc.ini):

apc.include_once_override = 0

И те такам.

Инсталация на Sublime Text в Linux

Вместо да се захващам тепърва да го свалям от някъде и да го компилирам, правя следното (в терминала):

sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update
sudo apt-get install sublime-text

Какво се случва? С първата команда вкарваме в списъка със източници за обновяване и софтуер източника на Sublime. С втората си обновяваме списъка с пакети, които можем да инсталираме от всички наши източници (включително новия) и с последната команда го инсталираме.

Обновяване на Linux Mint 11 до Mint 14 Nadia

Дълго време си кретах щастливо Mint 11, та чак в тия дни се изненадах, като забелязах, че актуалната версия е 14. Не че съм умрял за cutting-edge технологиите чак толкова, ама реших да се прехвърля на нещо по-ново.

Ето как става това, без да се прави чиста преинсталация Ето как си счупих пингвина, след което се наложи чиста инсталация от bootable flash drive:

  1. Отваря се терминал, в който се пише sudo bash и се отваря за редакция /etc/apt/sources.list (списъка с източници за обновяване). Примерно с gedit /etc/apt/sources.list
  2. Заместват се наличните записи с тези:deb http://packages.linuxmint.com/ nadia main upstream import
    deb http://archive.ubuntu.com/ubuntu/ quantal main restricted universe multiverse
    deb http://archive.ubuntu.com/ubuntu/ quantal-updates main restricted universe multiverse
    deb http://security.ubuntu.com/ubuntu/ quantal-security main restricted universe multiverse
    deb http://archive.canonical.com/ubuntu/ quantal partner
    deb http://packages.medibuntu.org/ quantal free non-free
    # deb http://archive.getdeb.net/ubuntu quantal-getdeb apps
    # deb http://archive.getdeb.net/ubuntu quantal-getdeb games

  3. После се засилва apt-get update;
  4. Същинската част, за която вече ще трябва да има направени backup-и на всичко важно е тук – apt-get dist-upgrade, след което трябва да се случи и apt-get update.
  5. Ако всичко е минало (що-годе) както трябва, накрая ще е се наложи само да рестартирате, за да се появи новата Мента.

Сега рестартирам, за да видя при мен до колко са се омазали нещата…

Та тъй де, рестартирах и Gnome-а повече не пожела да работи. След още известни заигравки в recovery mode установих, че все пак ще трябва да си направя чиста инсталация. С други думи – bootable usb flash drive го сглабям със свалено iso от linuxmint.com и го натъпквам с unetbootin на самата флашка. Рестартирам компа, стараейки се да избера стартиране от flash-ката и от там насетне вече е познат процеса.

 

Изчистване на dns кеша на Chrome

Внимание! Статията е стара и вероятно няма да проработи за последните версии на Chrome! По-долу има актуално решение.

Безкрайно досадно явление на моменти е кеширания стар адрес на даден сайт, когато ние сме го пренасочили другаде. Chrome я прави тая дивна глупост, без да предоставя някакъв по-интуитивен начин за изчистването му. Реално трябва да му се бръкне малко „в червата“, за да стане номера.

chrome://net-internals/#dns

Този адрес съдържа страничката със всички текущо кеширани dns-и на сайтове, които са били отваряни или към които са отивали заявки поради някаква причина. Clear host cache бутона ни освобождава от всичко, запазено до момента, след което броузъра си търси ip-тата от dns-а на доставчика ни. Та в следващия момент ако идва отново грешно ip, то това е заради доставчика вече.

Новото решение (писано 2013.11.24):

В един момент проблемът спря да се оправя от тоя адрес и когато си създавах записи в hosts файла към различни адреси, те не се отразяваха в броузъра. Това, което се оказа решението, колкото и да е тъпо, бе да се отиде в настройките и да се изчисти историята: Settings -> Privacy -> Clear browsing data… -> Clear browsing history & cache (не съм сигурен кое от двете беше).

BuddyPress forum topics don’t show up

As the last year’s Vlado was not wise enough to blog about this little problem that occurs after BuddyPress updates or server migrations, he is doing it one year later, when he comes again to such a problem.

  • all forum topics are missing;
  • creating a forum topic doesn’t show up;
  • checking topics from a specific group/user profile doesn’t show any results.

Simply you’ve got a mistake in your bb-config.php file, which should be located in the root folder of your WordPress installation. In case of server migration you should check your database credentials (db name, host, user and pass) and in case you have been a wise-ass and have changed your database tables prefix, you’ll have to update these manually in the the same file.

Next thing you’ll see are all your lovely forum topics coming back home.

Черен списък на лакомите WordPress разширения

  • FT Calendar – извеждането на джаджа в страничното поле или чрез shortcode води до едни около 80 SQL заявки.  За полупразен не-много-посещаван сайт няма да се отрази кой знае как. За сериозно натоварван сайт това ще се окаже bottleneck. Като бонус получавате и таблици с абсурдни id-та на клетките и *стотин грешки на страницата ви при проверка от validator.w3.org.
  • News-Ticker – ако някой види в кода как се взимат с една заявка всички публикации, след което и всички етикети и категории, че да се направи в PHP кода филтрирането по посочените критерии, ще разбере, че авторът хал-хабер си няма от SQL и предпочита да се уповава на знанията си в PHP и API-то на WordPress. При няколко хиляди публикации и над 10к етикета това би значело секунди зареждане на глупава малка лентичка с няколко превъртащи се новини.
  • Semisecure Login Reimagined – хубаво нещо е да се криптират паролите като се размяткат насам-натам, ама когато това се случва с ключ с дължина 2048 бита нещата могат да отидат малко в тиквите, при по-голям човеко-поток на сайта навътре-навън. Тук винаги можем да изберем по-къс ключ, като 512 битов примерно. И все пак, едно на ум.
  • BuddyPress Live Notification (http://buddydev.com/plugins/buddypress-live-notification/) – супер е известията ни в BuddyPress да излизат веднага, а не едва когато презаредим страницата, но вероятно има и някакви по-щадящи процесора варианти. Асинхронното чудовище е способно при няколко логнати потребителя да изяде лимита на процесорното ви време, ако сте на споделен хостинг за нула време. True story.
  • Automatic SEO Links (http://wordpress.org/plugins/automatic-seo-links/) – безкрайно много заявки на всяка страница, а при голям сайт или много добавени думи става мазало.

Списъкът ще се дописва постепенно…

Правилният начин за регистриране на езиците за даден 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 );