Совместное использование динамических боковых панелей в многосайтовых блогах
Я пытаюсь найти способ восстановить динамическую боковую панель из одного блога и распечатать ее в другом блоге в той же установке мультисайта Wordpress. Я пробовал
switch_to_blog($blog_id);
dynamic_sidebar($sidebar_name);
restore_current_blog();
Но ничего не возвращается.
Я также устал повторно просматривать боковую панель через get_blog_option($blog_id, 'sidebar_widgets')
, но я смог только повторно просмотреть массив, чтобы определить, какие виджеты использовались боковой панелью, но я не смог найти, чтобы обработать массив в боковую панель.
5 answers
К сожалению, метод switch_to_blog()
не будет работать для этой цели. switch_to_blog()
на самом деле является лишь частичным переключателем - он вносит некоторые изменения в $wpdb
, которые помогают с запросами к базе данных. Но это не полный переход, как вы могли бы себе представить.
В частности, dynamic_sidebar()
зависит от глобального имени $wp_registered_sidebars
. Этот глобальный заполняется register_sidebar()
, который обычно вызывается из файла темы, например functions.php . Но functions.php, и остальная часть процесса настройки темы не запускается повторно switch_to_blog()
. То есть: если вы запускаете Twenty Eleven в текущем блоге, он зарегистрирует свои собственные боковые панели во время запуска; использование switch_to_blog()
в блоге под управлением Twenty Ten не скажет Twenty Ten настроить свои боковые панели . Вы можете попробовать заставить его (загрузив переключенный блог functions.php вручную), но это почти наверняка приведет к катастрофе из-за проблем с повторяющимися именами функций, порядком загрузки и т. Д. и т. Д.
Вы можете попробовать несколько иной подход: На ведите блог с нужной боковой панелью, создайте функцию, которая будет выводить содержимое боковой панели в буфер вывода, а затем, прежде чем выводить его на экран, спрячьте его в параметре site_option. Затем вы можете захватить боковую панель (или, по крайней мере, ее статическую версию) с любого сайта в сети. Это не сработает, если вам абсолютно необходима полностью динамическая боковая панель, но для большинства целей вы, вероятно, этого не сделаете.
Другой метод (который может быть проще) - визуализировать боковую панель с помощью выполните функцию в файле mu-плагинов или что-то в этом роде, а затем вызовите функцию вручную в своих темах (или подключите ее к общему крючку боковой панели). Возможно, потребуется некоторая работа, чтобы абстрагировать контент из архитектуры WP_Widget
, но, с другой стороны, это было бы действительно динамичным решением рассматриваемой проблемы.
Столкнулся с той же проблемой и вроде как нашел решение. То, что я делаю, заключается в следующем:
1.) Всякий раз, когда что-то меняется на боковой панели блога 1, сохраняйте массив этих виджетов и их настройки в качестве временного по всему сайту, который устаревает через 24 часа.
2.) Во всех детских блогах вставьте какой-нибудь код в sidebar.php это захватывает этот переходный процесс по всему сайту и отображает виджеты.
Звучит довольно просто, но было очень трудно понять … и все еще далек от идеальный.
Давайте покопаемся в каком-нибудь коде:
function antwortzeit_cache_widgets() {
if ( false === ( $widgets = get_site_transient( 'antwortzeit_widgets' ) ) ) {
global $wp_registered_sidebars, $wp_registered_widgets;
foreach ( (array) $wp_registered_sidebars as $key => $value ) {
if ( sanitize_title($value['name']) == sanitize_title('Breite Spalte') ) {
$index = $key;
break;
}
}
$sidebars_widgets = wp_get_sidebars_widgets();
if ( empty( $sidebars_widgets ) )
return false;
if ( empty($wp_registered_sidebars[$index]) || !array_key_exists($index, $sidebars_widgets) || !is_array($sidebars_widgets[$index]) || empty($sidebars_widgets[$index]) )
return false;
$sidebar = $wp_registered_sidebars[$index];
foreach ( (array) $sidebars_widgets[$index] as $id ) {
if ( !isset($wp_registered_widgets[$id]) ) continue;
$params = array_merge(
array( array_merge( $sidebar, array('widget_id' => $id, 'widget_name' => $wp_registered_widgets[$id]['name']) ) ),
(array) $wp_registered_widgets[$id]['params']
);
// Substitute HTML id and class attributes into before_widget
$classname_ = '';
foreach ( (array) $wp_registered_widgets[$id]['classname'] as $cn ) {
if ( is_string($cn) )
$classname_ .= '_' . $cn;
elseif ( is_object($cn) )
$classname_ .= '_' . get_class($cn);
}
$classname_ = ltrim($classname_, '_');
$params[0]['before_widget'] = sprintf($params[0]['before_widget'], $id, $classname_);
$params = apply_filters( 'dynamic_sidebar_params', $params );
$widgets[] = array(
'callback' => $wp_registered_widgets[$id]['callback'],
'base' => $wp_registered_widgets[$id]['callback'][0]->id_base,
'id' => $wp_registered_widgets[$id]['callback'][0]->id,
'params' => $params,
);
}
set_site_transient( 'antwortzeit_widgets', $widgets, 60 * 60 * 24 );
}
}
add_action( 'init', 'antwortzeit_cache_widgets');
Это относится к блогу 1 functions.php (или лучше, плагин все вместе) и сохраняет виджеты в специально созданном переходном режиме каждые 24 часа.
function antwortzeit_widgetbruecke( $instance, $new_instance ) {
delete_site_transient('antwortzeit_widgets');
antwortzeit_cache_widgets();
return $instance;
}
add_filter( 'widget_update_callback', 'antwortzeit_widgetbruecke', 10, 2 );
Это также относится к блогу 1 functions.php и обновляет переходный процесс каждый раз, когда обновляются виджеты.
И, наконец, для других блогов зайдите в sidebar.php :
global $blog_id;
if($blog_id !== 1) {
switch_to_blog(1);
$widgets = get_site_transient( 'antwortzeit_widgets' );
if($widgets) :
foreach($widgets as $widget) :
if ( is_callable($widget['callback']) ) {
call_user_func_array($widget['callback'], $widget['params']);
}
endforeach;
endif;
restore_current_blog();
}
Надеюсь, это может кому-нибудь помочь. Если у кого-то есть какие-то улучшения, они будут очень добро пожаловать.
Убедитесь, что на обоих сайтах во время widgets_init работает один и тот же регистрационный код боковых панелей. Это должно заполнить $wp_registered_sidebars и решить проблему, которую выделил Бун. Сам я этого не пробовал.
Это "может" указать вам правильное направление.
Фреймворк Xtreme с одной темой - http://marketpress.com/product/xtreme/
Проверьте видео - http://vimeo.com/52479425
Основная концепция заключается в том, что при добавлении боковой панели на сетевой сайт вы также можете назначить ее глобальной боковой панелью.
Используете ли вы global $switched;
?
global $switched;
switch_to_blog($blog_id);
dynamic_sidebar($sidebar_name);
restore_current_blog();