WordPress Multisite: Практические функции и методы

Хотя каждый “сайт” в сети независим, есть много способов обмена настройками, кодом и контентом по всей сети.

С начала года, я разрабатывал темы и плагины для WordPress Multisite питанием контент-сети. За это время я узнал много мощных советов и приемов, уникальных для Multisite. Это руководство познакомит вас с несколькими функциями, специфичными для мультиситов, а также с примерами программирования в реальном мире, которые вы можете начать использовать сегодня. Надеюсь, это откроет вам глаза на некоторые из новых возможностей, доступных в Multisite.

Дальнейшее чтение на SmashingMag:

Зачем использовать Multisite?

Multisite является отличным вариантом для фрилансеров, предприятий и организаций, которые управляют несколькими сайтами WordPress. Являетесь ли вы фрилансером, который хочет обеспечить хостинг и техническое обслуживание клиентов, колледж организации, желающие централизовать управление ваших веб-сайтов, или большой издатель новостей пытается изолировать силосы для различных отделов, Multisite является ответом.

Управление несколькими веб-сайтами с одной установкой WordPress позволяет легко обновить ядро, плагины и темы для каждого веб-сайта в сети. Вы можете обмениваться функциональными возможностями на нескольких веб-сайтах с помощью сетевых плагинов, а также стандартизировать элементы проектирования на нескольких веб-сайтах, используя родительскую тему.

Обзор преимуществ

  • Пользователи могут легко получить доступ и управлять несколькими веб-сайтами с одной учетной записью и профилем пользователя.
  • Пользователи могут получить доступ к определенному веб-сайту или каждому веб-сайту, используя одну и ту же учетную запись.
  • Информация с одного веб-сайта может быть полностью изолирована от других.
  • Информация с одного веб-сайта может быть легко передана другим.
  • Функциональность темы может быть распространена на нескольких веб-сайтах, используя отношения между родителями и детьми или плагин функциональности.
  • Обновления и обновления могут быть развернуты на нескольких веб-сайтах за меньшее время, что приведет к снижению накладных расходов и расходов на техническое обслуживание.
  • Настройки WordPress могут быть эффективно распределены централизованным, каскадным методом с использованием сетевых плагинов.

Я не буду объяснять, как установить и настроить Multisite. Если вам нужна помощь, много замечательных статей доступны в WordPress Codex.

Работа с многоузловыми функциями

Многоузловые установки WordPress содержат дополнительные функции и функции, которые разработчики темы могут использовать для улучшения работы на веб-сайте. Если вы нашли себя разработки темы и плагины для WordPress Multisite, рассмотреть следующие советы, чтобы настроить и улучшить подключение к сети.

Отображение информации о сети

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

Multisite хранит глобальные параметры в wp_sitemeta таблице базы данных, такие как имя сети ( ), site_name адрес электронной почты администратора admin_email () и URL основного веб-сайта ( siteurl ). Чтобы получить доступ к этим опциям, вы можете использовать get_site_option() эту функцию.

В этом примере я использовал get_site_option() функцию вместе с get_blog_count() и отображать предложение с get_user_count() подробной информацией о сети.

<?php if( is_multisite() ): ?>

   <?php echo esc_html( get_site_option( 'site_name' ) ); ?> network<?php echo get_blog_count(); ?><?php echo get_user_count(); ?> users.

<?php endif; ?>

Этот небольшой фрагмент кода будет отображать следующие HTML:

Smashing Magazine network52262 users.

В файле можно найти множество /wp-includes/ms-functions.php полезных многоузловых функций. Я настоятельно рекомендую просмотра проекта Trac себя. Это отличный способ найти новые функции и ознакомиться со стандартами кодирования WordPress.

Создание меню сетевой навигации

Многие сети имеют последовательную динамическую навигацию, которая появляется на всех веб-сайтах, что делает его легким для посетителей для просмотра сети. Используя $wpdb класс базы данных,наряду с get_site_url() , home_url() get_current_blog_id() switch_to_blog() restore_current_blog() и, и функции, мы можем создать полностью динамическое меню сети, в том числе класса ( .current-site-item ), чтобы выделить текущий веб-сайт.

Запрос, созданный в этом примере, может стать очень большим, что может привести к проблемам с производительностью. По этой причине мы будем использовать API Transients,который позволяет нам временно хранить кэшированную версию результатов в качестве сетевого веб-сайта “переходных” в sitemeta таблице с использованием set_site_transient() и get_site_transient() функций.

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

Запрос S’L будет работать каждые два часа, а фактические данные будут возвращены из переходного, что делает вещи намного более эффективными. Я включил два параметра, $size $expires и, что позволяет контролировать количество сообщений вернулся и срок действия для переходного.

