Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [3.20.5](https://github.com/Parsely/wp-parsely/compare/3.20.4...3.20.5) - 2025-07-15

### Fixed

- Improve whitespace trimming in get_canonical_url() ([#3534](https://github.com/Parsely/wp-parsely/pull/3534))
- PCI Engagement Boost: Allow Pages and CPTs ([#3532](https://github.com/Parsely/wp-parsely/pull/3532))

## [3.20.4](https://github.com/Parsely/wp-parsely/compare/3.20.3...3.20.4) - 2025-07-08

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Parse.ly

Stable tag: 3.20.4
Stable tag: 3.20.5
Requires at least: 6.0
Tested up to: 6.8
Requires PHP: 7.4
Expand Down
2 changes: 1 addition & 1 deletion build/content-helper/dashboard-page.asset.php
Original file line number Diff line number Diff line change
@@ -1 +1 @@
<?php return array('dependencies' => array('react', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => 'cb305c11a90df2b8d9ae');
<?php return array('dependencies' => array('react', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-data', 'wp-dom-ready', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '86966deca1032417599c');
12 changes: 6 additions & 6 deletions build/content-helper/dashboard-page.js

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "wp-parsely",
"version": "3.20.4",
"version": "3.20.5",
"private": true,
"description": "The Parse.ly plugin facilitates real-time and historical analytics to your content through a platform designed and built for digital publishing.",
"author": "parsely, hbbtstar, jblz, mikeyarce, GaryJ, parsely_mike, acicovic, mehmoodak, vaurdan",
Expand Down
33 changes: 20 additions & 13 deletions src/UI/class-row-actions.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
* Handles the post/page row actions.
*
* @since 2.6.0
* @since 3.19.0 Added Traffic Boost link.
* @since 3.19.0 Added Engagement Boost link.
*/
final class Row_Actions {
/**
Expand Down Expand Up @@ -54,8 +54,8 @@ public function run(): void {
if ( apply_filters( 'wp_parsely_enable_row_action_links', true ) ) {
add_filter( 'post_row_actions', array( $this, 'row_actions_add_parsely_link' ), 10, 2 );
add_filter( 'page_row_actions', array( $this, 'row_actions_add_parsely_link' ), 10, 2 );
add_filter( 'post_row_actions', array( $this, 'row_actions_add_traffic_boost_link' ), 10, 2 );
add_filter( 'page_row_actions', array( $this, 'row_actions_add_traffic_boost_link' ), 10, 2 );
add_filter( 'post_row_actions', array( $this, 'row_actions_add_engagement_boost_link' ), 10, 2 );
add_filter( 'page_row_actions', array( $this, 'row_actions_add_engagement_boost_link' ), 10, 2 );
}
}

Expand Down Expand Up @@ -123,9 +123,9 @@ private function generate_aria_label_for_post( WP_Post $post ): string {
}

/**
* Adds a link to Traffic Boost in the row actions.
* Adds a link to Engagement Boost in the row actions.
*
* If the user doesn't have permission to use Traffic Boost, or if the post
* If the user doesn't have permission to use Engagement Boost, or if the post
* is a draft, private, future, pending, or trash, the link is not added.
*
* @since 3.19.0
Expand All @@ -134,7 +134,7 @@ private function generate_aria_label_for_post( WP_Post $post ): string {
* @param WP_Post $post The individual post object the actions apply to.
* @return array<string, string> The amended list of actions.
*/
public function row_actions_add_traffic_boost_link( array $actions, WP_Post $post ): array {
public function row_actions_add_engagement_boost_link( array $actions, WP_Post $post ): array {
if ( ! Permissions::current_user_can_use_pch_feature(
'traffic_boost',
$this->parsely->get_options()['content_helper']
Expand All @@ -149,21 +149,28 @@ public function row_actions_add_traffic_boost_link( array $actions, WP_Post $pos
return $actions;
}

$actions['traffic_boost'] = $this->generate_link_to_traffic_boost( $post );
// Disable for post types that do not support the REST API, which is
// required for getting target post data.
$post_type = get_post_type_object( $post->post_type );
if ( null === $post_type || ! $post_type->show_in_rest ) {
return $actions;
}

$actions['engagement_boost'] = $this->generate_link_to_engagement_boost( $post );
return $actions;
}

/**
* Generates the HTML link to Traffic Boost, with the Parse.ly icon.
* Generates the HTML link to Engagement Boost, with the Parse.ly icon.
*
* @since 3.19.0
*
* @param WP_Post $post The individual post object the actions apply to.
* @return string The HTML for the link to Traffic Boost.
* @return string The HTML for the link to Engagement Boost.
*/
private function generate_link_to_traffic_boost( WP_Post $post ): string {
$parsely_icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCA2MCA2NSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjMWQyMzI3IiBkPSJNMjMuNzIsNTEuNTNjMC0uMTgsMC0uMzQtLjA2LS41MmExMy4xMSwxMy4xMSwwLDAsMC0yLjEtNS41M0ExNC43NCwxNC43NCwwLDAsMCwxOS4xMiw0M2MtLjI3LS4yMS0uNS0uMTEtLjUxLjIybC0uMjQsMy40MmMwLC4zMy0uMzguMzUtLjQ5LDBsLTEuNS00LjhhMS40LDEuNCwwLDAsMC0uNzctLjc4LDIzLjkxLDIzLjkxLDAsMCwwLTMuMS0uODRjLTEuMzgtLjI0LTMuMzktLjM5LTMuMzktLjM5LS4zNCwwLS40NS4yMS0uMjUuNDlsMi4wNiwzLjc2Yy4yLjI3LDAsLjU0LS4yOS4zM2wtNC41MS0zLjZhMy42OCwzLjY4LDAsMCwwLTIuODYtLjQ4Yy0xLC4xNi0yLjQ0LjQ2LTIuNDQuNDZhLjY4LjY4LDAsMCwwLS4zOS4yNS43My43MywwLDAsMC0uMTQuNDVTLjQxLDQzLC41NCw0NGEzLjYzLDMuNjMsMCwwLDAsMS4yNSwyLjYyTDYuNDgsNTBjLjI4LjIuMDkuNDktLjIzLjM3bC00LjE4LS45NGMtLjMyLS4xMi0uNSwwLS40LjM3LDAsMCwuNjksMS44OSwxLjMxLDMuMTZhMjQsMjQsMCwwLDAsMS42NiwyLjc0LDEuMzQsMS4zNCwwLDAsMCwxLC41Mmw1LC4xM2MuMzMsMCwuNDEuMzguMS40OEw3LjUxLDU4Yy0uMzEuMS0uMzQuMzUtLjA3LjU1YTE0LjI5LDE0LjI5LDAsMCwwLDMuMDUsMS42NiwxMy4wOSwxMy4wOSwwLDAsMCw1LjkuNSwyNS4xMywyNS4xMywwLDAsMCw0LjM0LTEsOS41NSw5LjU1LDAsMCwxLS4wOC0xLjIsOS4zMiw5LjMyLDAsMCwxLDMuMDctNi45MSI+PC9wYXRoPjxwYXRoIGZpbGw9IiMxZDIzMjciIGQ9Ik01OS43LDQxLjUzYS43My43MywwLDAsMC0uMTQtLjQ1LjY4LjY4LDAsMCwwLS4zOS0uMjVzLTEuNDMtLjMtMi40NC0uNDZhMy42NCwzLjY0LDAsMCwwLTIuODYuNDhsLTQuNTEsMy42Yy0uMjYuMjEtLjQ5LS4wNi0uMjktLjMzbDIuMDYtMy43NmMuMi0uMjguMDktLjQ5LS4yNS0uNDksMCwwLTIsLjE1LTMuMzkuMzlhMjMuOTEsMjMuOTEsMCwwLDAtMy4xLjg0LDEuNCwxLjQsMCwwLDAtLjc3Ljc4bC0xLjUsNC44Yy0uMTEuMzItLjQ4LjMtLjQ5LDBsLS4yNC0zLjQyYzAtLjMzLS4yNC0uNDMtLjUxLS4yMmExNC43NCwxNC43NCwwLDAsMC0yLjQ0LDIuNDdBMTMuMTEsMTMuMTEsMCwwLDAsMzYuMzQsNTFjMCwuMTgsMCwuMzQtLjA2LjUyYTkuMjYsOS4yNiwwLDAsMSwzLDguMSwyNC4xLDI0LjEsMCwwLDAsNC4zNCwxLDEzLjA5LDEzLjA5LDAsMCwwLDUuOS0uNSwxNC4yOSwxNC4yOSwwLDAsMCwzLjA1LTEuNjZjLjI3LS4yLjI0LS40NS0uMDctLjU1bC0zLjIyLTEuMTdjLS4zMS0uMS0uMjMtLjQ3LjEtLjQ4bDUtLjEzYTEuMzgsMS4zOCwwLDAsMCwxLS41MkEyNC42LDI0LjYsMCwwLDAsNTcsNTIuOTJjLjYxLTEuMjcsMS4zMS0zLjE2LDEuMzEtMy4xNi4xLS4zMy0uMDgtLjQ5LS40LS4zN2wtNC4xOC45NGMtLjMyLjEyLS41MS0uMTctLjIzLS4zN2w0LjY5LTMuMzRBMy42MywzLjYzLDAsMCwwLDU5LjQ2LDQ0Yy4xMy0xLC4yNC0yLjQ3LjI0LTIuNDciPjwvcGF0aD48cGF0aCBmaWxsPSIjMWQyMzI3IiBkPSJNNDYuNSwyNS42MWMwLS41My0uMzUtLjcyLS44LS40M2wtNC44NiwyLjY2Yy0uNDUuMjgtLjU2LS4yNy0uMjMtLjY5bDQuNjYtNi4yM2EyLDIsMCwwLDAsLjI4LTEuNjgsMzYuNTEsMzYuNTEsMCwwLDAtMi4xOS00Ljg5LDM0LDM0LDAsMCwwLTIuODEtMy45NGMtLjMzLS40MS0uNzQtLjM1LS45MS4xNmwtMi4yOCw1LjY4Yy0uMTYuNS0uNi40OC0uNTktLjA1bC4yOC04LjkzYTIuNTQsMi41NCwwLDAsMC0uNjYtMS42NFMzNSw0LjI3LDMzLjg4LDMuMjcsMzAuNzguNjksMzAuNzguNjlhMS4yOSwxLjI5LDAsMCwwLTEuNTQsMHMtMS44OCwxLjQ5LTMuMTIsMi41OS0yLjQ4LDIuMzUtMi40OCwyLjM1QTIuNSwyLjUsMCwwLDAsMjMsNy4yN2wuMjcsOC45M2MwLC41My0uNDEuNTUtLjU4LjA1bC0yLjI5LTUuNjljLS4xNy0uNS0uNTctLjU2LS45MS0uMTRhMzUuNzcsMzUuNzcsMCwwLDAtMyw0LjIsMzUuNTUsMzUuNTUsMCwwLDAtMiw0LjYyLDIsMiwwLDAsMCwuMjcsMS42N2w0LjY3LDYuMjRjLjMzLjQyLjIzLDEtLjIyLjY5bC00Ljg3LTIuNjZjLS40NS0uMjktLjgyLS4xLS44Mi40M2ExOC42LDE4LjYsMCwwLDAsLjgzLDUuMDcsMjAuMTYsMjAuMTYsMCwwLDAsNS4zNyw3Ljc3YzMuMTksMyw1LjkzLDcuOCw3LjQ1LDExLjA4QTkuNiw5LjYsMCwwLDEsMzAsNDkuMDlhOS4zMSw5LjMxLDAsMCwxLDIuODYuNDVjMS41Mi0zLjI4LDQuMjYtOC4xMSw3LjQ0LTExLjA5YTIwLjQ2LDIwLjQ2LDAsMCwwLDUuMDktNywxOSwxOSwwLDAsMCwxLjExLTUuODIiPjwvcGF0aD48cGF0aCBmaWxsPSIjMWQyMzI3IiBkPSJNMzYuMTIsNTguNDRBNi4xMiw2LjEyLDAsMSwxLDMwLDUyLjMyYTYuMTEsNi4xMSwwLDAsMSw2LjEyLDYuMTIiPjwvcGF0aD48L3N2Zz4=';
$traffic_boost_url = admin_url( 'admin.php?page=parsely-dashboard-page#/engagement-boost/' . $post->ID );
private function generate_link_to_engagement_boost( WP_Post $post ): string {
$parsely_icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCA2MCA2NSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBmaWxsPSIjMWQyMzI3IiBkPSJNMjMuNzIsNTEuNTNjMC0uMTgsMC0uMzQtLjA2LS41MmExMy4xMSwxMy4xMSwwLDAsMC0yLjEtNS41M0ExNC43NCwxNC43NCwwLDAsMCwxOS4xMiw0M2MtLjI3LS4yMS0uNS0uMTEtLjUxLjIybC0uMjQsMy40MmMwLC4zMy0uMzguMzUtLjQ5LDBsLTEuNS00LjhhMS40LDEuNCwwLDAsMC0uNzctLjc4LDIzLjkxLDIzLjkxLDAsMCwwLTMuMS0uODRjLTEuMzgtLjI0LTMuMzktLjM5LTMuMzktLjM5LS4zNCwwLS40NS4yMS0uMjUuNDlsMi4wNiwzLjc2Yy4yLjI3LDAsLjU0LS4yOS4zM2wtNC41MS0zLjZhMy42OCwzLjY4LDAsMCwwLTIuODYtLjQ4Yy0xLC4xNi0yLjQ0LjQ2LTIuNDQuNDZhLjY4LjY4LDAsMCwwLS4zOS4yNS43My43MywwLDAsMC0uMTQuNDVTLjQxLDQzLC41NCw0NGEzLjYzLDMuNjMsMCwwLDAsMS4yNSwyLjYyTDYuNDgsNTBjLjI4LjIuMDkuNDktLjIzLjM3bC00LjE4LS45NGMtLjMyLS4xMi0uNSwwLS40LjM3LDAsMCwuNjksMS44OSwxLjMxLDMuMTZhMjQsMjQsMCwwLDAsMS42NiwyLjc0LDEuMzQsMS4zNCwwLDAsMCwxLC41Mmw1LC4xM2MuMzMsMCwuNDEuMzguMS40OEw3LjUxLDU4Yy0uMzEuMS0uMzQuMzUtLjA3LjU1YTE0LjI5LDE0LjI5LDAsMCwwLDMuMDUsMS42NiwxMy4wOSwxMy4wOSwwLDAsMCw1LjkuNSwyNS4xMywyNS4xMywwLDAsMCw0LjM0LTEsOS41NSw5LjU1LDAsMCwxLS4wOC0xLjIsOS4zMiw5LjMyLDAsMCwxLDMuMDctNi45MSI+PC9wYXRoPjxwYXRoIGZpbGw9IiMxZDIzMjciIGQ9Ik01OS43LDQxLjUzYS43My43MywwLDAsMC0uMTQtLjQ1LjY4LjY4LDAsMCwwLS4zOS0uMjVzLTEuNDMtLjMtMi40NC0uNDZhMy42NCwzLjY0LDAsMCwwLTIuODYuNDhsLTQuNTEsMy42Yy0uMjYuMjEtLjQ5LS4wNi0uMjktLjMzbDIuMDYtMy43NmMuMi0uMjguMDktLjQ5LS4yNS0uNDksMCwwLTIsLjE1LTMuMzkuMzlhMjMuOTEsMjMuOTEsMCwwLDAtMy4xLjg0LDEuNCwxLjQsMCwwLDAtLjc3Ljc4bC0xLjUsNC44Yy0uMTEuMzItLjQ4LjMtLjQ5LDBsLS4yNC0zLjQyYzAtLjMzLS4yNC0uNDMtLjUxLS4yMmExNC43NCwxNC43NCwwLDAsMC0yLjQ0LDIuNDdBMTMuMTEsMTMuMTEsMCwwLDAsMzYuMzQsNTFjMCwuMTgsMCwuMzQtLjA2LjUyYTkuMjYsOS4yNiwwLDAsMSwzLDguMSwyNC4xLDI0LjEsMCwwLDAsNC4zNCwxLDEzLjA5LDEzLjA5LDAsMCwwLDUuOS0uNSwxNC4yOSwxNC4yOSwwLDAsMCwzLjA1LTEuNjZjLjI3LS4yLjI0LS40NS0uMDctLjU1bC0zLjIyLTEuMTdjLS4zMS0uMS0uMjMtLjQ3LjEtLjQ4bDUtLjEzYTEuMzgsMS4zOCwwLDAsMCwxLS41MkEyNC42LDI0LjYsMCwwLDAsNTcsNTIuOTJjLjYxLTEuMjcsMS4zMS0zLjE2LDEuMzEtMy4xNi4xLS4zMy0uMDgtLjQ5LS40LS4zN2wtNC4xOC45NGMtLjMyLjEyLS41MS0uMTctLjIzLS4zN2w0LjY5LTMuMzRBMy42MywzLjYzLDAsMCwwLDU5LjQ2LDQ0Yy4xMy0xLC4yNC0yLjQ3LjI0LTIuNDciPjwvcGF0aD48cGF0aCBmaWxsPSIjMWQyMzI3IiBkPSJNNDYuNSwyNS42MWMwLS41My0uMzUtLjcyLS44LS40M2wtNC44NiwyLjY2Yy0uNDUuMjgtLjU2LS4yNy0uMjMtLjY5bDQuNjYtNi4yM2EyLDIsMCwwLDAsLjI4LTEuNjgsMzYuNTEsMzYuNTEsMCwwLDAtMi4xOS00Ljg5LDM0LDM0LDAsMCwwLTIuODEtMy45NGMtLjMzLS40MS0uNzQtLjM1LS45MS4xNmwtMi4yOCw1LjY4Yy0uMTYuNS0uNi40OC0uNTktLjA1bC4yOC04LjkzYTIuNTQsMi41NCwwLDAsMC0uNjYtMS42NFMzNSw0LjI3LDMzLjg4LDMuMjcsMzAuNzguNjksMzAuNzguNjlhMS4yOSwxLjI5LDAsMCwwLTEuNTQsMHMtMS44OCwxLjQ5LTMuMTIsMi41OS0yLjQ4LDIuMzUtMi40OCwyLjM1QTIuNSwyLjUsMCwwLDAsMjMsNy4yN2wuMjcsOC45M2MwLC41My0uNDEuNTUtLjU4LjA1bC0yLjI5LTUuNjljLS4xNy0uNS0uNTctLjU2LS45MS0uMTRhMzUuNzcsMzUuNzcsMCwwLDAtMyw0LjIsMzUuNTUsMzUuNTUsMCwwLDAtMiw0LjYyLDIsMiwwLDAsMCwuMjcsMS42N2w0LjY3LDYuMjRjLjMzLjQyLjIzLDEtLjIyLjY5bC00Ljg3LTIuNjZjLS40NS0uMjktLjgyLS4xLS44Mi40M2ExOC42LDE4LjYsMCwwLDAsLjgzLDUuMDcsMjAuMTYsMjAuMTYsMCwwLDAsNS4zNyw3Ljc3YzMuMTksMyw1LjkzLDcuOCw3LjQ1LDExLjA4QTkuNiw5LjYsMCwwLDEsMzAsNDkuMDlhOS4zMSw5LjMxLDAsMCwxLDIuODYuNDVjMS41Mi0zLjI4LDQuMjYtOC4xMSw3LjQ0LTExLjA5YTIwLjQ2LDIwLjQ2LDAsMCwwLDUuMDktNywxOSwxOSwwLDAsMCwxLjExLTUuODIiPjwvcGF0aD48cGF0aCBmaWxsPSIjMWQyMzI3IiBkPSJNMzYuMTIsNTguNDRBNi4xMiw2LjEyLDAsMSwxLDMwLDUyLjMyYTYuMTEsNi4xMSwwLDAsMSw2LjEyLDYuMTIiPjwvcGF0aD48L3N2Zz4=';
$engagement_boost_url = admin_url( 'admin.php?page=parsely-dashboard-page#/engagement-boost/' . $post->ID );

return sprintf(
'<a href="%1$s" aria-label="%2$s" style="white-space:nowrap;">
Expand All @@ -172,7 +179,7 @@ private function generate_link_to_traffic_boost( WP_Post $post ): string {
<img src="%4$s" alt="" style="width:14px; height:14px; margin-left:2px; display:inline-block;">
</span>
</a>',
esc_url( $traffic_boost_url ),
esc_url( $engagement_boost_url ),
esc_attr( $this->generate_aria_label_for_post( $post ) ),
esc_html__( 'Boost Engagement', 'wp-parsely' ),
esc_attr( $parsely_icon )
Expand Down
4 changes: 2 additions & 2 deletions src/class-parsely.php
Original file line number Diff line number Diff line change
Expand Up @@ -1043,8 +1043,8 @@ public static function get_canonical_url( string $url ): string {
if ( is_string( $canonical_url_domain ) ) {
// Get the canonical URL domain without protocol, trailing slashes
// or accidental whitespace.
$canonical_url_domain = rtrim( $canonical_url_domain, '/' );
$canonical_url_domain = preg_replace( '#^https?://#', '', trim( $canonical_url_domain ) );
$canonical_url_domain = rtrim( trim( $canonical_url_domain ), '/' );
$canonical_url_domain = preg_replace( '#^https?://#', '', $canonical_url_domain );

if ( is_string( $canonical_url_domain ) && '' !== $canonical_url_domain ) {
$url_domain = (string) wp_parse_url( $url, PHP_URL_HOST );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,15 @@ export type FetchResponse<T> = {
response: Response;
};

/**
* Structure of the response from the 'utils/post/[post-id]/rest-route' endpoint.
*
* @since 3.20.5
*/
type PostRestRouteResponse = {
data: string;
}

/**
* Type definition for query parameters.
*
Expand Down Expand Up @@ -334,8 +343,29 @@ export abstract class BaseWordPressProvider extends BaseProvider {
): Promise<HydratedPost> {
const context = 'edit';

let postRestRoute: PostRestRouteResponse;

try {
postRestRoute = await this.fetch<PostRestRouteResponse>( {
method: 'GET',
path: `/wp-parsely/v2/utils/post/${ postId }/rest-route`,
}, id );
} catch ( error ) {
throw new ContentHelperError(
__( "The target post's REST route could not be fetched.", 'wp-parsely' ),
ContentHelperErrorCode.UnknownError,
);
}

if ( ! postRestRoute || ! postRestRoute.data || '' === postRestRoute.data ) {
throw new ContentHelperError(
__( "The target post's REST route could not be fetched.", 'wp-parsely' ),
ContentHelperErrorCode.UnknownError,
);
}

const post = await this.apiFetch<Post>( {
path: `/wp/v2/posts/${ postId }?_embed&context=${ context }`,
path: `${ postRestRoute.data }?_embed&context=${ context }`,
method: 'GET',
}, id );

Expand Down
2 changes: 2 additions & 0 deletions src/rest-api/class-rest-api-controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use Parsely\REST_API\Content_Helper\Content_Helper_Controller;
use Parsely\REST_API\Settings\Settings_Controller;
use Parsely\REST_API\Stats\Stats_Controller;
use Parsely\REST_API\Utils\Utils_Controller;

/**
* The REST API Controller.
Expand Down Expand Up @@ -64,6 +65,7 @@ public function init(): void {
new Content_Helper_Controller( $this->get_parsely() ),
new Stats_Controller( $this->get_parsely() ),
new Settings_Controller( $this->get_parsely() ),
new Utils_Controller( $this->get_parsely() ),
);

// Initialize the controllers.
Expand Down
72 changes: 72 additions & 0 deletions src/rest-api/utils/class-endpoint-post.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?php
/**
* Utils API Endpoint: Post
*
* @package Parsely
* @since 3.20.5
*/

declare(strict_types=1);

namespace Parsely\REST_API\Utils;

use Parsely\REST_API\Base_Endpoint;
use Parsely\REST_API\Use_Post_ID_Parameter_Trait;
use WP_REST_Request;
use WP_REST_Response;

/**
* The Utils API Post endpoint.
*
* Provides an endpoint for utility functions related to Posts.
*
* @since 3.20.5
*/
class Endpoint_Post extends Base_Endpoint {
use Use_Post_ID_Parameter_Trait;

/**
* Returns the endpoint's name.
*
* @since 3.20.5
*
* @return string The endpoint's name.
*/
public static function get_endpoint_name(): string {
return 'post';
}

/**
* Registers the routes for the endpoint.
*
* @since 3.20.5
*/
public function register_routes(): void {
/**
* GET /utils/post/{post_id}/rest-route
* Returns the REST route of a Post.
*/
$this->register_rest_route_with_post_id(
'/rest-route',
array( 'GET' ),
array( $this, 'get_rest_route' )
);
}

/**
* API Endpoint: GET /utils/post/{post_id}/rest-route
*
* Returns the REST route of a post.
*
* @since 3.20.5
*
* @param WP_REST_Request $request The request object.
* @return WP_REST_Response The response object.
*/
public function get_rest_route( WP_REST_Request $request ) {
$post_id = $request->get_param( 'post_id' );
$post_rest_route = rest_get_route_for_post( $post_id );

return new WP_REST_Response( array( 'data' => $post_rest_route ), 200 );
}
}
47 changes: 47 additions & 0 deletions src/rest-api/utils/class-utils-controller.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php
/**
* API Utils Controller
*
* @package Parsely
* @since 3.20.5
*/

declare(strict_types=1);

namespace Parsely\REST_API\Utils;

use Parsely\REST_API\REST_API_Controller;
use Parsely\REST_API\Utils\Endpoint_Post;

/**
* The Utils API Controller.
*
* Used to define the namespace, version, and endpoints for the Utils API.
*
* @since 3.20.5
*/
class Utils_Controller extends REST_API_Controller {
/**
* Gets the prefix for this API route.
*
* @since 3.20.5
*
* @return string The namespace.
*/
public static function get_route_prefix(): string {
return 'utils';
}

/**
* Initializes the Utils API endpoints.
*
* @since 3.20.5
*/
public function init(): void {
$endpoints = array(
new Endpoint_Post( $this ),
);

$this->register_endpoints( $endpoints );
}
}
Loading
Loading