WordPress MU Domain Mapping

該插件允許 WordPress MU 站點或 WordPress 3.0 網絡的用戶將他們的博客/站點映射到另一個域。

它需要手動安裝,因為必須將一個文件複製到 wp-content/. 升級插件時,記得更新domain_mapping.php和sunrise.php。安裝頁面上有完整的說明,很容易理解。你也應該閱讀這個頁面

超級管理員必須在超級管理員->域映射中配置插件。您必須在此頁面上輸入服務器的 IP 或 IP 地址(以逗號分隔)。這些地址純粹用於文檔目的,因此用戶知道它們是什麼(因此用戶可以正確設置其 DNS)。它們在插件中沒有做任何特別的事情,它們只是打印出來供用戶查看。

您還可以在此頁面上定義 CNAME。它很可能是您網絡的域名。有關一些限制和警告,請參見下文。

您的用戶應該轉到工具-> 域映射,他們可以在其中添加或刪除域。必須將一個域設置為博客的主域。映射域時(例如“example.com”),您的用戶必須在其 DNS 中創建指向該 IP 地址的 A 記錄。如果您的服務器使用多個 IP 地址,它們應該使用多個 A 記錄。
如果您的用戶正在映射域(有時稱為“子域”)的主機名,例如 www.example.com 或 blog.example.com,則創建指向其博客 url(不是 IP 地址)的 CNAME 記錄就足夠了。

登錄頁面幾乎總是會重定向回博客的原始域進行登錄,以確保用戶登錄到原始網絡以及域映射的網絡。出於安全原因,如果您允許用戶在映射域上使用他們的儀表板,則會禁用遠程登錄。

超級管理員現在可以選擇允許用戶通過提供 IP(或 IP 地址列表)來設置 DNS ANAME 記錄,或者設置 CNAME 但不能同時設置(為最終用戶輸入 CNAME 會使 IP 的使用無效)

關於使用 CNAME 和 ANAME 處理 DNS 存在很多爭論,因此這兩種方法都可用,具體取決於您的偏好和設置。

要記住的事情:

  • 應避免指向其他 CNAME 記錄的 CNAME 記錄(RFC 1034 第 5.2.2 節),因此,如果您的域名是 IP 地址(或地址)的 ANAME,則僅告訴您的最終用戶使用您選擇的域名作為其 CNAME DNS 條目)
  • 僅當您的主域是 IP 地址的 ANAME 時才使用 CNAME 方法。這個非常重要。你怎麼知道的?檢查您的 dns 或詢問您的託管公司。
  • 讓您的用戶可以選擇只使用您選擇的域名而不是 IP(或 IP 列表)來設置為他們的 CNAME,這將使您的 WordPressMU 博客平台或 WordPress 3.0 網絡的管理更容易,例如購買/部署新服務器或確實添加更多服務器以在循環場景中使用。您的最終用戶無需擔心 IP 地址更改。
  • 最後,告訴您的最終用戶使用 ANAME IP 或 CNAME 域名取決於您以及您的系統的部署方式。
  • 進一步閱讀:http://www.faqs.org/rfcs/rfc2219.html
  • 對於本地化:將翻譯文件(即 wordpress-mu-domain-mapping-xx_XX.mo)放在 wp-content/plugins/wordpress-mu-domain-mapping/languages 目錄中。您可能必須自己創建該目錄。

動作掛鉤

您現在可以連接到 domain_mapping mu-plugin 的某些部分,以使您能夠擴展內置的功能而無需修改此插件。為此,只需在該插件之後調用的 mu-plugins 目錄中創建一個腳本(例如,將其命名為 domain_mapping_extended.php)。

  • dm_echo_updated_msg

當您想在最終用戶更新其設置時為他們添加額外消息時,此掛鉤適用於,當前的用法是刪除現有操作並將其替換為您自己的操作,如頁面下方示例中所示。

  • dm_handle_actions_init

