已建立論壇回覆
-
作者帖子
-
回覆至: 站點地圖無法顯示多語言 #45028
如果是網站被黑後導致的,需要先做木馬清理,清理完畢後再進行問題處理,如果一直存在相同的問題那麼可能是你沒清理乾淨。先把所有的程式和外掛主題升級到最新再說吧。
回覆至: 多站群系統圖片靜態分離問題 #45016看上面描述總感覺是路子走岔了,為什麼不直接用 WordPress 站群的內建資料夾目錄結構呢?
如果是要定製化 WordPress 檔案結構目錄這個問題我在 15 年開發站群系統的時候也有想過,特別是做動靜態分離的時候,所以當時想的方案就是單純改變 WordPress 自帶的上傳目錄資料夾,在本機地址裡新建一個目錄來儲存,這樣如果是要上傳 oss 也可以保持對應的結構。
後來其實也發現當時為了要 URL 簡短一些做了個小錯誤,就是在新目錄裡面沒有保持站點資料夾的結構,導致現在要搬家和提取站點也會遇到一大堆的檔案需要重新匯出的問題。
以我們站結構為例
現在是
/www/網站目錄/img.feibisi.com/[ 年份結構]/*
你們如果是可以改成 /www/網站目錄/加速域名/site/[site-id]/* 這樣就可以了。
也就不存在你上面說的這些問題。找個 OSS 外掛就能實現全部檔案內容自動上傳和整理資料夾,也利於維護。
回覆至: 站點地圖無法顯示多語言 #45013首先要你用的外掛支援多語言,其次後臺要開啟功能,然後還需要相容 yoast 或者外掛可以自動生成自己的多語言 sitemap
提問不講清楚產品和原因, AI 都給不了你有價值的參考回覆。
嘗試把下面的程式碼加入到你的 mu-plugins 目錄裡,可以儲存為一個 php 檔案,就可以實現跨站登入。
我們目前是實現了子站互通,之前的站群內建外掛已經太老舊了,新版本在開發,下面程式碼可以參考
<?php if ( ! is_multisite() ) { return; } function is_sso_site() { return is_main_site(); } function get_sso_login_url( $query_args = [] ) { $query_args = wp_parse_args( $query_args, [ 'multisite_sso_blog_id' => get_current_blog_id(), ] ); return add_query_arg( $query_args, network_site_url( 'wp-login.php', 'login' ) ); } function get_sso_callback_url( $blog_id, $query_args = [] ) { return add_query_arg( $query_args, get_site_url( $blog_id, 'wp-login.php', 'login' ) ); } add_filter( 'login_message', function ( $messages ) { if ( is_user_logged_in() || is_sso_site() ) { return; } $sso_args = []; $redirect_to = filter_input( INPUT_GET, 'redirect_to', FILTER_SANITIZE_URL ); if ( $redirect_to ) { $sso_args['redirect_to'] = rawurlencode( $redirect_to ); } $messages .= '<style type="text/css"> .login .wp-multisite-sso-login--cta a { font-size:inherit; float:none; display:inline-block; width:100%; clear:both; text-align:center; } </style>'; $messages .= sprintf( '<div class="message wp-multisite-sso-login--cta"> <p><a href="%s" class="button button-primary button-large">%s</a></p> </div>', esc_url( get_sso_login_url( $sso_args ) ), esc_html__( 'Login with Multisite SSO' ), ); return $messages; }, 200 ); add_action( 'login_init', function () { if ( ! is_sso_site() || is_user_logged_in() ) { return; } $blog_id = isset( $_REQUEST['multisite_sso_blog_id'] ) ? absint( $_REQUEST['multisite_sso_blog_id'] ) : null; if ( empty( $blog_id ) ) { return; } $blog = get_blog_details( $blog_id ); if ( ! $blog ) { return; } add_action( 'login_form', function () use ( $blog_id ) { ?> <input type="hidden" name="multisite_sso_blog_id" value="<?php echo esc_attr( $blog_id ); ?>"> <?php } ); add_filter( 'wp_login_errors', function ( $errors ) use ( $blog ) { $message = sprintf( esc_html__( 'You are logging into %s' ), sprintf( '<a href="%s" target="_blank">%s</a>', esc_url( $blog->home ), esc_html( $blog->blogname ) ) ); $errors->add( 'multisite_sso_notice', $message, 'message' ); return $errors; } ); } ); add_filter( 'login_redirect', function ( $redirect_to, $requested_redirect_to, $user ) { if ( ! is_sso_site() ) { return $redirect_to; } $blog_id = isset( $_REQUEST['multisite_sso_blog_id'] ) ? absint( $_REQUEST['multisite_sso_blog_id'] ) : null; if ( ! empty( $blog_id ) && $user instanceof WP_User ) { // Add the destination blog hostname to the allowed safe-redirect list. add_filter( 'allowed_redirect_hosts', function ( $hosts ) use ( $blog_id ) { $hosts[] = wp_parse_url( get_site_url( $blog_id ), PHP_URL_HOST ); $hosts[] = wp_parse_url( get_home_url( $blog_id ), PHP_URL_HOST ); return $hosts; } ); $session_token = wp_generate_password( 42, false, false ); // Relay the private session token through a back-channel. update_user_meta( $user->ID, 'multisite_sso_token', $session_token ); $args = [ 'multisite_sso_user_id' => $user->ID, 'multisite_sso_token' => wp_hash( $session_token ), // Transfer hashed for one-time verification. ]; if ( ! empty( $requested_redirect_to ) && $redirect_to !== $requested_redirect_to ) { $args['redirect_to'] = urlencode( $requested_redirect_to ); } return get_sso_callback_url( $blog_id, $args ); } return $redirect_to; }, 100, 3 ); add_action( 'login_init', function () { if ( is_sso_site() || is_user_logged_in() ) { return; } $login_user_id = isset( $_GET['multisite_sso_user_id'] ) ? absint( $_GET['multisite_sso_user_id'] ) : null; $login_token_hash = isset( $_GET['multisite_sso_token'] ) ? sanitize_text_field( $_GET['multisite_sso_token'] ) : null; if ( ! $login_user_id || ! $login_token_hash ) { return; } // Get the session token from the SSO source and delete it to ensure it is used only once. $token_source = get_user_meta( $login_user_id, 'multisite_sso_token', true ); delete_user_meta( $login_user_id, 'multisite_sso_token' ); if ( $token_source && hash_equals( wp_hash( $token_source ), $login_token_hash ) ) { wp_clear_auth_cookie(); wp_set_auth_cookie( $login_user_id ); wp_set_current_user( $login_user_id ); $redirect_to = filter_input( INPUT_GET, 'redirect_to', FILTER_SANITIZE_URL ); if ( ! $redirect_to ) { $redirect_to = get_dashboard_url( $login_user_id ); } wp_redirect( $redirect_to ); exit; } } );
我們近期在做明年的開發功能規劃,目前需要做的事情是先解決掉 WordPress 系統本身欠缺和不足,站群相關的功能是重點專案,而且相對文派葉子外掛的目標使用者群體實際上是不同的,上面的建議需要先研究一下,我個人而言是傾向於為站群開發一個單獨的功能來搭配文派葉子實現。
也就是需要才安裝,這樣利於維護和後續的延伸開發。
回覆至: 請教一個簡單的會員功能如何實現? #44988這樣的話我理解了,你可以嘗試透過限制使用者許可權來進行內容限制
這個外掛應該可以滿足要求。
回覆至: 請教一個簡單的會員功能如何實現? #44982如果是要賣產品的話就需要考慮到支付流程,或者你有其他方式解決這個許可權獲取的流程也可以。
確定用 EDD 或者 WOO 都能實現,這類似賣電子書了和會員了,可以看看自己的目的是什麼,這些不同型別的業務架構我們在做流程圖繪製工作,過段時間可以參考參考。
換到預設主題,或者重新用 WordPress 原版程式覆蓋一次試試,一般這種情況都是許可權問題。
你需要完全實現自定義文章型別查詢在後續的 WordPress 版本中這種方式容易導致網站負載增大,我上面給的方式可以測試下,完全從資料庫裡面直接讀取,不分編輯器版本不容易出錯,也沒那麼多額外查詢
-
作者帖子