如何在多個WordPress站點之間共享登錄和用戶

Spread the love

如何在多個WordPress站點之間共享登錄和用戶

, 更新日期:2017年6月5日,

分享登錄wordpress

我們的目標是設立兩個WordPress網站,共享登錄和相同的用戶。一旦用戶訂閱了一個網站,他將能夠訪問具有相同角色和功能的其他網站。

為了實現這一目標,我們應該能夠編輯WordPress配置文件並更新數據庫表。對WordPress架構和數據庫結構的一般了解至關重要,以及WordPress開發的基礎知識。不用擔心,如果你不是高手。只要按照這個帖子的指示,並在評論中提出你的問題。

在開始編碼之前,我們需要知道WordPress儲存用戶角色和功能的地方。所以,我們的第一步是深入理解數據庫表。

用戶數據和元數據(User Data and Metadata)

WordPress存儲用戶的相關數據到三個表:{$pref}options,{$pref}users和{$pref}usermeta。

  • 該{$pref}options表將可用角色和功能的完整列表存儲在其option_key字段的行中{$pref}user_roles。
  • 該{$pref}users表存儲基本用戶數據,如登錄,密碼,電子郵件,網址等。
  • 該{$pref}usermeta表存儲用戶元數據。

當使用新的WordPress安裝時,我們不必關心表中的{$pref}user_roles行{$pref}options,因為相應的option_value字段始終具有相同的值。我們會去考慮這一行的時機,以防萬一我們在改變現有角色或功能的安裝。

不用擔心{$pref}users表,因為它存儲在網站之間共享用戶時不會改變的基本用戶數據。
而{$pref}usermeta表則是我們要更新以實現目標的唯一表。

