Skip to content

Commit 7c0b485

Browse files
authored
Merge pull request #605 from ProgressPlanner/convert-meta/prpl_points
Stop using post-meta to store a task's points
2 parents 2cd801a + dad0969 commit 7c0b485

8 files changed

Lines changed: 109 additions & 28 deletions

File tree

assets/js/suggested-task.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ prplSuggestedTask = {
267267
'trash' === newStatus ? 'complete' : 'pending'
268268
);
269269
const eventPoints = parseInt(
270-
postData?.meta?.prpl_points
270+
postData?.prpl_points
271271
);
272272

273273
// Task is trashed, check if we need to celebrate.

assets/js/widgets/todo.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const prplTodoWidget = {
5454
detail: {
5555
item,
5656
insertPosition:
57-
1 === item?.meta?.prpl_points
57+
1 === item?.prpl_points
5858
? 'afterbegin' // Add golden task to the start of the list.
5959
: 'beforeend',
6060
listId:
@@ -89,7 +89,7 @@ const prplTodoWidget = {
8989
detail: {
9090
item,
9191
insertPosition:
92-
1 === item?.meta?.prpl_points
92+
1 === item?.prpl_points
9393
? 'afterbegin' // Add golden task to the start of the list.
9494
: 'beforeend',
9595
listId:
@@ -137,13 +137,13 @@ const prplTodoWidget = {
137137
const newTask = {
138138
...response,
139139
meta: {
140-
prpl_points: 0,
141140
prpl_url: '',
142141
...( response.meta || {} ),
143142
},
144143
provider: 'user',
145144
category: 'user',
146145
order: prplTodoWidget.getHighestItemOrder() + 1,
146+
prpl_points: 0,
147147
};
148148

149149
// Inject the new task into the DOM.

classes/class-suggested-tasks-db.php

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -175,16 +175,10 @@ public function update_recommendation( $id, $data ) {
175175
}
176176

177177
$update_data = [ 'ID' => $id ];
178-
$update_meta = [];
179178
$update_terms = [];
180179
$update_results = [];
181180
foreach ( $data as $key => $value ) {
182181
switch ( $key ) {
183-
case 'points':
184-
case 'prpl_points':
185-
$update_meta[ 'prpl_' . \str_replace( 'prpl_', '', (string) $key ) ] = $value;
186-
break;
187-
188182
case 'category':
189183
case 'provider':
190184
$update_terms[ "prpl_recommendations_$key" ] = $value;
@@ -200,12 +194,6 @@ public function update_recommendation( $id, $data ) {
200194
$update_results[] = (bool) \wp_update_post( $update_data );
201195
}
202196

203-
if ( ! empty( $update_meta ) ) {
204-
foreach ( $update_meta as $key => $value ) {
205-
$update_results[] = (bool) \update_post_meta( $id, $key, $value );
206-
}
207-
}
208-
209197
if ( ! empty( $update_terms ) ) {
210198
foreach ( $update_terms as $taxonomy => $term ) {
211199
$update_results[] = (bool) \wp_set_object_terms( $id, $term->slug, $taxonomy ); // @phpstan-ignore-line property.nonObject

classes/class-suggested-tasks.php

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ public function register_post_type() {
281281
'show_in_admin_bar' => \apply_filters( 'progress_planner_tasks_show_ui', false ),
282282
'show_in_rest' => true,
283283
'rest_controller_class' => \Progress_Planner\Rest\Recommendations_Controller::class,
284-
'supports' => [ 'title', 'editor', 'author', 'custom-fields', 'page-attributes' ],
284+
'supports' => [ 'title', 'excerpt', 'editor', 'author', 'custom-fields', 'page-attributes' ],
285285
'rewrite' => false,
286286
'menu_icon' => 'dashicons-admin-tools',
287287
'menu_position' => 5,
@@ -291,11 +291,6 @@ public function register_post_type() {
291291
);
292292

293293
$rest_meta_fields = [
294-
'prpl_points' => [
295-
'type' => 'number',
296-
'single' => true,
297-
'show_in_rest' => true,
298-
],
299294
'prpl_task_id' => [
300295
'type' => 'string',
301296
'single' => true,
@@ -442,13 +437,14 @@ public function rest_prepare_recommendation( $response, $post ) {
442437

443438
// This has to be the last item to be added because actions use data from previous items.
444439
$response->data['prpl_task_actions'] = $provider->get_task_actions( $response->data );
440+
$response->data['prpl_points'] = $provider->get_points();
445441

446442
/*
447443
* Check if task was completed before - for example, comments were disabled and then re-enabled, and remove points if so.
448444
* Those are tasks which are completed by toggling an option, so non repetitive & not user tasks.
449445
*/
450446
if ( ! \has_term( 'user', 'prpl_recommendations_provider', $post->ID ) && ! $provider->is_repetitive() && $provider->task_has_activity( $response->data['meta']['prpl_task_id'] ) ) {
451-
$response->data['meta']['prpl_points'] = 0;
447+
$response->data['prpl_points'] = 0;
452448
}
453449
}
454450

@@ -513,7 +509,15 @@ public function get_tasks_in_rest_format( array $args = [] ) {
513509
}
514510
}
515511

516-
return $tasks;
512+
/**
513+
* Allow other classes to modify the tasks in REST format.
514+
*
515+
* @param array $tasks The tasks.
516+
* @param array $args The arguments.
517+
*
518+
* @return array
519+
*/
520+
return \apply_filters( 'progress_planner_suggested_tasks_in_rest_format', $tasks, $args );
517521
}
518522

519523
/**

classes/class-todo.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public function maybe_change_first_item_points_on_monday() {
5757
foreach ( $pending_items as $task ) {
5858
\progress_planner()->get_suggested_tasks_db()->update_recommendation(
5959
$task->ID,
60-
[ 'points' => $task->ID === $pending_items[0]->ID ? 1 : 0 ]
60+
[ 'post_excerpt' => $task->ID === $pending_items[0]->ID ? 'GOLDEN' : '' ]
6161
);
6262
}
6363

classes/suggested-tasks/providers/class-user.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@ class User extends Tasks {
4747
*/
4848
protected const PROVIDER_ID = 'user';
4949

50+
/**
51+
* Constructor.
52+
*/
53+
public function __construct() {
54+
\add_filter( 'progress_planner_suggested_tasks_in_rest_format', [ $this, 'modify_task_details_for_user_tasks_rest_format' ], 10, 2 );
55+
}
56+
5057
/**
5158
* Check if the task should be added.
5259
*
@@ -94,4 +101,29 @@ public function add_task_actions( $data = [], $actions = [] ) {
94101

95102
return $actions;
96103
}
104+
105+
/**
106+
* Modify the task details for user tasks in REST format.
107+
*
108+
* @param array $tasks The tasks.
109+
* @param array $args The arguments.
110+
*
111+
* @return array
112+
*/
113+
public function modify_task_details_for_user_tasks_rest_format( $tasks, $args ) {
114+
static $modified_tasks = [];
115+
if ( ! isset( $tasks['user'] ) || ! isset( $args['include_provider'] ) || ! \in_array( 'user', $args['include_provider'], true ) ) {
116+
return $tasks;
117+
}
118+
foreach ( $tasks['user'] as $key => $task ) {
119+
if ( \in_array( $task['id'], $modified_tasks, true ) ) {
120+
continue;
121+
}
122+
123+
$task['prpl_points'] = ( isset( $task['excerpt']['rendered'] ) && \str_contains( $task['excerpt']['rendered'], 'GOLDEN' ) ) ? 1 : 0;
124+
$tasks['user'][ $key ] = $task;
125+
$modified_tasks[] = $task['id'];
126+
}
127+
return $tasks;
128+
}
97129
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
/**
3+
* Update class for version 1.9.0.
4+
*
5+
* @package Progress_Planner
6+
*/
7+
8+
namespace Progress_Planner\Update;
9+
10+
/**
11+
* Update class for version 1.7.2.
12+
*
13+
* @package Progress_Planner
14+
*/
15+
class Update_190 {
16+
17+
const VERSION = '1.9.0';
18+
19+
/**
20+
* Run the update.
21+
*
22+
* @return void
23+
*/
24+
public function run() {
25+
// Migrate the golden task.
26+
$this->migrate_golden_todo_task();
27+
}
28+
29+
/**
30+
* Migrate the golden task.
31+
*
32+
* @return void
33+
*/
34+
private function migrate_golden_todo_task() {
35+
// Get all user tasks.
36+
$tasks = \progress_planner()->get_suggested_tasks_db()->get_tasks_by( [ 'provider_id' => 'user' ] );
37+
38+
// Loop through tasks and update the `post_excerpt` if the `prpl_points` meta is set to 1.
39+
global $wpdb;
40+
foreach ( $tasks as $task ) {
41+
// Get the `prpl_points` meta.
42+
// We'll be getting the value directly from the database since the post-meta is no longer used.
43+
$points = $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
44+
$wpdb->prepare(
45+
"SELECT meta_value FROM {$wpdb->postmeta} WHERE post_id = %d AND meta_key = 'prpl_points'", // @phpstan-ignore-line property.nonObject
46+
$task->ID
47+
)
48+
);
49+
if ( 1 === (int) $points ) {
50+
\progress_planner()->get_suggested_tasks_db()->update_recommendation(
51+
$task->ID,
52+
[ 'post_excerpt' => 'GOLDEN' ]
53+
);
54+
}
55+
}
56+
}
57+
}

views/js-templates/suggested-task.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script type="text/html" id="tmpl-prpl-suggested-task">
2-
<li class="prpl-suggested-task" data-task-id="{{ data.post.meta.prpl_task_id || data.post.id }}" data-post-id="{{ data.post.id }}" data-task-action="{{ data.action }}" data-task-url="{{ data.post.meta.prpl_url }}" data-task-provider-id="{{ data.post.prpl_provider.slug }}" data-task-points="{{ data.post.meta.prpl_points }}" data-task-category="{{ data.post.prpl_category.slug }}" data-task-order="{{ data.post.menu_order }}">
2+
<li class="prpl-suggested-task" data-task-id="{{ data.post.meta.prpl_task_id || data.post.id }}" data-post-id="{{ data.post.id }}" data-task-action="{{ data.action }}" data-task-url="{{ data.post.meta.prpl_url }}" data-task-provider-id="{{ data.post.prpl_provider.slug }}" data-task-points="{{ data.post.prpl_points }}" data-task-category="{{ data.post.prpl_category.slug }}" data-task-order="{{ data.post.menu_order }}">
33
<div class="prpl-suggested-task-checkbox-wrapper">
44
<# if ( 'user' === data.post.prpl_category.slug ) { #>
55
<label>
@@ -20,9 +20,9 @@ <h3 class="prpl-task-title">
2020
</div>
2121

2222
<div class="prpl-suggested-task-points-wrapper">
23-
<# if ( data.post.meta.prpl_points ) { #>
23+
<# if ( data.post.prpl_points ) { #>
2424
<span class="prpl-suggested-task-points">
25-
+{{ data.post.meta.prpl_points }}
25+
+{{ data.post.prpl_points }}
2626
</span>
2727
<# } #>
2828

0 commit comments

Comments
 (0)