如何在WordPress中显示Drupal 6.20菜单


How to display a Drupal 6.20 menu in WordPress?

是否可以显示(通过php) Drupal 6.20站点的主菜单位于同一域的子目录中的WordPress主题模板文件?

现在,我通过从Drupal站点复制静态html并将其添加到位于mydomain.com/blog/站点的WordPress模板中的header.php来显示菜单。但是,当Drupal站点中添加了另一个菜单项,或者以任何方式更改了Drupal菜单时,这当然就行不通了。

那么是否有一个Drupal php函数将菜单拉入WP文件?

如果做不到这一点,php是否有办法解析Drupal页面的html菜单(是的,这将是丑陋的),并显示在WP?

挑战的第一部分是只输出菜单,尽可能少(或没有)周围的HTML,因此在解析HTML时需要做的工作尽可能少。

第二部分是从Drupal获取输出,并实际显示在您的WordPress站点上。

您可以使用$wpdb对象的新实例在WordPress中添加Drupal数据库作为辅助数据库,编写查询以从表中获取正确的内容,并格式化结果。这可能有用,但可能有些矫枉过正。

另一个可行的选择可能是使用JSON格式化主链接的输出,在Drupal中使用drupal_json函数,然后在Wordpress中使用JSON提要。

我假设:

  • 您拥有登录Drupal站点的管理权限,您需要创建节点,并清除主题缓存
  • 您想要输出Primary Links菜单,90%以上的Drupal站点使用该菜单。这可能是真的,但也有可能您的站点使用自定义菜单。如果是这样,这仍然是可能的,您只需在步骤3中编写稍微不同的代码。

步骤如下:

  1. 创建一个Drupal节点(你可以叫它任何名字,它只是一个占位符)
  2. 获取虚拟页面的节点id(例如:、节点/234)。从节点id开始,在Drupal站点的themes文件夹中创建一个一次性页面模板。它应该被称为page-node-xxxx.tpl.php, xxxx是你的节点id
  3. 将此代码添加到page-node-xxxx.tpl.php:

    <?php drupal_json(menu_navigation_links(variable_get('menu_primary_links_source', 'primary-links'))); ?>

  4. 这将创建一个JSON feed的菜单项。
  5. 通过访问http://yoursite.com/admin/build/themes和访问http://yoursite.com/node/xxxx来清除Drupal站点的主题缓存,以查看原始JSON提要。

  6. 你现在应该能够使用jQuery的方法,如$。getJSON或$。在你的Wordpress主题中使用json_decode和curl来使用和显示JSON feed,或者可能使用json_decode和curl输出你的数组作为HTML。

关于Drupal的drupal_json函数的一个好处是它已经发送了正确的JSON头,所以现在你所要做的就是编写jQuery或PHP来做你需要的。

我假设你是一个Wordpress专家,有Drupal的工作知识,但可能不是很熟悉它的内部工作原理。所以,抱歉如果它看起来太基本(或不够基本:)。

Drupal主题引擎是非常模块化的——你可以对Drupal进行适当的PHP调用来渲染菜单,然后将HTML作为你的WordPress页面的一部分。

g_thom的回答非常好,如果您希望创建一个非常简单的模块来输出主导航,您可以这样写:

<?php
function getmenus_help($path, $arg) {
  // implementing the help hook ... well, not doing anything with it just now actually
}
function getmenus_all() {
  $page_content = '';
  $page_content = json_encode(menu_navigation_links(variable_get('menu_primary_links_source', 'primary-links')));
  // fill $page_content with the menu html
  print $page_content;
  return NULL;
}
function getmenus_menu() {
  $items = array();
  $items['getmenus'] = array(
    'title' => 'Get Menus',
    'page callback' => 'getmenus_all',
    'access arguments' => array('access getmenus'),
    'type' => MENU_CALLBACK,
  );
  return $items;
}
// permissions
function getmenus_perm() {
  return array('access getmenus');
}
在你的PHP代码中你可以这样写:
function primary_links() {
  $primary_links = file_get_contents(SITE_URL . '/getmenus');
  $primary_links = json_decode($primary_links);
  $primary_links = (array)$primary_links;
  $i = 0;
  $last = count($primary_links);
  $output = '';
  foreach ($primary_links as $pm) {
    $href = $pm->href;
    if (strpos($pm->href, 'http://') === FALSE) {
      if ($pm->href == '<front>') {
        $href = SITE_URL . '/';
      } else {
        $href = SITE_URL . '/' . $pm->href;
      }
    }
    $output .= '
      <li>
          <a href="'. $href .'" title="'.$pm->title.'">'.$pm->title.'</a></li>';
    $i++;
  }
  return $output;
}

我希望这对你有帮助!

PS:确保你更新了模块的权限,允许匿名用户访问你在模块中设置的路径,否则你会得到一个403 Permission Denied