да хакнеш 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>
Валхала на лошия код. На зла куша - зъл прът.
Януари 28th, 2007 at 1:18 pm
Хъм, защо ли имам чувството, че 80% от open source софтуера написан на PHP е пълна скръб точно заради такива изпълнения. Както и да е, ето ти една идея как да олекотиш кода си с няколко реда:
$out = preg_replace(’#\s+(.*)#’, ‘${2}’, $out);
Мисля, че ще работи идеално с повече от един list item.
Януари 28th, 2007 at 1:23 pm
Добре, втори опит:
$out = preg_replace(’#<li>\s+<a title=".*" href="(.*)">(.*)</a></li>#’, ‘<option value="${1}">${2}</option>’, $out);
Януари 28th, 2007 at 8:57 pm
Стефане, подхода ми е грешен и наказуем. Това на принципно ниво. Макар че ползвам wordpress, не го харесвам. Но едно трябва да се признае - много е ползван. Ако си бях направил труда да гугълна със сигурност щеше да изскочи я плъгин, я някакво по-елегантно решение. Просто бях в DIY настроение.
Иначе за регулярния израз - признавам си, че не разбирам, и ползвам регексове _само когато наистина се налага_. Все пак реших да видя какво ще излезе. Ето как изглежда в крайния му формат:
echo preg_replace(
'#<li>\s?<a href=\'(.*)\' title=\'.*\'>(.*)</a>\s?</li>#',
'<option value="${1}">${2}</option>',
$out);
Мерси
.
Януари 28th, 2007 at 9:41 pm
Всъщност, под “такива изпълнения” имах предвид функцията wp_get_archives, не твоето решение - на твое място сигурно бих направил същото, защото нямаше да ми се занимава с по-сложни изпълнения. Извинявай, че не съм се изразил добре.
Януари 29th, 2007 at 9:18 pm
Тъп си и си мързелив
То си е вградено тва:
Изберете месец
Просто има една допълнителна опция за тага.
Януари 29th, 2007 at 9:19 pm
?php wp_get_archives(’type=monthly&format=option’); ?
Януари 30th, 2007 at 12:44 am
Селянин… прав си. И за че съм тъп, че и съм мързелив, и за това, че е вградено. А я ми кажи откъде го изрови? Поне да знам дали съм прав, че гугъл го знае?
Януари 30th, 2007 at 3:40 pm
Че на WordPress кодът не е първа хубост, това всеки го знае
Но… само с два погледа върху ф-ята, която ти трябва се вижда, че тя не плюе html-а, а всеки клон вика
wp_get_archives_link(), която честно и почтено само разхвърля разниli-та,option-и или каквото му дадеш в параметритеbeforeиafter.А ако не ти се рови в кода - ето и страничката в документацията (между другото, излиза на първо място в google при търсене за “wp_get_archives”).
Януари 30th, 2007 at 3:42 pm
Уф, извинявам се за кода в code тагове, свикнал съм да е inline и не погледнах, че на горе в цялото ти писание също са code-ове.
Весел ден
Януари 31st, 2007 at 1:49 pm
:) Винаги трябва да се пита гугъл очевидно. Признавам си, най-много ме обърка странното предаване на параметри във формат стринг (подобен на query string). Не бях виждал тази конвенция, и това ме отказа да дълбая в детайлите.
Февруари 1st, 2007 at 12:22 pm
Ами докато от PHP не се сетят да вкарат именовани параметри в езика, трябва да се хаква ситуацията някак
Февруари 13th, 2007 at 1:02 am
Да бе. От тия хора само един човек схваща защо е тъпо интерфейса да специфицира конструктури, ти именовани параметри искаш. Не си ли е да предадеш хеш хешосписъков хибрид? Или още по-могъщо, нещо като query string, ама не съвсем.