Одним из наиболее мощных элементов этого примера является использование switch_to_blog() и restore_current_blog() . Эти две функции Multisite позволяют нам временно переключаться на другой веб-сайт (по ID), собирать информацию или контент, а затем вернуться к исходному веб-сайту.

Добавьте следующее в файл функции вашей темы.php:

/**
 * Build a list of all websites in a network
 */
function wp_list_sites( $expires = 7200 ) {
   if( !is_multisite() ) return false;

   // Because the get_blog_list() function is currently flagged as deprecated 
   // due to the potential for high consumption of resources, we'll use
   // $wpdb to roll out our own SQL query instead. Because the query can be
   // memory-intensive, we'll store the results using the Transients API
   if ( false === ( $site_list = get_transient( 'multisite_site_list' ) ) ) {
      global $wpdb;
      $site_list = $wpdb->get_results( $wpdb->prepare('SELECT * FROM wp_blogs ORDER BY blog_id') );
      // Set the Transient cache to expire every two hours
      set_site_transient( 'multisite_site_list', $site_list, $expires );
   }

   $current_site_url = get_site_url( get_current_blog_id() );

   $html = 'blog_id . '"' . $class . '>[' . get_bloginfo('name') . '](' . home_url() . ')

           ' . "n"; restore_current_blog(); } $html .= '

           ' . "nn"; return $html; }

(Пожалуйста, обратите внимание: функция в get_blog_list() настоящее время изу): из-за возможности высокого потребления ресурсов, если сеть содержит более 1000 веб-сайтов. В настоящее время нет функции замены, поэтому я использовал пользовательский $wpdb запрос на своем месте. В будущем разработчики WordPress, вероятно, выпустят лучшую альтернативу. Я предлагаю проверить на замену перед реализацией этого примера в реальной сети.)

Эта функция сначала проверяет, что Multisite включен и, если это не так, false возвращается. Во-первых, мы собираем список идентивересток всех веб-сайтов в сети, сортируя их в порядке возрастания с помощью нашего пользовательского $wpdb запроса. Далее, мы итерировать через каждый веб-сайт в списке, используя, switch_to_blog() чтобы проверить, является ли это текущий веб-сайт, и добавить .current-site-item класс, если это так. Затем мы используем имя и ссылку на этот сайт, чтобы создать пункт списка для нашего меню, возвращаясь к первоначальному веб-сайту с помощью restore_current_blog() . Когда цикл будет завершен, мы возвращаем полный неупорядоченный список, который будет выведен в нашей теме. Это так просто.

Чтобы использовать это в теме, позвоните в wp_list_sites() функцию, где вы хотите, чтобы сетевое меню было отображено. Поскольку функция сначала проверяет установку с поддержкой Multisite, следует убедиться, что возвращенное значение не отображается false перед отображением соответствующего HTML.

<?php
// Multisite Network Menu
$network_menu = wp_list_sites();
if( $network_menu ): 
?>
Этт;?php эхо $network»меню; ?»gt;

Злт;?php endif; ??

Список последних сообщений по всей сети

Если веб-сайты в вашей сети имеют схожие темы, вы можете создать список самых последних сообщений на всех веб-сайтах. К сожалению, WordPress не имеет встроенной функции, чтобы сделать это, но с небольшой помощью от $wpdb класса базы данных,вы можете создать пользовательский запрос базы данных последних сообщений по всей сети.

Этот запрос S’L также может стать очень большим. По этой причине мы снова будем использовать API Transients в методе, очень похожем на то, что используется в wp_list_sites() функции.

Начните с добавления wp_recent_across_network() функции в файл функции вашей темы.

/**
 * List recent posts across a Multisite network
 *
 * @uses get_blog_list(), get_blog_permalink()
 *
 * @param int $size The number of results to retrieve
 * @param int $expires Seconds until the transient cache expires
 * @return object Contains the blog_id, post_id, post_date and post_title
 */
