245 lines
7.6 KiB
PHP
245 lines
7.6 KiB
PHP
<?php
|
||
/**
|
||
* User public URL/page API
|
||
*
|
||
* @package AKSRT
|
||
*/
|
||
|
||
defined('ABSPATH') || exit;
|
||
|
||
// ============================================================
|
||
// 五、公开 API 函数(兼容旧代码调用)
|
||
// ============================================================
|
||
|
||
if (!function_exists('aksrt_get_user_center_url')) :
|
||
/**
|
||
* 获取本人中心 URL(私有空间入口)
|
||
*
|
||
* @param string $tab 可选 tab 参数
|
||
* @return string
|
||
*/
|
||
function aksrt_get_user_center_url(string $tab = ''): string {
|
||
$tab = sanitize_key($tab ?: 'vip');
|
||
$aliases = ['assets' => 'credits', 'signin' => 'credits', 'revenue' => 'revenue'];
|
||
$tab = $aliases[$tab] ?? $tab;
|
||
$path_tab = $tab === 'credits' ? 'balance' : $tab;
|
||
return get_option('permalink_structure')
|
||
? home_url('/user/' . trailingslashit($path_tab))
|
||
: add_query_arg(['aksrt_user_center' => '1', 'aksrt_user_center_tab' => $tab], home_url('/'));
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_new_post_url')) :
|
||
/**
|
||
* 前台写文章/投稿页 URL(模板 templates/pages/page-submit.php)。
|
||
*
|
||
* @param int $edit_id 编辑中的文章 ID;0 表示新建。
|
||
* @return string 未指派页面时返回空串。
|
||
*/
|
||
function aksrt_get_new_post_url(int $edit_id = 0): string {
|
||
if (class_exists('\AKSRT\Settings\Settings')) {
|
||
$submit = \AKSRT\Settings\Settings::get_submit_settings();
|
||
if (isset($submit['enabled']) && empty($submit['enabled'])) {
|
||
return '';
|
||
}
|
||
}
|
||
|
||
$url = function_exists('aksrt_get_template_url')
|
||
? aksrt_get_template_url('submit')
|
||
: home_url('/submit/');
|
||
if ($edit_id > 0) {
|
||
$url = add_query_arg('edit', $edit_id, $url);
|
||
}
|
||
return $url;
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_messages_rewrite_slug')) :
|
||
/** 获取消息中心当前唯一的重写别名。 */
|
||
function aksrt_get_messages_rewrite_slug(): string {
|
||
$settings = class_exists('\AKSRT\Settings\Settings')
|
||
? \AKSRT\Settings\Settings::notification_settings()
|
||
: [];
|
||
$slug = sanitize_key((string) ($settings['slug'] ?? 'message'));
|
||
return $slug !== '' ? $slug : 'message';
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_messages_page_url')) :
|
||
/** 消息中心 URL。 */
|
||
function aksrt_get_messages_page_url(string $view = 'unread'): string {
|
||
if (class_exists('\AKSRT\Settings\Settings') && !\AKSRT\Settings\Settings::message_enabled()) {
|
||
return '';
|
||
}
|
||
$suffixes = [
|
||
'unread' => '',
|
||
'posts' => 'posts',
|
||
'like' => 'like',
|
||
'system' => 'system',
|
||
];
|
||
$view = sanitize_key($view);
|
||
$suffix = $suffixes[$view] ?? $suffixes['unread'];
|
||
$path = '/' . aksrt_get_messages_rewrite_slug() . ($suffix !== '' ? '/' . $suffix : '') . '/';
|
||
return home_url($path);
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_user_home_url')) :
|
||
/**
|
||
* 获取公开用户主页 URL(/user/{nicename}/)
|
||
*
|
||
* @param WP_User|int|string|null $user 用户对象、ID、nicename 或 null(当前用户)
|
||
* @return string
|
||
*/
|
||
function aksrt_get_user_home_url($user = null): string {
|
||
$target = null;
|
||
$mode = class_exists('\\AKSRT\\Settings\\Settings') ? (string) (\AKSRT\Settings\Settings::get_user_home_settings()['route_identifier'] ?? 'nicename') : 'nicename';
|
||
if ($user instanceof WP_User) {
|
||
$target = $user;
|
||
} elseif (is_int($user) && $user > 0) {
|
||
$target = get_userdata($user);
|
||
} elseif (is_numeric($user) && (int) $user > 0) {
|
||
$target = get_userdata((int) $user);
|
||
} elseif (is_string($user) && $user) {
|
||
$target = get_user_by('slug', $user);
|
||
} else {
|
||
$target = wp_get_current_user();
|
||
}
|
||
if (!$target instanceof WP_User || !$target->ID) {
|
||
return home_url('/');
|
||
}
|
||
$identifier = $mode === 'uid' ? (string) $target->ID : $target->user_nicename;
|
||
if (!get_option('permalink_structure')) {
|
||
return add_query_arg('aksrt_author', rawurlencode($identifier), home_url('/'));
|
||
}
|
||
return home_url('/author/' . trailingslashit($identifier));
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_resolve_public_user')) :
|
||
function aksrt_resolve_public_user(string $identifier): ?WP_User {
|
||
$mode = class_exists('\\AKSRT\\Settings\\Settings') ? (string) (\AKSRT\Settings\Settings::get_user_home_settings()['route_identifier'] ?? 'nicename') : 'nicename';
|
||
if ($mode === 'uid') {
|
||
return ctype_digit($identifier) && (int) $identifier > 0 ? get_userdata((int) $identifier) ?: null : null;
|
||
}
|
||
return get_user_by('slug', sanitize_title($identifier)) ?: null;
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_is_user_center_page')) :
|
||
/**
|
||
* 判断当前是否为本人中心页面
|
||
*/
|
||
function aksrt_is_user_center_page(): bool {
|
||
return (bool) get_query_var('aksrt_user_center')
|
||
|| (is_page_template('templates/pages/page-profile.php') && !(bool) get_query_var('aksrt_author_identifier'));
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_is_user_home_page')) :
|
||
/**
|
||
* 判断当前是否为公开用户主页
|
||
*/
|
||
function aksrt_is_user_home_page(): bool {
|
||
return (bool) get_query_var('aksrt_author_identifier')
|
||
|| is_page_template('templates/pages/page-user-home.php');
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_profile_url')) :
|
||
/**
|
||
* 兼容层:获取用户主页 URL
|
||
*
|
||
* @deprecated 使用 aksrt_get_user_center_url() 或 aksrt_get_user_home_url() 替代
|
||
* @param WP_User|int|string|null $user
|
||
* @return string
|
||
*/
|
||
function aksrt_get_profile_url($user = null): string {
|
||
// 无参调用 → 当前用户主页(公开页)
|
||
if ($user === null) {
|
||
return aksrt_get_user_home_url();
|
||
}
|
||
return aksrt_get_user_home_url($user);
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_sign_page_url')) :
|
||
/**
|
||
* Get the only public authentication page URL.
|
||
*
|
||
* @param string $tab
|
||
* @param array<string, scalar> $args
|
||
*/
|
||
function aksrt_get_sign_page_url(string $tab = 'signin', array $args = []): string {
|
||
$tab = aksrt_normalize_auth_tab($tab);
|
||
return add_query_arg(['tab' => $tab] + $args, home_url('/sign/'));
|
||
}
|
||
|
||
|
||
/**
|
||
* Determine whether the current request is served by the unified auth experience.
|
||
*/
|
||
function aksrt_is_auth_page_request(): bool {
|
||
return (bool) get_query_var('aksrt_sign')
|
||
|| is_page_template('templates/pages/page-sign.php');
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_login_url')) :
|
||
/** 获取登录页 URL */
|
||
function aksrt_get_login_url($redirect = '') {
|
||
$url = aksrt_get_sign_page_url('signin');
|
||
if ($redirect) {
|
||
$url = add_query_arg('redirect_to', urlencode($redirect), $url);
|
||
}
|
||
return $url;
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_register_url')) :
|
||
/** 获取注册页 URL */
|
||
function aksrt_get_register_url() {
|
||
return aksrt_get_sign_page_url('signup');
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_bind_url')) :
|
||
/** 获取绑定账号页面 URL */
|
||
function aksrt_get_bind_url($transient_key = '') {
|
||
$url = aksrt_get_sign_page_url('bind');
|
||
if ($transient_key) {
|
||
$url = add_query_arg('obk', $transient_key, $url);
|
||
}
|
||
return $url;
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_logout_url')) :
|
||
/** 获取唯一退出登录 URL。 */
|
||
function aksrt_get_logout_url($redirect = '') {
|
||
$target = is_string($redirect) && $redirect !== '' ? $redirect : home_url('/');
|
||
$url = add_query_arg(
|
||
['redirect_to' => $target],
|
||
home_url('/logout/')
|
||
);
|
||
return wp_nonce_url($url, 'aksrt-logout');
|
||
}
|
||
endif;
|
||
|
||
if (!function_exists('aksrt_get_reset_password_url')) :
|
||
/**
|
||
* 获取重置密码页面 URL
|
||
*
|
||
* @return string
|
||
*/
|
||
function aksrt_get_reset_password_url(): string {
|
||
return aksrt_get_sign_page_url('resetpassword');
|
||
}
|
||
endif;
|
||
|
||
// Notifications live in the same user/ domain; bootstrap also loads it.
|
||
if (!class_exists('AKSRT_User_Notifications', false) /* procedural module */ && file_exists(dirname(__DIR__) . '/user-notifications.php')) {
|
||
require_once dirname(__DIR__) . '/user-notifications.php';
|
||
}
|
||
|