ACF Global Options and Metaboxes for WP Multisite

…или как сделать так, чтобы набор метаполей и/или ACF Option Page был единым для всех блогов в рамках установки WordPress Multisite.

У меня проблема возникла, когда на мультисайте существующие глобальные настройки (Options Page) должны были стать действительно глобальными. Я пошел дальше и сделал все настройки метабоксов, включая Options Page, едиными для всех блогов.

Другими словами, при изменении набора настроек ACF главного сайта, следует избежать необходимости вручную вносить одни и те же правки во всех блогах.

Также, при переносе файлов сайта с девелоперского домена на предпрод, БД, как правило, подтягивается с прода. А значит, набор метаполей ACF может различаться.

Подход к решению таков:

  1. в главном блоге установки в ACF-панели настраиваем необходимые метаполя и ACF Option Page
  2. во всех прочих блогах ничего не создаем или удаляем, если они уже есть
  3. при сохранении настроек ACF главного блога создаем php-файл импорта настроек для блогов
  4. загружаем созданный файл, если текущий блог не главный.

Код для п.3. Можно прямо в functions.php

<?php
add_action( 'shutdown', 'sh_acf_generate' );

function sh_acf_generate(){
  global $wpdb;
  
  if ( ! did_action( 'save_post_acf-field-group' ) ) return;
  
  $fields = $wpdb->get_col( "SELECT post_name FROM {$wpdb->posts} WHERE post_type = 'acf-field-group' AND post_status = 'publish'" );
  
  if ( empty( $fields ) ) return; 
  
  $str_replace = array(
    "  "      => "\t",
    "'!!__(!!\'"  => "__('",
    "!!\', !!\'"  => "', '",
    "!!\')!!'"    => "')",
    "array ("    => "array("
  );
  $preg_replace = array(
    '/([\t\r\n]+?)array/'  => 'array',
    '/[0-9]+ => array/'    => 'array'
  );
  
  $out = "<?php if( function_exists('acf_add_local_field_group') ):" . "\r\n" . "\r\n";
  
  foreach( $fields as $f ) :
  
    $field_group = acf_get_field_group( $f );
    // load fields
    $field_group['fields'] = acf_get_fields( $field_group );
    // prepare for export
    $field_group = acf_prepare_field_group_for_export( $field_group );
  
    $code = var_export( $field_group, true );
    // change double spaces to tabs
    $code = str_replace( array_keys($str_replace), array_values($str_replace), $code );
    // correctly formats "=> array("
    $code = preg_replace( array_keys($preg_replace), array_values($preg_replace), $code );
    // esc_textarea
    $code = esc_textarea( $code );
    $out .= "acf_add_local_field_group({$code});" . "\r\n" . "\r\n";
  endforeach;
  
  $out .= "endif;";
  
  file_put_contents( get_template_directory() . '/inc/acf.php', htmlspecialchars_decode( $out, ENT_QUOTES  ) );
}

Данный код является вырезкой из метода html_generate() класса ACF_Admin_Tool_Export. Никаких хуков найдено не было, поэтому пришлось копировать код.

На данном этапе мы отлавливаем момент сохранения настроек и, после некоторой обработки, сохраняем php-код импорта этих настроек.

Почему используем хук shutdown, чтобы ACF успел создать/удалить новые acf-field-group-записи при их создании/удалении.

Теперь остаётся только подключить сгенерированный файл в function.php, предварительно убедившись, что делаем это для всех блогов, кроме главного.

<?php

if ( 1 != get_current_blog_id() ):
  include get_template_directory() . '/inc/acf.php';
endif;

 

Для использования при миграции файлов с девелоперского домена, добавляем проверку текущего домена с помощью функции get_home_url().

0 0 голоса
Article Rating
Share this post



4 Comments
Сначала старые
Сначала новые По рейтингу
Межтекстовые Отзывы
Посмотреть все комментарии
Extended Opportunity
Extended Opportunity
2 месяцев назад

MobiApp AI – True Android & iOS Mobile Apps Builder (Zero Coding Required) https://ext-opp.com/MobiAppAI

Extended Opportunity
Extended Opportunity
2 месяцев назад

Word’s First NLP & ML Based Email, Voice & Video Marketing Autoresponder Thats Boost Email Delivery, Click & Open Rates Instantly https://ext-opp.com/VidMailsAI

Extended Opportunity
Extended Opportunity
2 месяцев назад

Hey, did you know there are app that mass generate hundreds of redirects to your link from different domains? Get it here – https://ext-opp.com/BUS

Extended Opportunity
Extended Opportunity
2 месяцев назад

Are you still using Calendly to schedule your calls and meetings? If your answer is yes, then you are actually hurting your business not helping it… Calendly is limited, doesn’t unlock the full potential of your business… And to make matters worse, they charge you monthly… What a joke… But you don’t have to worry, because my good friend Kundan is about to change the entire market … You see, he just launched his newest creation AI Calenderfly… The world’s first appointment-setting app that is fully powered by AI… It will do all of the heavy lifting for you on… Раскрыть »

4
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x