Move all domain folders from src/AKSRT/{Domain} to src/{Domain}; remap
Composer PSR-4 "AKSRT\\": "src/"; update audit script + README + ADR
paths; remove dead tools/build-psr4-map.php (scanned deleted inc/classes).
124 lines
4.1 KiB
PHP
124 lines
4.1 KiB
PHP
<?php
|
|
/**
|
|
* Frontend links (bookmarks) submit — zibll frontend_links_submit parity.
|
|
*
|
|
* @package AKSRT
|
|
*/
|
|
|
|
namespace AKSRT\Core;
|
|
|
|
defined('ABSPATH') || exit;
|
|
|
|
class LinksSubmit {
|
|
|
|
private static $instance = null;
|
|
|
|
public static function get_instance(): self {
|
|
if (null === self::$instance) {
|
|
self::$instance = new self();
|
|
}
|
|
return self::$instance;
|
|
}
|
|
|
|
public function init(): void {
|
|
add_action('wp_ajax_aksrt_frontend_links_submit', [$this, 'ajax_submit']);
|
|
add_action('wp_ajax_nopriv_aksrt_frontend_links_submit', [$this, 'ajax_submit']);
|
|
}
|
|
|
|
/**
|
|
* AJAX: create a pending WordPress bookmark (link).
|
|
*/
|
|
public function ajax_submit(): void {
|
|
if (!check_ajax_referer('aksrt_frontend_links_submit', '_wpnonce', false)) {
|
|
wp_send_json(['error' => 1, 'ys' => 'danger', 'msg' => __('安全校验失败,请刷新后重试', 'aksrt')]);
|
|
}
|
|
|
|
if (isset($_COOKIE['aksrt_links_submit_time'])) {
|
|
wp_send_json(['error' => 1, 'ys' => 'danger', 'msg' => __('操作过于频繁,请稍候再试', 'aksrt')]);
|
|
}
|
|
|
|
$link_name = isset($_POST['link_name']) ? sanitize_text_field(wp_unslash((string) $_POST['link_name'])) : '';
|
|
$link_url = isset($_POST['link_url']) ? esc_url_raw(wp_unslash((string) $_POST['link_url'])) : '';
|
|
$link_desc = isset($_POST['link_description']) ? sanitize_text_field(wp_unslash((string) $_POST['link_description'])) : '';
|
|
$cat_raw = isset($_POST['link_category']) ? wp_unslash($_POST['link_category']) : [];
|
|
|
|
if ($link_name === '') {
|
|
wp_send_json(['error' => 1, 'ys' => 'danger', 'msg' => __('请填写网站名称', 'aksrt')]);
|
|
}
|
|
if ($link_url === '' || !wp_http_validate_url($link_url)) {
|
|
wp_send_json(['error' => 1, 'ys' => 'danger', 'msg' => __('网站地址格式错误', 'aksrt')]);
|
|
}
|
|
|
|
// Optional logo upload.
|
|
$logo_url = '';
|
|
if (!empty($_FILES['image']['name'])) {
|
|
require_once ABSPATH . 'wp-admin/includes/file.php';
|
|
require_once ABSPATH . 'wp-admin/includes/media.php';
|
|
require_once ABSPATH . 'wp-admin/includes/image.php';
|
|
$attachment_id = media_handle_upload('image', 0);
|
|
if (is_wp_error($attachment_id)) {
|
|
wp_send_json(['error' => 1, 'ys' => 'danger', 'msg' => $attachment_id->get_error_message()]);
|
|
}
|
|
$src = wp_get_attachment_image_src((int) $attachment_id, 'medium');
|
|
$logo_url = !empty($src[0]) ? (string) $src[0] : (string) wp_get_attachment_url((int) $attachment_id);
|
|
}
|
|
|
|
$categories = [];
|
|
if (is_array($cat_raw)) {
|
|
$categories = array_values(array_filter(array_map('intval', $cat_raw)));
|
|
} elseif ($cat_raw !== '' && $cat_raw !== null) {
|
|
$categories = [absint($cat_raw)];
|
|
}
|
|
|
|
// Duplicate URL guard.
|
|
global $wpdb;
|
|
$exists = (int) $wpdb->get_var(
|
|
$wpdb->prepare(
|
|
"SELECT COUNT(1) FROM {$wpdb->links} WHERE link_url = %s",
|
|
$link_url
|
|
)
|
|
);
|
|
if ($exists > 0) {
|
|
wp_send_json(['error' => 1, 'ys' => 'danger', 'msg' => __('您的链接已提交,请勿重复提交', 'aksrt')]);
|
|
}
|
|
|
|
if (!function_exists('wp_insert_link')) {
|
|
require_once ABSPATH . 'wp-admin/includes/bookmark.php';
|
|
}
|
|
|
|
$linkdata = [
|
|
'link_name' => $link_name,
|
|
'link_url' => $link_url,
|
|
'link_description' => $link_desc,
|
|
'link_image' => $logo_url,
|
|
// Non-admins create invisible links pending review (zibll parity).
|
|
'link_visible' => current_user_can('manage_links') ? 'Y' : 'N',
|
|
'link_category' => $categories,
|
|
];
|
|
|
|
$links_id = wp_insert_link($linkdata, true);
|
|
if (is_wp_error($links_id)) {
|
|
wp_send_json(['error' => 1, 'ys' => 'danger', 'msg' => $links_id->get_error_message()]);
|
|
}
|
|
|
|
// 30s client throttle cookie.
|
|
if (!headers_sent()) {
|
|
setcookie('aksrt_links_submit_time', (string) time(), time() + 30, COOKIEPATH ?: '/', COOKIE_DOMAIN, is_ssl(), true);
|
|
}
|
|
|
|
$msg = $linkdata['link_visible'] === 'Y'
|
|
? __('提交成功', 'aksrt')
|
|
: __('提交成功,等待管理员处理', 'aksrt');
|
|
|
|
/**
|
|
* Fires after a frontend link submission is stored.
|
|
*
|
|
* @param array $linkdata Sanitized bookmark data.
|
|
* @param int $links_id New link ID.
|
|
*/
|
|
do_action('aksrt_frontend_links_submit_success', $linkdata, (int) $links_id);
|
|
|
|
wp_send_json(['error' => 0, 'msg' => $msg, 'reload' => true]);
|
|
}
|
|
}
|