Cómo obtener datos personalizados de metaboxes de cada blog en WordPress Multisite
Quería crear un componente de Menú en mi sitio que muestre enlaces a los diferentes sitios de mi red (WordPress Multisite).
Mi solución fue crear un site_option usando CMB2. Cada sitio completará eso con los valores necesarios que luego se usarán para el menú que se mostrará en el header.php del tema. Sin embargo, solo estoy obteniendo los datos de site_option del sitio principal/predeterminado a pesar de usar switch_to_blog().
Aquí está el código:
$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' ); //esta es la función get option proporcionada por CMB2. Ver la función completa aquí: 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 );
}
¿Alguien puede ayudarme o tal vez indicarme una solución diferente para lograr mi objetivo?
Para aquellos que encuentren esto en el futuro, esto fue respondido por el propio autor de CMB2, Michael Beckwith:
$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' ); // aquí está el código actualizado
$mycolor = $mycolor['test_colorpicker']; // aquí está el código actualizado
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 );
}
Según Michael:
Creo que el problema proviene de la función myprefix_admin(), al final. Está creando lo que se conoce como un singleton, lo que significa que solo existirá una instancia de un objeto en un momento dado. Se ejecuta de inmediato, y cualquier llamada posterior con myprefix_admin() hará referencia a ese primer objeto. Esto incluye bucles foreach como el que intentas hacer arriba.
...lo que hacemos es simplemente obtener toda la opción y luego extraer solo la parte que necesitamos, en este caso el valor del selector de color.
Gracias nuevamente a Michael Beckwith de CMB2.
