Files
wordpress-theme-aksrt/src/Credits/Earn.php
T
kate522 8c5b1555c9 refactor: flatten src/AKSRT → src (drop theme-identifier dir)
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).
2026-08-02 22:06:06 +08:00

195 lines
6.2 KiB
PHP

<?php
/**
* @package AKSRT
*/
namespace AKSRT\Credits;
defined('ABSPATH') || exit;
class Earn {
private static $instance = null;
private function __construct() {}
public static function get_instance(): self {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
public function init(): void {
add_action('user_register', [$this, 'on_user_register'], 10, 1);
add_action('wp_login', [$this, 'on_wp_login'], 20, 2);
add_action('wp_insert_comment', [$this, 'on_comment_inserted'], 10, 2);
add_action('transition_comment_status', [$this, 'on_comment_transition'], 10, 3);
add_action('transition_post_status', [$this, 'on_post_status'], 10, 3);
add_action('aksrt_post_liked', [$this, 'on_post_liked'], 10, 3);
add_action('aksrt_post_favorited', [$this, 'on_post_favorited'], 10, 3);
add_action('aksrt_comment_liked', [$this, 'on_comment_liked'], 10, 3);
add_action('aksrt_user_followed', [$this, 'on_user_followed'], 10, 2);
}
public function on_user_register(int $user_id): void {
if (!class_exists('AKSRT\\Credits\\PointsFree')) {
return;
}
PointsFree::grant($user_id, 'sign_up', 0, ['type' => 'user', 'id' => $user_id]);
}
/**
* Daily first login free points.
*
* @param string $user_login
* @param \WP_User $user
*/
public function on_wp_login($user_login, $user = null): void {
unset($user_login);
$user_id = $user instanceof \WP_User ? (int) $user->ID : 0;
if ($user_id <= 0 || !class_exists('AKSRT\\Credits\\PointsFree')) {
return;
}
$today = (new \DateTimeImmutable('today', wp_timezone()))->format('Y-m-d');
$last = (string) get_user_meta($user_id, PointsFree::META_LOGIN, true);
if ($last === $today) {
return;
}
$granted = PointsFree::grant($user_id, 'login', 0, ['type' => 'user', 'id' => $user_id]);
if (!is_wp_error($granted) && $granted >= 0) {
update_user_meta($user_id, PointsFree::META_LOGIN, $today);
}
}
/**
* @param string $new_status
* @param string $old_status
* @param \WP_Post $post
*/
public function on_post_status($new_status, $old_status, $post): void {
if (!($post instanceof \WP_Post) || $post->post_type !== 'post') {
return;
}
if ($new_status !== 'publish' || $old_status === 'publish') {
return;
}
$user_id = (int) $post->post_author;
if ($user_id <= 0 || !class_exists('AKSRT\\Credits\\PointsFree')) {
return;
}
if (get_post_meta($post->ID, 'aksrt_credit_post_rewarded', true)) {
return;
}
$granted = PointsFree::grant($user_id, 'post_new', 0, ['type' => 'post', 'id' => (int) $post->ID]);
if (!is_wp_error($granted) && $granted > 0) {
update_post_meta($post->ID, 'aksrt_credit_post_rewarded', 1);
}
}
public function on_comment_inserted(int $comment_id, $comment): void {
$cfg = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_credit_settings() : [];
$reward = is_array($cfg['comment_reward'] ?? null) ? $cfg['comment_reward'] : [];
// Legacy on_approved=true → wait for transition; default true.
$on_approved = !isset($reward['on_approved']) || !empty($reward['on_approved']);
if ($on_approved) {
return;
}
$comment = $comment instanceof \WP_Comment ? $comment : get_comment($comment_id);
if (!($comment instanceof \WP_Comment) || (int) $comment->comment_approved !== 1) {
return;
}
$this->reward_comment($comment);
}
public function on_comment_transition($new_status, $old_status, $comment): void {
unset($old_status);
if ($new_status !== 'approved' || !($comment instanceof \WP_Comment)) {
return;
}
$this->reward_comment($comment);
}
private function reward_comment(\WP_Comment $comment): void {
$user_id = (int) $comment->user_id;
if ($user_id <= 0 || !class_exists('AKSRT\\Credits\\PointsFree')) {
return;
}
if (get_comment_meta($comment->comment_ID, 'aksrt_credit_rewarded', true)) {
return;
}
$cfg = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_credit_settings() : [];
$reward = is_array($cfg['comment_reward'] ?? null) ? $cfg['comment_reward'] : [];
$min_length = (int) ($reward['min_length'] ?? 0);
if ($min_length > 0 && mb_strlen(wp_strip_all_tags((string) $comment->comment_content)) < $min_length) {
return;
}
$granted = PointsFree::grant($user_id, 'comment_new', 0, [
'type' => 'comment',
'id' => (int) $comment->comment_ID,
]);
if (!is_wp_error($granted)) {
update_comment_meta($comment->comment_ID, 'aksrt_credit_rewarded', $granted > 0 ? 1 : 'capped');
}
}
/**
* @param int $post_id
* @param int $actor_id liker
* @param bool $active
*/
public function on_post_liked(int $post_id, int $actor_id, bool $active): void {
if (!$active || $post_id <= 0 || !class_exists('AKSRT\\Credits\\PointsFree')) {
return;
}
$post = get_post($post_id);
if (!$post || $post->post_type !== 'post') {
return;
}
$author = (int) $post->post_author;
if ($author <= 0 || $author === $actor_id) {
return;
}
PointsFree::grant($author, 'post_like', 0, ['type' => 'post', 'id' => $post_id]);
}
public function on_post_favorited(int $post_id, int $actor_id, bool $active): void {
if (!$active || $post_id <= 0 || !class_exists('AKSRT\\Credits\\PointsFree')) {
return;
}
$post = get_post($post_id);
if (!$post || $post->post_type !== 'post') {
return;
}
$author = (int) $post->post_author;
if ($author <= 0 || $author === $actor_id) {
return;
}
PointsFree::grant($author, 'post_favorite', 0, ['type' => 'post', 'id' => $post_id]);
}
public function on_comment_liked(int $comment_id, int $actor_id, bool $active): void {
if (!$active || $comment_id <= 0 || !class_exists('AKSRT\\Credits\\PointsFree')) {
return;
}
$comment = get_comment($comment_id);
if (!$comment) {
return;
}
$author = (int) $comment->user_id;
if ($author <= 0 || $author === $actor_id) {
return;
}
PointsFree::grant($author, 'comment_like', 0, ['type' => 'comment', 'id' => $comment_id]);
}
public function on_user_followed(int $follower_id, int $following_id): void {
if ($following_id <= 0 || $follower_id === $following_id || !class_exists('AKSRT\\Credits\\PointsFree')) {
return;
}
PointsFree::grant($following_id, 'followed', 0, ['type' => 'user', 'id' => $follower_id]);
}
}