function wp_recent_across_network( $size = 10, $expires = 7200 ) {
   if( !is_multisite() ) return false;

   // Cache the results with the WordPress Transients API
   // Get any existing copy of our transient data
   if ( ( $recent_across_network = get_site_transient( 'recent_across_network' ) ) === false ) {

      // No transient found, regenerate the data and save a new transient
      // Prepare the SQL query with $wpdb
      global $wpdb;

      $base_prefix = $wpdb->get_blog_prefix(0);
      $base_prefix = str_replace( '1_', ’ , $base_prefix );

      // Because the get_blog_list() function is currently flagged as deprecated 
      // due to the potential for high consumption of resources, we'll use
      // $wpdb to roll out our own SQL query instead. Because the query can be
      // memory-intensive, we'll store the results using the Transients API
      if ( false === ( $site_list = get_site_transient( 'multisite_site_list' ) ) ) {
         global $wpdb;
         $site_list = $wpdb->get_results( $wpdb->prepare('SELECT * FROM wp_blogs ORDER BY blog_id') );
         set_site_transient( 'multisite_site_list', $site_list, $expires );
      }

      $limit = absint($size);

      // Merge the wp_posts results from all Multisite websites into a single result with MySQL "UNION"
      foreach ( $site_list as $site ) {
         if( $site == $site_list[0] ) {
            $posts_table = $base_prefix . "posts";
         } else {
            $posts_table = $base_prefix . $site->blog_id . "_posts";
         }

         $posts_table = esc_sql( $posts_table );
         $blogs_table = esc_sql( $base_prefix . 'blogs' );

         $query .= "(SELECT $posts_table.ID, $posts_table.post_title, $posts_table.post_date, $blogs_table.blog_id FROM $posts_table, $blogs_tablen";
         $query .= "tWHERE $posts_table.post_type = 'post'n";
         $query .= "tAND $posts_table.post_status = 'publish'n";
         $query .= "tAND $blogs_table.blog_id = {$site->blog_id})n";

         if( $site !== end($site_list) ) 
            $query .= "UNIONn";
         else
            $query .= "ORDER BY post_date DESC LIMIT 0, $limit";
      }

      // Sanitize and run the query
      $query = $wpdb->prepare($query);
      $recent_across_network = $wpdb->get_results( $query );

      // Set the Transients cache to expire every two hours
      set_site_transient( 'recent_across_network', $recent_across_network, 60*60*2 );
   }

   // Format the HTML output
   $html = '

‘; – $html.

‘; возвращение $html; }

Использование этой функции в вашей теме просто. Обязательно проверьте return значение перед выходом HTML, чтобы избежать конфликтов с немультисайтными установками.

<?php
// Display recent posts across the entire network
$recent_network_posts = wp_recent_across_network();
if( $recent_network_posts ):
?>

<?php echo $recent_network_posts; ?>
<?php endif; ?>

Извлекать одиночный столб от другого вебсайта в сети

В некоторых ситуациях вам может быть полезно обратиться к одной странице, публикации или типу публикации с другого веб-сайта в вашей сети. get_blog_post()Функция упрощает этот процесс.

Например, вы можете отобразить the_content() его со страницы “О” на основном веб-сайте в вашей сети.

<?php
// Display "About" page content from the network's primary website
$about_page = get_blog_post( 1, 317 );
if( $about_page ): 
?>

Этт;?php эхо $about»страница-йgt;пост-контента; ?

Злт;?php endif; ??Вы заметили, что весь $post объект возвращается? В этом примере мы использовали the_content() только, но гораздо больше информации доступно для других обстоятельств.

Настройка глобальных переменных по всей сети

Запуск любого проекта WordPress в твердой локальной среде развития всегда важно. Возможно, вам будет удобно иметь глобальную переменную, которая определяет, является ли веб-сайт “живым” или “постановка”. В Multisite вы можете достичь этого с помощью сетевого плагина, который содержит следующую удобную функцию, при условии, что ваш локальный хост содержит localhost в URL:

/**
 * Define network globals
 */
function ms_define_globals() {
   global $blog_id;
   $GLOBALS['staging'] = ( strstr( $_SERVER['SERVER_NAME'], 'localhost' ) ) ? true : false;
}
add_action( 'init', 'ms_define_globals', 1 );

Когда вы будете использовать эту $staging переменную? Я использую его для отображения сообщений, уведомлений и информации, связанных с разработкой, для улучшения рабочего процесса.

Отображение информации о запросе страницы в локальной среде

Я использую $staging глобальную переменную для отображения количества запросов и скорости запроса страницы для каждой страницы в локальной среде.

/**
 * Display page request info
 *
 * @requires $staging
 */
function wp_page_request_info() {
   global $staging;
   if ( $staging ): ?>
      <?php echo get_num_queries(); ?> queries in <?php timer_stop(1); ?> seconds.
   <?php endif;
}
add_action( 'wp_footer', 'wp_page_request_info', 1000 );

Это только один из многих способов использования ms_define_globals() функции. Я использовал его для определения, поиска и замены URL-адресов в сети доставки контента, для обнаружения мобильных устройств и агентов пользователей, а также для фильтрации локальных URL-адресов вложений.

Заключение

Существует огромное значение в простоте управления несколькими веб-сайтами в одной установке WordPress. Использование WordPress Multisite быстро становится необходимым навыком среди разработчиков WordPress. Эти методы должны обеспечить прочную основу для вас, чтобы опираться на, так что вы можете быть следующей WordPress Multisite тема рок-звезда!

Прочие ресурсы

Источник: smashingmagazine.com

Великолепный Журнал

Великолепный, сокрушительный, разящий (см. перевод smashing) независимый журнал о веб-разработке. Основан в 2006 году в Германии. Имеет няшный дизайн и кучу крутых авторов, которых читают 2 млн человек в месяц.

Добавить комментарий

%d такие блоггеры, как: