如何在多个URL上显示相同的内容?

时间:2011-03-27 作者:Ross Bearman

一个客户目前有一个由三个不同的子站点(运行一个WordPress安装)组成的网站,每个子站点的主题略有不同(相同的布局,不同的配色方案)。

我目前已经将其设置为每个子站点都是一个页面,所有页面都是子站点。标题。php检查哪个页面是父页面并包含适当的样式。

该问题出现在整个站点中相同的页面上,客户希望将这些页面作为单独的页面从每个子站点访问。

例如,“关于”页面应可从/site1/about和/site2/about访问,并使用请求该页面的站点的主题,但在这两个页面上显示相同的内容。

我可以只创建子页面,并将rel=“canonical”设置为引用原始页面,但从维护的角度来看,最好在每个子站点上都有一个页面,从中提取内容。

因此,对于这个问题,我如何获得多个URL/页面来从单个来源提取其内容?

编辑:以下是所需结构的示例:

  • www.example.com - 显示指向三项主要服务的链接以及一般信息www.example.com/about - 显示有关客户端的信息,样式与www.example相匹配。comwww.example.com/service1 - 显示与特定服务相关的导航,并以其自身的颜色设置样式,以及通用链接(关于,联系方式)
  • www.example.com/service1/about - 显示/service1的导航和样式表,但使用www.example中的内容。com/about(以及对www.example.com/about的规范链接引用)
然后对/service2和/service3重复此操作。

1 个回复
最合适的回答,由SO网友:MikeSchinkel 整理而成

我仍在努力满足确切的需求,但如果我理解正确,我认为如果您使用我在下面提供的代码,然后执行以下操作,您可以实现您的目标:

为您的每个服务创建一个页面(听起来您已经这样做了):/service1/, /service2/, 等

创建一个“基本”服务页面,URL为/base-service/; 别担心,没有人会在网站外部看到这一点。

分配/base-service/ 作为每个服务下要复制的所有“虚拟共享”子页面的父页面(或祖父母页面)。

创建您可能想要的任何特定于服务的页面,并将其分配到适当的页面(例如“服务2”)

创建page template in your theme 为您的服务致电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();
}
下面是一些屏幕截图,可以说明上述步骤:

如果这不是您想要的,和/或除了我编写的代码之外,如果您遇到了此解决方案需要解决的问题,请告诉我。祝你好运

结束

相关推荐

custom taxonomies on pages

我需要一些帮助如何在所选页面上显示自定义分类?我的意思是我有3个自定义分类法位置、持续时间和;coursesi已经创建了三个页面,我想在其中显示这些自定义分类法的术语,我已经使用函数在我的帖子中显示了这些术语<?php echo do_shortcode(\"[terms]\"); ?> 但同样的事情我也想在我的页面上显示,我怎么能做到呢??????