Skip to content

Commit 2e0dd23

Browse files
authored
Merge pull request #608 from ProgressPlanner/convert-meta/prpl_task_id
WIP: Migrate the `prpl_task_id` post-meta to the post's slug
2 parents f39369e + 35e6f45 commit 2e0dd23

16 files changed

Lines changed: 147 additions & 64 deletions

classes/class-suggested-tasks-db.php

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,25 @@ public function add( $data ) {
5252
}
5353

5454
// Check if we have an existing task with the same title.
55-
$posts = $this->get_tasks_by(
55+
$posts = $this->get_tasks_by(
5656
[
5757
'post_status' => [ 'publish', 'trash', 'draft', 'future', 'pending' ], // 'any' doesn't include statuses which have 'exclude_from_search' set to true (trash and pending).
5858
'numberposts' => 1,
59-
'meta_query' => [ // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query
60-
[
61-
'key' => 'prpl_task_id',
62-
'value' => $data['task_id'],
63-
'compare' => '=',
64-
],
65-
],
59+
'name' => \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $data['task_id'] ),
60+
]
61+
);
62+
$posts_trashed = $this->get_tasks_by(
63+
[
64+
'post_status' => [ 'trash' ],
65+
'numberposts' => 1,
66+
'name' => \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $data['task_id'] ) . '__trashed',
6667
]
6768
);
6869

70+
if ( empty( $posts ) && ! empty( $posts_trashed ) ) {
71+
$posts = $posts_trashed;
72+
}
73+
6974
// If we have an existing task, skip.
7075
if ( ! empty( $posts ) ) {
7176
\delete_option( $lock_key );
@@ -83,6 +88,7 @@ public function add( $data ) {
8388
'post_title' => $data['post_title'],
8489
'post_content' => $data['description'] ?? '',
8590
'menu_order' => $data['order'] ?? 0,
91+
'post_name' => \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $data['task_id'] ),
8692
];
8793
switch ( $data['post_status'] ) {
8894
case 'pending':
@@ -313,12 +319,7 @@ public function get_tasks_by( $params ) {
313319
break;
314320

315321
case 'task_id':
316-
$args['meta_query'] = isset( $args['meta_query'] ) ? $args['meta_query'] : []; // phpcs:ignore WordPress.DB.SlowDBQuery
317-
$args['meta_query'][] = [
318-
'key' => 'prpl_task_id',
319-
'value' => $value,
320-
];
321-
322+
$args['name'] = \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $value );
322323
unset( $params[ $param ] );
323324
break;
324325

@@ -359,6 +360,23 @@ public function get( $args = [] ) {
359360
$results = $this->format_recommendations(
360361
\get_posts( $args )
361362
);
363+
if ( ! empty( $args['post_status'] )
364+
&& \in_array( 'trash', (array) $args['post_status'], true )
365+
&& isset( $args['name'] )
366+
) {
367+
$results_trashed = $this->format_recommendations(
368+
\get_posts(
369+
\wp_parse_args(
370+
$args,
371+
[
372+
'post_status' => [ 'trash' ],
373+
'name' => \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $args['name'] ) . '__trashed',
374+
]
375+
)
376+
)
377+
);
378+
$results = array_merge( $results, $results_trashed );
379+
}
362380

363381
\wp_cache_set( $cache_key, $results, static::GET_TASKS_CACHE_GROUP );
364382

classes/class-suggested-tasks.php

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,15 @@ public function init(): void {
8080
$completed_tasks = $this->tasks_manager->evaluate_tasks();
8181

8282
foreach ( $completed_tasks as $task ) {
83-
if ( ! $task->task_id && $task->ID ) {
83+
if ( ! $task->post_name && $task->ID ) {
8484
continue;
8585
}
8686

8787
// Change the task status to pending.
8888
$task->celebrate();
8989

9090
// Insert an activity.
91-
$this->insert_activity( $task->task_id );
91+
$this->insert_activity( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $task->post_name ) );
9292
}
9393
}
9494

@@ -156,7 +156,7 @@ public function on_automatic_updates_complete(): void {
156156
\progress_planner()->get_suggested_tasks_db()->update_recommendation( $pending_tasks[0]->ID, [ 'post_status' => 'trash' ] );
157157

158158
// Insert an activity.
159-
$this->insert_activity( $pending_tasks[0]->task_id );
159+
$this->insert_activity( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $pending_tasks[0]->post_name ) );
160160
}
161161

