Как получить данные пользовательских метабоксов из каждого блога в мультисайте?

11 сент. 2015 г., 10:20:58
Просмотры: 483
Голосов: 0

Я хотел создать компонент меню на своем сайте, который показывает ссылки на разные сайты в моей сети (WordPress Multisite).

Мое решение заключалось в создании site_option с помощью CMB2. Каждый сайт заполняет эти значения, которые затем используются для отображения меню в header.php темы. Однако я получаю только данные site_option главного/основного сайта, несмотря на использование switch_to_blog().

Вот код:

$sites = wp_get_sites();
$current_site = get_current_blog_id();

foreach ($sites as $site) {
  $details = get_blog_details($site['blog_id']);
  $zSite = $details->blog_id;
  $mycolor = '';
  $mclass = '';

    if( $current_site == $zSite ) {
        $mclass = 'active';
    }

    switch_to_blog( $site[ 'blog_id' ] );
        $mycolor = myPrefix_get_option( 'test_colorpicker' ); // Это функция получения опции, предоставляемая CMB2. Полный код функции здесь: https://github.com/WebDevStudios/CMB2-Snippet-Library/blob/master/options-and-settings-pages/theme-options-cmb.php
    restore_current_blog();

  printf( '<li role="presentation" class="%s"><a style="border-color:%s" href="%s">%s</a></li>', $mclass , $mycolor , 'http://'.$site['domain'].$site['path'], $details->blogname );
}

Может кто-нибудь помочь или предложить другое решение для достижения моей цели?

0
Все ответы на вопрос 1
0

Для тех, кто наткнется на это в будущем, ответ был фактически дан самим автором CMB2, Майклом Беквитом:

$sites = wp_get_sites();
$current_site = get_current_blog_id();

foreach ($sites as $site) {
  $details = get_blog_details($site['blog_id']);
  $zSite = $details->blog_id;
  $mycolor = '';
  $mclass = '';

    if( $current_site == $zSite ) {
        $mclass = 'active';
    }

    switch_to_blog( $site[ 'blog_id' ] );
        $mycolor = get_option( 'myprefix_options' ); // вот обновленный код
        $mycolor = $mycolor['test_colorpicker']; // вот обновленный код
    restore_current_blog();

  printf( '<li role="presentation" class="%s"><a style="border-color:%s" href="%s">%s</a></li>', $mclass , $mycolor , 'http://'.$site['domain'].$site['path'], $details->blogname );
}

Согласно Майклу:

Я считаю, что проблема в конечном итоге связана с функцией myprefix_admin(). Она создает так называемый синглтон, что означает, что только один экземпляр объекта будет существовать в данный момент времени. Она выполняется сразу же, и любой последующий вызов myprefix_admin() будет ссылаться на этот первый объект. Это включает циклы foreach, подобные тому, что вы пытаетесь сделать выше.

...мы просто получаем всю опцию, а затем извлекаем только нужную нам часть, в данном случае значение цветового пикера.

Еще раз спасибо Майклу Беквиту из CMB2.

11 сент. 2015 г. 22:42:15