да хакнеш WordPress

Предвид факта, че списъка с месечните архиви на блога датираше от Октомври 2003 реших да пробвам да премина към по-компактно решение - селект. За пореден път не знаех в какво се забърквам.

Кода в скина изглеждаше по този начин:
wp_get_archives('type=monthly');

Функцията е забита в червата на вордпрес, където заявки от базата данни се редуват с логика и с плюене на html. Крайния резултат от функцията e това към браузъра

<li> <a title="Януари 2007" href="/2007/01/">Януари 2007</a></li>
...

Опциите пред мен са а) да бъркам в червата на wordpress и да сменям функцията б) да ровя за плъгини, което вероятно ще е обречено на неуспех, понеже съм версии назад. или в)

<select onchange="location.href = this.value">
<?
ob_start();
wp_get_archives('type=monthly');
$out = ob_get_contents();
ob_clean();
$out = ereg_replace('<(/)?ul>', '', $out);
$out = ereg_replace("\r|\n|\t", '', $out);
$out = str_replace("<li><a", '<option', $out);
$out = str_replace("</a></li>", '</option>', $out);
$out = str_replace("href", 'value', $out);
echo $out;
?>
</select>

Валхала на лошия код. На зла куша - зъл прът.

12 Коментара по “да хакнеш WordPress”

  1. Стефан Кънев:

    Хъм, защо ли имам чувството, че 80% от open source софтуера написан на PHP е пълна скръб точно заради такива изпълнения. Както и да е, ето ти една идея как да олекотиш кода си с няколко реда:

    $out = preg_replace(’#\s+(.*)#’, ‘${2}’, $out);

    Мисля, че ще работи идеално с повече от един list item.

  2. Стефан Кънев:

    Добре, втори опит:

    $out = preg_replace(’#<li>\s+<a title=".*" href="(.*)">(.*)</a></li>#’, ‘<option value="${1}">${2}</option>’, $out);

  3. Петьо:

    Стефане, подхода ми е грешен и наказуем. Това на принципно ниво. Макар че ползвам wordpress, не го харесвам. Но едно трябва да се признае - много е ползван. Ако си бях направил труда да гугълна със сигурност щеше да изскочи я плъгин, я някакво по-елегантно решение. Просто бях в DIY настроение.

    Иначе за регулярния израз - признавам си, че не разбирам, и ползвам регексове _само когато наистина се налага_. Все пак реших да видя какво ще излезе. Ето как изглежда в крайния му формат:


    echo preg_replace(
    '#<li>\s?<a href=\'(.*)\' title=\'.*\'>(.*)</a>\s?</li>#',
    '<option value="${1}">${2}</option>',
    $out);

    Мерси :) .

  4. Стефан Кънев:

    Всъщност, под “такива изпълнения” имах предвид функцията wp_get_archives, не твоето решение - на твое място сигурно бих направил същото, защото нямаше да ми се занимава с по-сложни изпълнения. Извинявай, че не съм се изразил добре.

  5. georgivar:

    Тъп си и си мързелив :)

    То си е вградено тва:

    Изберете месец

    Просто има една допълнителна опция за тага.

  6. georgivar:

    ?php wp_get_archives(’type=monthly&format=option’); ?

  7. Петьо:

    Селянин… прав си. И за че съм тъп, че и съм мързелив, и за това, че е вградено. А я ми кажи откъде го изрови? Поне да знам дали съм прав, че гугъл го знае?

  8. николай:

    Че на WordPress кодът не е първа хубост, това всеки го знае :-)

    Но… само с два погледа върху ф-ята, която ти трябва се вижда, че тя не плюе html-а, а всеки клон вика wp_get_archives_link(), която честно и почтено само разхвърля разни li-та, option-и или каквото му дадеш в параметрите before и after.

    А ако не ти се рови в кода - ето и страничката в документацията (между другото, излиза на първо място в google при търсене за “wp_get_archives”).

  9. николай:

    Уф, извинявам се за кода в code тагове, свикнал съм да е inline и не погледнах, че на горе в цялото ти писание също са code-ове.

    Весел ден :-)

  10. Петьо:

    :) Винаги трябва да се пита гугъл очевидно. Признавам си, най-много ме обърка странното предаване на параметри във формат стринг (подобен на query string). Не бях виждал тази конвенция, и това ме отказа да дълбая в детайлите.

  11. николай:

    Ами докато от PHP не се сетят да вкарат именовани параметри в езика, трябва да се хаква ситуацията някак ;)

  12. Стефан Кънев:

    Да бе. От тия хора само един човек схваща защо е тъпо интерфейса да специфицира конструктури, ти именовани параметри искаш. Не си ли е да предадеш хеш хешосписъков хибрид? Или още по-могъщо, нещо като query string, ама не съвсем. :D

Коментирай