162162
/**
@@ -247,13 +247,13 @@ public function suggested_task_action() {
247247
switch ( $action ) {
248248
case 'complete':
249249
// Insert an activity.
250-
$this->insert_activity( $task->task_id );
250+
$this->insert_activity( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $task->post_name ) );
251251
$updated = true;
252252
break;
253253

254254
case 'pending': // User task was marked as pending.
255255
case 'delete':
256-
$this->delete_activity( $task->task_id );
256+
$this->delete_activity( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $task->post_name ) );
257257
$updated = true;
258258
break;
259259
}
@@ -298,17 +298,12 @@ public function register_post_type() {
298298
);
299299

300300
$rest_meta_fields = [
301-
'prpl_task_id' => [
301+
'prpl_url' => [
302302
'type' => 'string',
303303
'single' => true,
304304
'show_in_rest' => true,
305305
],
306-
'prpl_url' => [
307-
'type' => 'string',
308-
'single' => true,
309-
'show_in_rest' => true,
310-
],
311-
'menu_order' => [
306+
'menu_order' => [
312307
'type' => 'number',
313308
'single' => true,
314309
'show_in_rest' => true,
@@ -429,6 +424,8 @@ public function rest_prepare_recommendation( $response, $post ) {
429424
$provider = \progress_planner()->get_suggested_tasks()->get_tasks_manager()->get_task_provider( $provider_term[0]->slug );
430425
}
431426

427+
$response->data['slug'] = \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $response->data['slug'] );
428+
432429
if ( $provider ) {
433430
$response->data['prpl_provider'] = $provider_term[0];
434431
// Link should be added during run time, since it is not added for users without required capability.
@@ -437,18 +434,18 @@ public function rest_prepare_recommendation( $response, $post ) {
437434
: '';
438435

439436
$response->data['prpl_popover_id'] = $provider->get_popover_id();
440-
441-
// This has to be the last item to be added because actions use data from previous items.
442-
$response->data['prpl_task_actions'] = $provider->get_task_actions( $response->data );
443-
$response->data['prpl_points'] = $provider->get_points();
437+
$response->data['prpl_points'] = $provider->get_points();
444438

445439
/*
446440
* Check if task was completed before - for example, comments were disabled and then re-enabled, and remove points if so.
447441
* Those are tasks which are completed by toggling an option, so non repetitive & not user tasks.
448442
*/
449-
if ( ! \has_term( 'user', 'prpl_recommendations_provider', $post->ID ) && ! $provider->is_repetitive() && $provider->task_has_activity( $response->data['meta']['prpl_task_id'] ) ) {
443+
if ( ! \has_term( 'user', 'prpl_recommendations_provider', $post->ID ) && ! $provider->is_repetitive() && $provider->task_has_activity( $response->data['slug'] ) ) {
450444
$response->data['prpl_points'] = 0;
451445
}
446+
447+
// This has to be the last item to be added because actions use data from previous items.
448+
$response->data['prpl_task_actions'] = $provider->get_task_actions( $response->data );
452449
}
453450

454451
// Category taxonomy removed - no longer adding prpl_category to response.
@@ -520,4 +517,14 @@ function ( $task ) use ( $args ) {
520517
*/
521518
return \apply_filters( 'progress_planner_suggested_tasks_in_rest_format', $tasks, $args );
522519
}
520+
521+
/**
522+
* Get the task ID from a slug.
523+
*
524+
* @param string $slug The slug.
525+
* @return string
526+
*/
527+
public function get_task_id_from_slug( $slug ) {
528+
return explode( '__trashed', $slug )[0];
529+
}
523530
}

classes/class-todo.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,12 @@ public function handle_creating_user_task( $post, $request, $creating ) {
8181
}
8282