在我們為想要更新其映射的用戶添加我們自己的處理程序之前,我們可以使用此操作來連接到您的數據中心 API 以進行通信。一個例子是在我們發送和接收 XML 查詢之前加載一個 API 類並進行連接。再一次,請參閱頁面下方的示例。您的函數可以使用 $domain 變量。

  • dm_handle_actions_add

當用戶將域名添加到他們的映射時,此操作可用於在您的服務器上執行其他任務。一個例子是檢查用戶是否已經為名稱設置了 DNS 記錄以正確指向您的服務器。您的函數可以使用 $domain 變量。

  • dm_handle_actions_primary

這在大多數情況下可能會或可能不會被普遍使用,但以防萬一。您的函數可以使用 $domain 變量。

  • dm_handle_actions_del

當用戶刪除其域映射之一時,此操作可用於反轉 dm_handle_actions_add 所做的操作。一個示例是使用數據中心的 API 從服務器中刪除域映射。您的函數可以使用 $domain 變量。

  • dm_delete_blog_domain_mappings

如果博客曾經被刪除並且您使用了 handle_actions,那麼此操作將使您能夠整理。例如,當用戶設置了多個域映射並且博客被刪除時,您的函數可以刪除留下的任何混亂。您的函數可以使用 $domains 數組(域的編號數組)。注意,如果用戶沒有映射,這也會被調用,在空數組的情況下應該小心。

示例用法

<?php // Filename: mu-plugins/domain_mapping_extended.php


// NOTE,
//  This example will not 'just work' for anyone, it is to show basic
//  usage of dm_echo_updated_msg, dm_handle_actions_init and
//  dm_handle_actions_add


// We do not need translations but would really like a message when a
// users DNS entry is not ready

function dm_echo_extended_updated_msg() {
    switch( $_GET[ 'updated' ] ) {
        case "add":
            $msg = 'You have added a new domain name.';
            break;
        case "exists":
            $msg = 'That domain name already exists, please try again.';
            break;
        case "primary":
            $msg = 'New primary domain created - enjoy!';
            break;
        case "del":
            $msg = 'The domain name has been removed.';
            break;
        case "dnslookup":
            $msg = 'The domain is not pointing to ' .
            get_site_option( 'dm_cname' ) . ', please set up your DNS.';
        break;
    }
    echo "<div class='updated fade'><p>$msg</p></div>";
}
// REMOVE THE ORIGINAL MESSAGES
remove_action('dm_echo_updated_msg','dm_echo_default_updated_msg');
// REPLACE WITH OUR OWN
add_action('dm_echo_updated_msg','dm_echo_extended_updated_msg');


// Prepare to use our Datacenter API

function dm_extended_handle_actions_init($domain) {
    global $datacenter_api;
    // There is a good chance we will be accessing the datacentre API
    require_once(dirname(__FILE__) ."/classes/xmlAbstract.class.php");
    require_once(dirname(__FILE__) ."/classes/xmlParserClass.php");
    require_once(dirname(__FILE__) ."/classes/datacenterAPIClass.php");
    $datacenter_api = new datacenter_api('MY_API_KEY', 'API_TYPE');
}
$datacenter_api = null;
add_action('dm_handle_actions_init', 'dm_extended_handle_actions_init');


// Check the users DNS is ready to go (we are using the CNAME option)
// then add the mapping to the datacenter API

function dm_extended_handle_actions_add($domain) {
    global $datacenter_api;
    // Check the domain has the correct CNAME/ANAME record
    $dmip = gethostbyname(get_site_option( 'dm_cname' ));
    $urip = gethostbyname($domain);
    if ($dmip != $urip) {
        wp_redirect( '?page=domainmapping&updated=dnslookup' );
        exit;
    }
    $datacenter_api->add_mapping($domain);
}
add_action('dm_handle_actions_add', 'dm_extended_handle_actions_add');
?>