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
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.

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
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,15 @@
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 @@
): 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 );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
*
* @since 3.17.0
*/
class EndpointPostTest extends BaseEndpointTest {
class EndpointStatsPostTest extends BaseEndpointTest {
/**
* The endpoint instance.
*
Expand Down
Loading
Loading