8383
// Add task_id to the post.
84-
\update_post_meta( $post->ID, 'prpl_task_id', 'user-' . $post->ID );
84+
\wp_update_post(
85+
[
86+
'ID' => $post->ID,
87+
'post_name' => 'user-' . $post->ID,
88+
]
89+
);
8590

8691
// If it is first task ever created, it should be golden.
8792
$pending_items = \progress_planner()->get_suggested_tasks_db()->get_tasks_by(

classes/suggested-tasks/class-task.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
* @property int $ID The task ID
1414
* @property string $post_status The task status
1515
* @property string $post_title The task title
16+
* @property string $post_name The task name
1617
* @property string $post_date The task date
1718
* @property int $menu_order The task menu order (priority)
1819
* @property \stdClass|null $provider The task provider object with slug property
19-
* @property string $task_id The task identifier
2020
* @property string $provider_id The provider identifier
2121
* @property int $priority The task priority (0-100, 0 being highest and 100 being lowest).
2222
* @property int $points The task points

classes/suggested-tasks/class-tasks-manager.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ public function evaluate_task( Task $task ) {
268268
return false;
269269
}
270270

271-
return $task_provider->evaluate_task( $task->task_id );
271+
return $task_provider->evaluate_task( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $task->post_name ) );
272272
}
273273

