Cross menu icon

27 апреля после долгого перерыва на сервисе Upwork, я решил возобновить свою деятельность на этой площадке. Тут же я увидел довольно интересный заказ, чтобы поднять свой рейтинг. Советую для тех, кто хочет быстренько поднять рейтинг выполнять мелкие заказы.

Так как я являюсь WordPress экспертом, то искал я задачи именно по этому направлению. И я наткнулся на очень интересное задание, которое было озаглавлено как «Regex and WordPress guru is required». Заказчик имел хорошую репутацию, поэтому я решил написать ему с просьбой пообщаться со мной, т.к. мне нужно поднимать рейтинг.

Задача

Есть две конструкции:

<h2>Заголовок</h2>

и

<div class="word-wrapper"><p>#1</p></div>
<h2>Заголовок</h2>

Необходимо было перед этими блоками вывести дисклеймер, который являлся полем плагина ACF. Собственно основная проблема была в том, чтобы при работе нашего алгоритма дисклеймер во втором варианте кода должен выводиться перед всей конструкцией.

Решение задачи

С самого начала определим фильтр для WordPress, который будет работать с контентом до его вывода:

add_filter( 'the_content', 'filter_the_content, 1 );

Будем использовать именно реализацию этим методом, потому что это единственный правильный способ вставить изменения в контент WordPress до начала обработки этого контента на шорткоды и другие скрипты.

После этого определим функцию:

function filter_the_content( $content ) { }

Далее заменим все вхождения строк <h2> на конструкцию [mystyle_div]<h2>. Делается это следующим образом:

$content = preg_replace('/<h2/mu', '[mystyle_div]<h2', $content);

В базе данных WordPress конструкция <div class="word-wrapper"><p>#1</p></div> представляла собой шорткод [word str="#1"], поэтому заменять мы будем её. Наша следующая задача заменить конструкцию [word str="#1"][mystyle_div]<h2> на [word str="#1"]<h2>.

Так как других конструкций с шорткодами не планируется, то достаточно заменить участок "][mystyle_div]<h2> на "]<h2>. Если бы были другие похожие конструкции, то я бы заменил участки типа [word str="#1"][mystyle_div] на [word str="#1"][mystyle_div][/mystyle_div], а потом удалил бы конструкцию [mystyle_div][/mystyle_div]. Кода в любом случае немного:

$content = preg_replace('/"\]\s\s\[mystyle_div\]<h2/mu', '"]<h2', $content);
$content = preg_replace('/\[word str=".*?"\]<h2/mu', '<div class="mystyle"'.$text.'</div>$0', $content);

Здесь я использовал проверку после посимвольного разбора строки $content. Средствами WordPress после шорткода [word] вставлялось некоторое число переносов строки, поэтому регулярное выражение выглядит так.

Далее просто заменяем оставшиеся [mystyle_div] на вхождение <div class="mystyle"'.$text.'</div>.

Задача была выполнена за час и было заработано 16$. Заказчик с удовольствием подтвердил выполненную задачу.

Я напоминаю, что давно работаю на фрилансе и имею опыт на площадках Youdo, Upwork, Profi и других. Принимаю заказы на платную консультацию по ведению данных площадок. Пишите на почту office@veliyev.ru.