诗语

诗语

Forum Replies Created

Viewing 10 posts - 1 through 10 (of 5,144 total)
  • Author
    Posts
  • 诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    看上面描述总感觉是路子走岔了,为什么不直接用 WordPress 站群的内置文件夹目录结构呢?

    20241111-110341

    如果是要定制化 WordPress 文件结构目录这个问题我在 15 年开发站群系统的时候也有想过,特别是做动静态分离的时候,所以当时想的方案就是单纯改变 WordPress 自带的上传目录文件夹,在本机地址里新建一个目录来存储,这样如果是要上传 oss 也可以保持对应的结构。

    后来其实也发现当时为了要 URL 简短一些做了个小错误,就是在新目录里面没有保持站点文件夹的结构,导致现在要搬家和提取站点也会遇到一大堆的文件需要重新导出的问题。

    以我们站结构为例

    现在是

    /www/网站目录/img.feibisi.com/[ 年份结构]/*

    你们如果是可以改成 /www/网站目录/加速域名/site/[site-id]/*    这样就可以了。

    也就不存在你上面说的这些问题。找个 OSS 插件就能实现全部文件内容自动上传和整理文件夹,也利于维护。

     

    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    首先要你用的插件支持多语言,其次后台要开启功能,然后还需要兼容 yoast 或者插件可以自动生成自己的多语言 sitemap

    提问不讲清楚产品和原因, AI 都给不了你有价值的参考回复。

    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    尝试把下面的代码加入到你的 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;
    		}
    	}
    );
    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    我们近期在做明年的开发功能规划,目前需要做的事情是先解决掉 WordPress 系统本身欠缺和不足,站群相关的功能是重点项目,而且相对文派叶子插件的目标用户群体实际上是不同的,上面的建议需要先研究一下,我个人而言是倾向于为站群开发一个单独的功能来搭配文派叶子实现。

    也就是需要才安装,这样利于维护和后续的延伸开发。

    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    这样的话我理解了,你可以尝试通过限制用户权限来进行内容限制

    Content Control – The Ultimate Content Restriction Plugin! Restrict Content, Create Conditional Blocks & More

    这个插件应该可以满足要求。

    QQ20241031-150037

    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    如果是要卖产品的话就需要考虑到支付流程,或者你有其他方式解决这个权限获取的流程也可以。

    确定用 EDD 或者 WOO 都能实现,这类似卖电子书了和会员了,可以看看自己的目的是什么,这些不同类型的业务架构我们在做流程图绘制工作,过段时间可以参考参考。

    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    这里下载免费主题 https://wenpai.org/themes/

    这是最直接的方式。

    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    换到默认主题,或者重新用 WordPress 原版程序覆盖一次试试,一般这种情况都是权限问题。

    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    你需要完全实现自定义文章类型查询在后续的 WordPress 版本中这种方式容易导致网站负载增大,我上面给的方式可以测试下,完全从数据库里面直接读取,不分编辑器版本不容易出错,也没那么多额外查询

    诗语
    Keymaster
    • 文章数量: 5,905
    @feibisi
    楼主

    文章模块你不能直接编辑,需要在 elementor 模块里面预览,然后调整布局。

    这个是固定的内容。

Viewing 10 posts - 1 through 10 (of 5,144 total)