274274
/**

classes/suggested-tasks/providers/class-core-update.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public function add_core_update_link( $update_actions ) {
8787
// All updates are completed and there is a 'update-core' task in the published tasks.
8888
if ( $this->is_task_completed() ) {
8989
foreach ( \progress_planner()->get_suggested_tasks_db()->get_tasks_by( [ 'post_status' => 'publish' ] ) as $task ) {
90-
if ( $this->get_task_id() === $task->task_id ) {
90+
if ( $this->get_task_id() === \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $task->post_name ) ) {
9191
$update_actions['prpl_core_update'] =
9292
'<img src="' . \esc_attr( \constant( 'PROGRESS_PLANNER_URL' ) . '/assets/images/icon_progress_planner.svg' ) . '" style="width:1rem;padding-left:0.25rem;padding-right:0.25rem;vertical-align:middle;" alt="Progress Planner" />' .
9393
'<a href="' . \esc_url( \admin_url( 'admin.php?page=progress-planner' ) ) . '" target="_parent">' . \esc_html__( 'Click here to celebrate your completed task!', 'progress-planner' ) . '</a>';

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ public function is_onboarding_task() {
396396
*/
397397
public function is_task_snoozed() {
398398
foreach ( \progress_planner()->get_suggested_tasks_db()->get_tasks_by( [ 'post_status' => 'future' ] ) as $task ) {
399-
$task = \progress_planner()->get_suggested_tasks_db()->get_post( $task->task_id );
399+
$task = \progress_planner()->get_suggested_tasks_db()->get_post( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $task->post_name ) );
400400
$provider_id = $task ? $task->get_provider_id() : '';
401401

402402
if ( $provider_id === $this->get_provider_id() ) {
@@ -439,18 +439,18 @@ public function evaluate_task( $task_id ) {
439439

440440
if ( ! $this->is_repetitive() ) {
441441
// Collaborator tasks have custom task_ids, so strpos check does not work for them.
442-
if ( ! $task->task_id || ( 0 !== \strpos( $task->task_id, $this->get_task_id() ) && 'collaborator' !== $this->get_provider_id() ) ) {
442+
if ( ! $task->post_name || ( 0 !== \strpos( $task->post_name, $this->get_task_id() ) && 'collaborator' !== $this->get_provider_id() ) ) {
443443
return false;
444444
}
445-
return $this->is_task_completed( $task->task_id ) ? $task : false;
445+
return $this->is_task_completed( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $task->post_name ) ) ? $task : false;
446446
}
447447

448448
if (
449449
$task->provider &&
450450
$task->provider->slug === $this->get_provider_id() &&
451451
\DateTime::createFromFormat( 'Y-m-d H:i:s', $task->post_date ) &&
452452
\gmdate( 'YW' ) === \gmdate( 'YW', \DateTime::createFromFormat( 'Y-m-d H:i:s', $task->post_date )->getTimestamp() ) && // @phpstan-ignore-line
453-
$this->is_task_completed( $task->task_id )
453+
$this->is_task_completed( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $task->post_name ) )
454454
) {
455455
// Allow adding more data, for example in case of 'create-post' tasks we are adding the post_id.
456456
$task_data = $this->modify_evaluated_task_data( $task->get_data() );
@@ -635,12 +635,12 @@ public function get_task_actions( $data = [] ) {
635635
if ( $this->capability_required() && $this->is_dismissable() && 'user' !== static::PROVIDER_ID ) {
636636
$actions[] = [
637637
'priority' => 20,
638-
'html' => '<button type="button" class="prpl-suggested-task-button" data-task-id="' . \esc_attr( $data['meta']['prpl_task_id'] ) . '" data-task-title="' . \esc_attr( $data['title']['rendered'] ) . '" data-action="complete" data-target="complete" title="' . \esc_html__( 'Mark as complete', 'progress-planner' ) . '" onclick="prplSuggestedTask.maybeComplete(' . (int) $data['id'] . ');"><span class="prpl-tooltip-action-text">' . \esc_html__( 'Mark as complete', 'progress-planner' ) . '</span><span class="screen-reader-text">' . \esc_html__( 'Mark as complete', 'progress-planner' ) . '</span></button>',
638+
'html' => '<button type="button" class="prpl-suggested-task-button" data-task-id="' . \esc_attr( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $data['slug'] ) ) . '" data-task-title="' . \esc_attr( $data['title']['rendered'] ) . '" data-action="complete" data-target="complete" title="' . \esc_html__( 'Mark as complete', 'progress-planner' ) . '" onclick="prplSuggestedTask.maybeComplete(' . (int) $data['id'] . ');"><span class="prpl-tooltip-action-text">' . \esc_html__( 'Mark as complete', 'progress-planner' ) . '</span><span class="screen-reader-text">' . \esc_html__( 'Mark as complete', 'progress-planner' ) . '</span></button>',
639639
];
640640
}
641641

642642
if ( $this->capability_required() && $this->is_snoozable() ) {
643-
$snooze_html = '<prpl-tooltip class="prpl-suggested-task-snooze"><slot name="open"><button type="button" class="prpl-suggested-task-button" data-task-id="' . \esc_attr( $data['meta']['prpl_task_id'] ) . '" data-task-title="' . \esc_attr( $data['title']['rendered'] ) . '" data-action="snooze" data-target="snooze" title="' . \esc_attr__( 'Snooze', 'progress-planner' ) . '"><span class="prpl-tooltip-action-text">' . \esc_html__( 'Snooze', 'progress-planner' ) . '</span><span class="screen-reader-text">' . \esc_html__( 'Snooze', 'progress-planner' ) . '</span></button></slot><slot name="content">';
643+
$snooze_html = '<prpl-tooltip class="prpl-suggested-task-snooze"><slot name="open"><button type="button" class="prpl-suggested-task-button" data-task-id="' . \esc_attr( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $data['slug'] ) ) . '" data-task-title="' . \esc_attr( $data['title']['rendered'] ) . '" data-action="snooze" data-target="snooze" title="' . \esc_attr__( 'Snooze', 'progress-planner' ) . '"><span class="prpl-tooltip-action-text">' . \esc_html__( 'Snooze', 'progress-planner' ) . '</span><span class="screen-reader-text">' . \esc_html__( 'Snooze', 'progress-planner' ) . '</span></button></slot><slot name="content">';
644644
$snooze_html .= '<fieldset><legend><span>' . \esc_html__( 'Snooze this task?', 'progress-planner' ) . '</span><button type="button" class="prpl-toggle-radio-group" onclick="this.closest(\'.prpl-suggested-task-snooze\').classList.toggle(\'prpl-toggle-radio-group-open\');"><span class="prpl-toggle-radio-group-text">' . \esc_html__( 'How long?', 'progress-planner' ) . '</span><span class="prpl-toggle-radio-group-arrow">&rsaquo;</span></button></legend><div class="prpl-snooze-duration-radio-group">';
645645
foreach (
646646
[
@@ -651,7 +651,7 @@ public function get_task_actions( $data = [] ) {
651651
'1-year' => \esc_html__( '1 year', 'progress-planner' ),
652652
'forever' => \esc_html__( 'forever', 'progress-planner' ),
653653
] as $snooze_key => $snooze_value ) {
654-
$snooze_html .= '<label><input type="radio" name="snooze-duration-' . \esc_attr( $data['meta']['prpl_task_id'] ) . '" value="' . \esc_attr( $snooze_key ) . '" onchange="prplSuggestedTask.snooze(' . (int) $data['id'] . ', \'' . \esc_attr( $snooze_key ) . '\');">' . \esc_html( $snooze_value ) . '</label>';
654+
$snooze_html .= '<label><input type="radio" name="snooze-duration-' . \esc_attr( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $data['slug'] ) ) . '" value="' . \esc_attr( $snooze_key ) . '" onchange="prplSuggestedTask.snooze(' . (int) $data['id'] . ', \'' . \esc_attr( $snooze_key ) . '\');">' . \esc_html( $snooze_value ) . '</label>';
655655
}
656656
$snooze_html .= '</div></fieldset></slot></prpl-tooltip>';
657657
$actions[] = [
@@ -668,7 +668,7 @@ public function get_task_actions( $data = [] ) {
668668
} elseif ( isset( $data['content']['rendered'] ) && $data['content']['rendered'] !== '' && ! $this instanceof Tasks_Interactive ) {
669669
$actions[] = [
670670
'priority' => 40,
671-
'html' => '<prpl-tooltip><slot name="open"><button type="button" class="prpl-suggested-task-button" data-task-id="' . \esc_attr( $data['meta']['prpl_task_id'] ) . '" data-task-title="' . \esc_attr( $data['title']['rendered'] ) . '" data-action="info" data-target="info" title="' . \esc_html__( 'Info', 'progress-planner' ) . '"><span class="prpl-tooltip-action-text">' . \esc_html__( 'Info', 'progress-planner' ) . '</span><span class="screen-reader-text">' . \esc_html__( 'Info', 'progress-planner' ) . '</span></button></slot><slot name="content">' . \wp_kses_post( $data['content']['rendered'] ) . '</slot></prpl-tooltip>',
671+
'html' => '<prpl-tooltip><slot name="open"><button type="button" class="prpl-suggested-task-button" data-task-id="' . \esc_attr( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $data['slug'] ) ) . '" data-task-title="' . \esc_attr( $data['title']['rendered'] ) . '" data-action="info" data-target="info" title="' . \esc_html__( 'Info', 'progress-planner' ) . '"><span class="prpl-tooltip-action-text">' . \esc_html__( 'Info', 'progress-planner' ) . '</span><span class="screen-reader-text">' . \esc_html__( 'Info', 'progress-planner' ) . '</span></button></slot><slot name="content">' . \wp_kses_post( $data['content']['rendered'] ) . '</slot></prpl-tooltip>',
672672
];
673673
}
674674

classes/suggested-tasks/providers/class-update-term-description.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,11 @@ public function exclude_completed_terms( $exclude_term_ids ) {
290290
* @return array
291291
*/
292292
public function add_task_actions( $data = [], $actions = [] ) {
293-
if ( ! isset( $data['meta']['prpl_task_id'] ) ) {
293+
if ( ! isset( $data['slug'] ) ) {
294294
return $actions;
295295
}
296296

297-
$term = $this->get_term_from_task_id( $data['meta']['prpl_task_id'] );
297+
$term = $this->get_term_from_task_id( \progress_planner()->get_suggested_tasks()->get_task_id_from_slug( $data['slug'] ) );
298298
if ( ! $term ) {
299299
return $actions;
300300
}

0 commit comments

Comments
 (0)