rossbearman
  • 0
Новичок

Как показать один и тот же контент на нескольких URL-адресах?

  • 0

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

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

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

Например, страница about должна быть доступна из /site1/about и /site2/about и использовать тему для сайта, который ее запросил, но отображать один и тот же контент на обоих.

Я мог бы просто создать дочерние страницы и установить rel=»canonical» для ссылки на оригинал, но с точки зрения обслуживания было бы предпочтительнее иметь одну страницу, с которой извлекается контент на каждом из дочерних сайтов.

Итак, на вопрос, как мне получить несколько URL-адресов/страниц для извлечения их содержимого из одного источника?

РЕДАКТИРОВАТЬ: Вот пример желаемой структуры:

Затем это повторяется для /service2 и /service3.

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

    • 0
    • Подсайты являются частью одного и того же домена, они просто представляют различные предлагаемые услуги, я отредактирую исходный пост с примерами структуры.

      • 0
    • Сколько страниц типа «о» ? Только один или много? Являются ли они стандартными для каждого сайта, или на некоторых сайтах могут быть страницы «A», «B» и «C», тогда как на других сайтах есть «A», «D» и «E» ? Будете ли вы устанавливать их один раз, и пользователь никогда их не изменит, или пользователям нужно будет гибко назначать и переназначать? Будут ли URL-слаги всегда совпадать на разных сайтах? Будет ли «сервис» настраиваемым типом записи (или, если в настоящее время страницы, они могут быть CPT?)

      • 0
    • @MikeSchinkel Есть несколько подобных, которые должны быть одинаковыми на каждом дочернем сайте. (/ о, / контакт, / отзывы, / счета-платежи, / требования). Все они будут на каждом сайте, и они являются фиксированными, URL-адреса будут одинаковыми, поэтому /service1/about, /service2/about. Клиенту не нужно иметь возможность создавать новые или изменять их. Спасибо!

      • 0
    • Похоже, это должно быть именно то, что мне нужно! Я посмотрю через пару дней и вернусь к вам. Спасибо за вашу помощь @MikeSchinkel.

      • 0
    • @Ross Bearman — надеюсь, это сработает для вас.

      • 0
    • Спасибо за отличный совет, код и пошаговое руководство @MikeSchinkel, это было бесценно.

      • 0
    • @Росс Бирман — Ура! Рад, что смог помочь. (Я люблю отвечать на такие вопросы!)

      • 0
    • @MikeSchinkel Извините, что прошу большего, но, как объяснено в исходном вопросе, у каждой службы есть своя тема. В настоящее время это обрабатывается несколько хакерски в заголовке, используя следующий код: <?php elseif(is_page(site_service1_page()) || $post->post_parent == site_service1_page()): ?> <link href="<?php bloginfo('stylesheet_directory'); ?>/css/screen-service1.css" rel="stylesheet" type="text/css" /> Это не работает с системой базовых служб, поэтому есть ли лучший способ получить корневой путь (например, service1) в заголовке?

      • 0
  2. Я все еще борюсь с точными требованиями, но если я правильно понимаю, я думаю, что вы можете добиться своих целей, если будете использовать код, который я вам привожу ниже, а затем выполните следующие действия:

    1. Создайте страницу для каждой из ваших услуг (что, похоже, вы уже сделали): /service1/ , /service2/, и т. д.

    2. Создайте «базовую» страницу службы с URL-адресом /base-service/ ; не волнуйтесь, никто никогда не увидит это за пределами сайта.

    3. Назначьте /base-service/ родительской (или прародительской) страницей все «виртуальные общие» дочерние страницы, которые вы хотите реплицировать в каждой службе.

    4. Создайте любые страницы для конкретных служб, которые вы также можете захотеть иметь, и назначьте их соответствующей странице (например, «Сервис 2»).

    5. Создайте шаблон страницы в своей теме для вызываемых вами служб page-service.php и убедитесь, что каждая из ваших служебных страниц использует этот шаблон страницы (это необходимо, чтобы мы могли определить, какие из ваших страниц предназначены для служб).

    Итак, вот код класса, который я назвал, Yoursite_SharedChildPages который вы можете хранить в файле вашей темы functions.php или в .php файле плагина, который вы можете написать для своего сайта:

    if (!class_exists('Yoursite_SharedChildPages')) {
      class Yoursite_SharedChildPages {
        // If wanted we could enhance to allow these values to be defined in an 'init' hook
        static $PAGE_TEMPLATE = 'page-service.php';
        static $ABSTRACT_ROOT = 'base-service';
        static function on_load() {
          // Hook 'request' to route the request correctly
          add_filter('request',array(__CLASS__,'request'));
          // Hook 'page_link' to compose URLs correctly
          add_filter('page_link',array(__CLASS__,'page_link'));
        }
        static function request($query_vars) {
          if (!empty($query_vars['pagename'])) {
            // If the page URL rewrite matched meaning WordPress thinks it's a Page
            // Split the URL path by path segments (i.e. by slashes)
            $pagename = explode('/',$query_vars['pagename']);
            if ($pagename[0] == self::$ABSTRACT_ROOT) {
              // If the first path segment is the abstract root we care about
              if (count($pagename)==1) {
              // Don't allow anyone to visit this abstract root page
                $pagename = array('#'); // An invalid page name, so it will 404
              } else {
                // If it is a child page in which case redirect to the first service
                // This is important so the user can view the page after they edit it
                $pages = self::get_page_ids_by_template(self::$PAGE_TEMPLATE);
                if (isset($pages[0]) && $page = get_post($pages[0])) {
                  // Assuming we have at least one page with the page template
                  $pagename[0] = $page->post_name;
                  // then redirect to it the first service found.
                  wp_safe_redirect('/'.implode('/',$pagename).'/');
                  exit;
                }
              }
            } else if (count($pagename)>1) {
              // If there are child pages
              if (get_page_by_path($query_vars['pagename'])) {
                // If it is an actual child page then just let it pass thru
              } else {
                  // If a virtual child page then see if parent has the template
                $parent = get_page_by_path($pagename[0]);
                $pages = self::get_page_ids_by_template(self::$PAGE_TEMPLATE);
                if (in_array($parent->ID,$pages)) {
                  // If virtual child of a service page, change parent to the abstract root
                  $pagename[0] = self::$ABSTRACT_ROOT;
                  $query_vars['pagename'] = implode('/',$pagename);
                  // The URL doesn't match a virtual page, will appropriately get a 404
                }
              }
            } else {
              $pagename = false;
            }
          }
          if (is_array($pagename))
            $query_vars['pagename'] = implode('/',$pagename);
          return $query_vars;
        }
        static function get_page_ids_by_template($template) {
          // This can be performance optimized but I wouldn't worry about it 
          // until there is a performance issue
          global $wpdb;
          $sql = "SELECT post_id FROM {$wpdb->postmeta} " . 
                 "WHERE meta_key='_wp_page_template' AND meta_value='%s'";
          return $wpdb->get_col($wpdb->prepare($sql,$template));
        }
        static function page_link($link) {
          $parts = explode('/',$link);
          if ($parts[3]==self::$ABSTRACT_ROOT) {
            // This is really only useful for links in the admin.
            if (!is_admin()) {
              global $wp_query;
              if (!empty($wp_query->query_vars['pagename'])) {
                $pagename = explode('/',$wp_query->query_vars['pagename']);
              }
            } else {
              // If we get a URL that uses the abstract root, assign it the first service.
              $pages = self::get_page_ids_by_template(self::$PAGE_TEMPLATE);
              if (isset($pages[0]) && $page = get_post($pages[0])) {
                // Assuming we have at least one page with the page template
                $parts[3] = $page->post_name;
                // then redirect to it the first service found.
                $link = implode('/',$parts);
              } else {
                $link = preg_replace('#^(https?://[^/]+)(/.*)$#','$1',$link);
              }
            }
          }
          return $link;
        }
      }
      Yoursite_SharedChildPages::on_load();
    }
    

    И вот несколько скриншотов, которые могут проиллюстрировать упомянутые выше шаги:

    Дайте мне знать, если это не то, что вы искали, и/или если вы столкнулись с чем-то, что необходимо решить с помощью этого решения в дополнение к тому, что я закодировал. Удачи!

    • 0

Оставить ответ

You must login to add an answer.