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]); } }