用戶和usermeta表結構(來源:Codex數據庫描述)
用戶和usermeta表結構
(來源:Codex 數據庫描述

{$pref}usermeta將用戶元數據存儲在鍵/值對(key/value pairs)中。在這個表中,我們必須考慮五行存儲的數據。

usermeta表中的五行存儲有關用戶功能,級別和儀表板設置的數據
usermeta表中的五行存儲有關用戶功能,級別和儀表板設置的數據

第一行的meta_key字段設置為{$pref}capabilities,相應的meta_value字段是一個持有用戶角色的序列化數組。第二行存儲用戶級別(請注意,用戶級別已從WordPress 3.0中棄用)。剩下的三行涉及儀表板設置,我們不會在這篇文章中介紹。
用戶角色,級別和設置特定於WordPress安裝,並由相同的$pref值標識。當我們的目標是在網站之間共享用戶時,這是一個重要的信息,因為我們必須重複這些行並相應地更改該meta_key字段。

當我們的目標是在新WordPress安裝之間共享登錄和用戶時,我們必須了解用戶表。當在現有網站上工作時,我們應該考慮許多插件添加額外的行{$pref}usermeta,我們可能需要更深入地查看數據庫表。

關於用戶表,我們可以向前邁進一步。現在我們必須在wp-config.php文件中定義兩個特定的常數。

自定義用戶表 – 共享登錄

除了{$pref}users和{$pref}usermeta,WordPress允許我們設置自定義表。這意味著如果兩個(或更多)WordPress網站共享一個數據庫,我們可以為所有這些數據庫設置相同的用戶和usermeta表。因此,共享這些表的所有網站將共享相同的用戶。

注意:為了共享相同的用戶和usermeta表,WordPress安裝必須共享相同的數據庫。

我們只需要定義CUSTOM_USER_TABLE和CUSTOM_USER_META_TABLE進入wp-config.php文件,如下面的代碼所示:

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', 'my_users_table' );
define( 'CUSTOM_USER_META_TABLE', 'my_usermeta_table' );
注意:在現有網站上,必須先備份WordPress,然後再對wp-config.php文件和數據表進行更改

現在是運行我們兩個WordPress安裝的時候了。

安裝WordPress

為方便起見,我將WordPress根文件夾命名為first_與second_相應的表前綴。
現在我們來運行第一個安裝。

在這個例子中,我們將表前綴字段設置為first_
在這個例子中,我們將表前綴設置為first_
注意:所有安裝將共享單個數據庫,我們應該為每個安裝提供唯一的表前綴。

當第一個WordPress網站啟動並運行時,我們可以編輯其配置文件。打開/first/wp-config.php,並在stop editing註釋之上添加以下行:

$table_prefix = 'first_';

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', $table_prefix . 'users' );
define( 'CUSTOM_USER_META_TABLE', $table_prefix . 'usermeta' );

/* That's all, stop editing! Happy blogging. */

上述我們已啟用調試(debug)模式強制WordPress將錯誤通知和警告存儲到debug.log文件中(有關如何配置WordPress的深入探討,請閱讀更多關於此主題的內容)。

然後,我們定義了CUSTOM_USER_TABLE和CUSTOM_USER_META_TABLE常數first_users和first_usermeta表。這樣我們不會更改WordPress的默認設置。

我們完成了第一次安裝。接下來,我們必須從第一個安裝目錄複製wp-config.php並貼到第二個安裝的根目錄中。要小心更改$ table_prefix值:

$table_prefix = 'second_';

define('WP_DEBUG', true);
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
@ini_set( 'display_errors', 0 );

// custom users and usermeta tables
define( 'CUSTOM_USER_TABLE', 'first_users' );
define( 'CUSTOM_USER_META_TABLE', 'first_usermeta' );

CUSTOM_USER_TABLE和CUSTOM_USER_META_TABLE設置為第一個安裝的值:first_users和first_usermeta。這就是第一次安裝。

共享登錄
WordPress已有先前用戶,我們應該為admin用戶設置不存在的電子郵件地址

當運行第二次安裝時,我們應該為管理員用戶設置一個不存在的電子郵件地址,因為WordPress從first_users表中找到一些現有的用戶。

WordPress為第二次安裝創建一個管理員用戶名
WordPress為第二次安裝創建一個管理員用戶名

以管理員身份登錄第二個安裝管理面板並列出WordPress用戶。您將在第一個網站找到新的管理員用戶和所有用戶(這允許他們共享登錄)。此時,一個站點的用戶將無法登錄到其他網站。

第二個網站的用戶將不會從第一個網站繼承他們的角色
第二個網站的用戶將不會從第一個網站繼承他們的角色

為了在兩個網站上授予用戶相同的功能,我們必須更新{$pref}usermeta表。

角色和能力

如果您正在運行新的WordPress安裝,則不需要關心{$pref}options表。你只需要更新{$pref}usermeta表。

在我們的例子中,當第一個網站創建一個新用戶,WordPress的增加first_capabilities而first_user_level行的first_usermeta table。要訪問第二個網站,這些行應該重複,如下圖所示:

second_usermeta_fields

當第二個網站創建一個新用戶,second_capabilities和second_user_level行會被添加到first_usermeta表中。
為了給同樣的角色(roles)和帽子(caps)給用戶跨網站,first_capabilities並first_user_level行應該被複製second_capabilities和second_user_level。使用同一first_usermeta表中的這兩對行,用戶將能夠訪問具有相同特權的兩個網站。

要更新所有現有的usermeta行,您可以運行SQL查詢或從phpMyAdmin更新表。但是,從現在開始就會訂閱我們的網站的用戶呢?根據WordPress Codex,我們將使用插件或構建自定義函數。
我們去做做看吧!

自動複製具有功能的Caps和Levels

set_user_role是一個動作鉤子(action hook),可以在任何時間觸發新用戶創建或現有用戶的角色被編輯。感謝這個動作(action),我們可以自動化usermeta表更新。
所以,在插件的主文件中添加以下功能:

function ksu_save_role( $user_id, $role ) {

// Site 1
// Change value if needed
$prefix_1 = 'first_';

// Site 2 prefix
// Change value if needed
$prefix_2 = 'second_';

$caps = get_user_meta( $user_id, $prefix_1 . 'capabilities', true );
$level = get_user_meta( $user_id, $prefix_1 . 'user_level', true );

if ( $caps ){
update_user_meta( $user_id, $prefix_2 . 'capabilities', $caps );
}

if ( $level ){
update_user_meta( $user_id, $prefix_2 . 'user_level', $level );
}
}

add_action( 'set_user_role', 'ksu_save_role', 10, 2 );

回調函數(callback function)保留三個參數,其中兩個是必需的:$user_id和$role。
這個功能是不言自明的。get_user_meta返回指定的用戶元字段值。我們已經調用這個函數來檢索first_capabilities和first_user_level字段。然後我們使用這些值添加second_capabilities和second_user_level字段到first_usermeta表。

將此插件上傳到第一個網站。

為了使安裝對稱,我們只需要在任何一個安裝中上傳和啟動插件,但要設定正確的前綴。例如,如果我們在第二個網站激活這個功能,我們只需要聲明變數如下:

$prefix_1 = 'second_';
$prefix_2 = 'first_';

所以,編輯和安裝插件到第二個網站,並創建一個新的用戶或更改現有的用戶角色。然後檢查第一個網站。用戶角色將與第二個網站完全相同。

結論

在這篇文章中,我已經解釋瞭如何在獨立的WordPress安裝中向用戶授予相同的權限。用戶一旦註冊網站,用戶將能夠訪問共享相同用戶和usermeta表的所有網站。
我應該使用新的安裝。如果你在現有的網站上工作,你應該考慮一些插件可以更新usermeta表,甚至創建存儲用戶相關數據的新表。在這種情況下,對數據庫的更準確的分析將是適當的。

如果您對如何在WordPress中共享登錄有任何疑問,或者您想與我們分享您的經驗,請隨時加入發表評論的對話。

我們的插件的完整代碼在這個公開的Gist中可找到

spot_img

More like this

如何為您的 Word...

讀者經常問我們的問題之一是:如何讓其他連結出現在我網站的 Google 搜尋結果下? 有時,當您在 Google 中搜尋公司名稱時,您可能會注意到搜尋清單比其他清單大,因為它包含指向該網站其他重要頁面的附加連結。 Google 中的這些附加連結可協助您的品牌脫穎而出並獲得更多曝光。在本文...

Elementor ...

想要用 Elemetor 製作固定在上方的Header,同時又能在滑鼠向下滾動時縮小, 另外在縮放不同的瀏覽器螢幕大小時,也要能維持上述功能。 我們可以先參考 Elementor官方的來進行Elementor編輯器中的設定 https://elementor.com/blog/s...

使用WordPres...

Rank Math讓您比以往更輕鬆地為您的博客文章、頁面和其他自定義文章類型編寫完美的元標題和描述。但正如您可能已經註意到的那樣,& 正變得越來越普遍,Google(以及其他搜索引擎)通常選擇不簡單地使用您設置的元描述。 在本文中,我們將介紹為什麼會...