Files
medicalalert-web-reloaded/wp/wp-content/plugins/relevanssi-premium/premium/gutenberg-sidebar.php
Tony Volpe 4eb982d7a8 Merged in feature/from-pantheon (pull request #16)
code from pantheon

* code from pantheon
2024-01-10 17:03:02 +00:00

413 lines
11 KiB
PHP

<?php
/**
* /premium/gutenberg-sidebar.php
*
* The Gutenberg sidebar for Relevanssi Premium.
*
* @package Relevanssi_Premium
* @author Mikko Saari
* @license https://wordpress.org/about/gpl/ GNU General Public License
* @see https://www.relevanssi.com/
*/
add_action( 'init', 'relevanssi_register_gutenberg_meta' );
add_action( 'enqueue_block_editor_assets', 'relevanssi_block_editor_assets' );
add_action( 'rest_api_init', 'relevanssi_register_gutenberg_rest_routes' );
add_filter( 'load_script_translation_file', 'relevanssi_rename_translation_file', 10, 2 );
/**
* Registers the meta fields for the block editor.
*
* Attached to the 'init' custom hook, this function will register all the
* necessary meta fields so that they are available in the block editor.
*
* @since 2.5.0
*/
function relevanssi_register_gutenberg_meta() {
$relevanssi_meta_fields = array(
array(
'meta_key' => '_relevanssi_hide_post',
'description' => 'Hide this post',
),
array(
'meta_key' => '_relevanssi_hide_content',
'description' => 'Hide post content',
),
array(
'meta_key' => '_relevanssi_pin_for_all',
'description' => 'Pin for all searches',
),
array(
'meta_key' => '_relevanssi_pin_keywords',
'description' => 'Pin for these keywords',
),
array(
'meta_key' => '_relevanssi_unpin_keywords',
'description' => 'Block for these keywords',
),
array(
'meta_key' => '_relevanssi_related_keywords',
'description' => 'Keywords for related posts searches',
),
array(
'meta_key' => '_relevanssi_related_include_ids',
'description' => 'Post IDs for included related posts',
),
array(
'meta_key' => '_relevanssi_related_exclude_ids',
'description' => 'Post IDs for excluded related posts',
),
array(
'meta_key' => '_relevanssi_related_no_append',
'description' => "Don't append related posts to this post",
),
array(
'meta_key' => '_relevanssi_related_not_related',
'description' => 'Disable related posts for this post',
),
array(
'meta_key' => '_relevanssi_related_posts',
'description' => 'Related posts for this post',
),
array(
'meta_key' => '_relevanssi_noindex_reason',
'description' => 'Reason this post is not indexed',
),
);
foreach ( $relevanssi_meta_fields as $meta_field ) {
register_meta(
'post',
$meta_field['meta_key'],
array(
'type' => 'string',
'description' => $meta_field['description'],
'single' => true,
'show_in_rest' => true,
'auth_callback' => '__return_true',
)
);
}
}
/**
* Registers the Gutenberg sidebar script.
*
* Registers the Gutenberg sidebar script, exact version depending on whether
* the RELEVANSSI_DEVELOP constant is set or not, includes the dependencies and
* the translations.
*
* @since 2.5.0
*/
function relevanssi_register_gutenberg_script() {
global $relevanssi_variables;
if ( ! function_exists( 'wp_set_script_translations' ) ) {
return;
}
global $post;
if ( ! $post ) {
return;
}
if ( $post && ! post_type_supports( $post->post_type, 'custom-fields' ) ) {
return;
}
if ( ! current_user_can(
/**
* Filters the capability required to access the Relevanssi sidebar.
*
* @param string The capability required, default 'edit_others_posts'.
*/
apply_filters( 'relevanssi_sidebar_capability', $relevanssi_variables['sidebar_capability'] )
)
) {
return;
}
$file_location = 'premium/gutenberg-sidebar/';
if ( RELEVANSSI_DEVELOP ) {
$file_location = 'build/';
}
wp_register_script(
'relevanssi-sidebar',
plugin_dir_url( $relevanssi_variables['plugin_basename'] ) . $file_location . 'index.js',
array( 'wp-api-fetch', 'wp-i18n', 'wp-blocks', 'wp-edit-post', 'wp-element', 'wp-editor', 'wp-components', 'wp-data', 'wp-plugins', 'wp-edit-post' ),
1,
true
);
wp_set_script_translations( 'relevanssi-sidebar', 'relevanssi', WP_CONTENT_DIR . '/languages/plugins' );
}
/**
* Enqueues the Gutenberg sidebar script.
*
* @since 2.5.0
*/
function relevanssi_block_editor_assets() {
relevanssi_register_gutenberg_script();
wp_enqueue_script( 'relevanssi-sidebar' );
}
/**
* Adds a REST API endpoint for "How Relevanssi sees this post".
*
* Takes in a post ID and returns the "How Relevanssi sees this post" data for
* that post.
*
* @param array $data The post ID in $data['id'].
*
* @return array The indexed terms for various parts of the post in an
* associative array.
*
* @uses relevanssi_fetch_sees_data()
*
* @since 2.5.0
*/
function relevanssi_sees_post_endpoint( $data ) {
return relevanssi_fetch_sees_data( $data['id'] );
}
/**
* Adds a REST API endpoint for listing the related posts.
*
* @param array $data The post ID in $data['id'].
*
* @return array The related posts in an array format (id, URL and title).
*
* @since 2.5.0
*/
function relevanssi_list_related_posts_endpoint( $data ) {
return relevanssi_generate_related_list( $data['id'], 'ARRAY' );
}
/**
* Adds a REST API endpoint for listing the excluded related posts.
*
* @param array $data The post ID in $data['id'].
*
* @return array The excluded posts in an array format (id, URL and title).
*
* @since 2.5.0
*/
function relevanssi_list_excluded_posts_endpoint( $data ) {
return relevanssi_generate_excluded_list( $data['id'], 'ARRAY' );
}
/**
* Adds a REST API endpoint for excluding a post from related posts.
*
* @param array $data The post ID in $data['post_id'], the ID of the post to
* exclude in $data['exclude'].
*
* @return array The excluded posts in an array format (id, URL and title).
*
* @since 2.5.0
*/
function relevanssi_exclude_related_post_endpoint( $data ) {
relevanssi_exclude_a_related_post( $data['post_id'], $data['exclude'] );
return relevanssi_generate_excluded_list( $data['post_id'], 'ARRAY' );
}
/**
* Adds a REST API endpoint for unexcluding a post from related posts.
*
* @param array $data The post ID in $data['post_id'], the ID of the post to
* return in $data['return'].
*
* @return array The excluded posts in an array format (id, URL and title).
*
* @since 2.5.0
*/
function relevanssi_unexclude_related_post_endpoint( $data ) {
relevanssi_unexclude_a_related_post( $data['post_id'], $data['return'] );
return relevanssi_generate_excluded_list( $data['post_id'], 'ARRAY' );
}
/**
* Adds a REST API endpoint for regenerating the related posts list.
*
* This is triggered when either the keywords or the post ID list for the
* related posts is changed. This will get the key and the value of the changed
* meta field as a parameter and will either empty or update the meta field and
* then trigger related posts list regeneration.
*
* @param array $data The post ID in $data['id'], the meta key name in
* $data['meta_key'] and the new value in $data['meta_value'].
*
* @return array The related posts in an array format (id, URL and title).
*
* @since 2.5.0
*/
function relevanssi_regenerate_related_endpoint( $data ) {
if ( 0 === $data['meta_value'] ) {
delete_post_meta( $data['id'], $data['meta_key'] );
} else {
update_post_meta( $data['id'], $data['meta_key'], $data['meta_value'] );
}
delete_post_meta( $data['id'], '_relevanssi_related_posts' );
return relevanssi_generate_related_list( $data['id'], 'ARRAY' );
}
/**
* Adds a REST API endpoint for listing common search terms.
*
* @param array $data The post ID in $data['id'].
*
* @return array The common terms in an array format (id, query, and count).
*
* @since 2.5.0
*/
function relevanssi_list_insights_common_terms( $data ) {
return relevanssi_generate_tracking_insights_most_common( $data['id'], 'ARRAY' );
}
/**
* Adds a REST API endpoint for listing low-ranking search terms.
*
* @param array $data The post ID in $data['id'].
*
* @return array The terms in an array format (id, query, rank).
*
* @since 2.5.0
*/
function relevanssi_list_insights_low_ranking_terms( $data ) {
return relevanssi_generate_tracking_insights_low_ranking( $data['id'], 'ARRAY' );
}
/**
* Registers the REST API endpoints.
*
* @see register_rest_route()
*
* @since 2.5.0
*/
function relevanssi_register_gutenberg_rest_routes() {
$routes = array(
array(
'path' => '/excluderelatedpost/(?P<exclude>\d+)/(?P<post_id>\d+)',
'callback' => 'relevanssi_exclude_related_post_endpoint',
'args' => array(
'exclude' => 'numeric',
'post_id' => 'numeric',
),
),
array(
'path' => '/unexcluderelatedpost/(?P<return>\d+)/(?P<post_id>\d+)',
'callback' => 'relevanssi_unexclude_related_post_endpoint',
'args' => array(
'return' => 'numeric',
'post_id' => 'numeric',
),
),
array(
'path' => '/listexcluded/(?P<id>\d+)',
'callback' => 'relevanssi_list_excluded_posts_endpoint',
'args' => array(
'id' => 'numeric',
),
),
array(
'path' => '/listrelated/(?P<id>\d+)',
'callback' => 'relevanssi_list_related_posts_endpoint',
'args' => array(
'id' => 'numeric',
),
),
array(
'path' => '/sees/(?P<id>\d+)',
'callback' => 'relevanssi_sees_post_endpoint',
'args' => array(
'id' => 'numeric',
),
),
array(
'path' => '/regeneraterelatedposts/(?P<id>\d+)/(?P<meta_key>\w+)/(?P<meta_value>[^/]+)',
'callback' => 'relevanssi_regenerate_related_endpoint',
'args' => array(
'id' => 'numeric',
'meta_key' => 'metakey',
'meta_value' => 'urldecode',
),
),
array(
'path' => '/listinsightscommon/(?P<id>\d+)',
'callback' => 'relevanssi_list_insights_common_terms',
'args' => array(
'id' => 'numeric',
),
),
array(
'path' => '/listinsightslowranking/(?P<id>\d+)',
'callback' => 'relevanssi_list_insights_low_ranking_terms',
'args' => array(
'id' => 'numeric',
),
),
);
foreach ( $routes as $route ) {
$args = array();
foreach ( $route['args'] as $name => $type ) {
switch ( $type ) {
case 'metakey':
$args[ $name ] = array(
'validate_callback' => function ( $param ) {
return in_array( $param, array( '_relevanssi_related_keywords', '_relevanssi_related_include_ids' ), true );
},
);
break;
case 'urldecode':
$args[ $name ] = array(
'sanitize_callback' => function ( $param ) {
return urldecode( $param );
},
);
break;
case 'numeric':
default:
$args[ $name ] = array(
'validate_callback' => function ( $param ) {
return is_numeric( $param );
},
);
}
}
register_rest_route(
'relevanssi/v1',
$route['path'],
array(
'methods' => 'GET',
'callback' => $route['callback'],
'args' => $args,
'permission_callback' => function () {
global $relevanssi_variables;
// Filter documented in /premium/gutenberg-sidebar.php.
return current_user_can( apply_filters( 'relevanssi_sidebar_capability', $relevanssi_variables['sidebar_capability'] ) );
},
)
);
}
}
/**
* Rename the Relevanssi Gutenberg sidebar translation file.
*
* WordPress assumes the file name is relevanssi-LOCALE-relevanssi-sidebar.json,
* but the file from TranslationsPress is relevanssi-LOCALE.json. We rename the
* file WP is looking for here.
*
* @param string $file The original file name.
* @param string $handle The script handle.
*
* @return string The corrected filename.
*/
function relevanssi_rename_translation_file( $file, $handle ) {
if ( 'relevanssi-sidebar' !== $handle ) {
return $file;
}
return str_replace( '-relevanssi-sidebar', '', $file );
}