Polylang + ACF + Flexible Content Layouts

5 марта, 2023

Недавно, работая с вордпресс сайтом, основанным на связке Polylang и АСФ, я столкнулся с неожиданным багом. Баг заключается в том, что при использовании АСФ Flexible Conten Layouts при попытке сохранить или апдейтнуть пост или экземпляр кастомного пост-тайпа, структура Flexible Conten групп редактируемого поста безусловно перезаписывает Flexible Conten структуры постов-переводов, причем перезаписывается именно структура, контент лайотов не переносится.

Естественно я сделал поиск по гуглу и OpenCTP, и к своему удивлению, подобных случаев не нашел. Причем здесь отличился OpenCTP — он сразу безапеляционно заявил, что такое поведение не есть баг, а является специально обученной фичой, предусмотренной разработчиками для более полного удовлетворения нужд пользователей)

То есть когда вы сохраняете, скажем английский пост, и в этот же момент происходит пеерезапись его перевода, скажем немецкго, после этого вы сохраняете немецкий пост, пытаясь исправить результат предидущей операции, и так происходит по бесконечному кругу — это не в коем случае не баг, с точки зрения OpenCPT, а очень удобная особенность реализации)

Справедливости ради, нужно сказать, что после указания на такою противоречие, после нескольких уточняющих реплик, чат признал свою ошибку, и начал предлагать варианты отключения данной «фичи». Режим перевода для данных ACF групп изначально был указан как ‘copy-once’, был переустановлен в ‘ignore’, но это не помогло, то есть пришлось искать вариант отменить синхронизацию мета-полей программно.

Следует сказать, что сайт является довольно старым ( возраст более 3 лет ), в свое время был собран PMом ( чтоб они поздыхали)) ), на основе готовой темы и плагинов. То есть очередная тупая обезьяна решила, что она уже достаточно наслушалась разных умных вещей на митингах, и решила собрать сайт самостоятельно. Сайт действительно был собран, запущен и заполнен. Естественно, с такой структурой данных и кода, которая могла прийти в голову только PMу, который решил попрограммировать, или долбоебу. Чтобы было понятно, скажу только, что оказывается не нужно использовать темплейты для страниц, которые отображают контент на любом языке, на самом деле правильно создавать page-template-en.php, page-template-de.php, page-template-fr.php и т.д. Это только один из примеров, таких вершин инженерной мысли оказалось там десятки единиц.

Поначалу это работало, вносились разные именения, в том числе и в коде, но — о горе — к сожалению тупой обезьяны, бизнес оказался удачным, он рос, развивался, сайту понадобились серьезные обновления функционала, и тут у обезьяны случился stack-overflow и ее погнали ссаными тряпками с проекта. После этого был найдено стандартное решение — взять программиста на проект. Но не простого, а золотого, вернее с золотистым оттенком кожи, короче пакистанца. Ну короче, погнали и его ясное дело, но нагадить он успел знатно.

Возвращаясь к текущей ситуации — сделать новый сайт, бизнес сейчас не готов, потому что новая идея и дизайн так быстро не делается ( у них, в Англии ), на это надо время и вдохновение дизайнера, опять же надо чтобы звезды правильно сошлись, короче — не на часі. То есть надо фиксить существующий хромой сайт, потому как под Flexible Content уже создан функционал, он работает, он приносит профит, но работает по сути только на одном ( основном ) языке сайта. После нескольких наводящих запросов, чат обнаружил в недрах Polylang фильтр pll_copy_post_metas, с помощью которого проблему можно решить. Само решение просто :

function disable_acf_syncing( $metas, $post_id, $source_lang, $target_lang ) {
    $meta_data = $metas;

    foreach ( $meta_data as $i => $data ) {
        if ( preg_match( '/ACF_FC_Group_name_to_be_exluded/', $data  ) ) {
            unset( $metas[ $i ] );
        }
    }

    return $metas;
}
add_filter( 'pll_copy_post_metas', 'disable_acf_syncing', 10, 4 );

На фильтр приходит массив мета-полей и 3 дополнительных полезных аргумента. Я делаю проверку через preg_match из-за найминга ACF Flexible Content полей — мне нужно было исключить все, относящиеся к конкретной Flexible Content группе, естественно проверку можно сделать такую как требует конкретная ситуация. Также следует заметить, что при этой реализации на выходе вы получите массив с неизмененными индексами, то есть если ваша проверка удалила элементы с индексами 0,1,2 из 5 элементного массива, то результирующий массив будет иметь элементы с индексами 3 и 4, не 0 и 1. Для меня это не имело значения, но помнить об индексах стоит.

Теперь сайт работает ожидаемо, мета поля добаляются и апдейтятся независимо, так как необходимо команде контент-менеджеров. В дальнейшем сайт конечно будет переделан нами с нуля.

Categorised in: wordpress