You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

316 lines
11 KiB
PHP

<?php
/**
* The Local_Seo Module
*
* @since 1.0.0
* @package RankMath
* @subpackage RankMathPro
* @author Rank Math <support@rankmath.com>
*/
namespace RankMathPro\Local_Seo;
use RankMath\Helper;
use RankMath\Traits\Hooker;
use RankMath\Sitemap\Cache_Watcher;
defined( 'ABSPATH' ) || exit;
/**
* Local_Seo class.
*/
class Local_Seo {
use Hooker;
/**
* Post Singular Name.
*
* @var string
*/
private $post_singular_name = 'Location';
/**
* Post Type.
*
* @var string
*/
private $post_type = 'rank_math_locations';
/**
* The Constructor.
*/
public function __construct() {
$this->action( 'init', 'init' );
$this->action( 'rank_math/schema/update', 'update_post_schema_info', 10, 2 );
$this->action( 'save_post', 'invalidate_cache' );
$this->filter( 'classic_editor_enabled_editors_for_post_type', 'force_block_editor', 20, 2 );
$this->filter( 'rank_math/sitemap/locations', 'add_kml_file' );
$this->filter( "manage_{$this->post_type}_posts_columns", 'posts_columns' );
$this->filter( "manage_{$this->post_type}_posts_custom_column", 'posts_custom_column', 10, 2 );
$this->filter( "bulk_actions-edit-{$this->post_type}", 'post_bulk_actions', 20 );
$this->includes();
}
/**
* Update post info for analytics.
*
* @param int $object_id Object ID.
* @param array $schemas Schema data.
* @param string $object_type Object type.
*/
public function update_post_schema_info( $object_id, $schemas, $object_type = 'post' ) {
if ( 'post' !== $object_type || 'rank_math_locations' !== get_post_type( $object_id ) ) {
return;
}
$schema = current( $schemas );
if ( ! isset( $schema['geo'], $schema['geo']['latitude'], $schema['geo']['longitude'] ) ) {
return;
}
update_post_meta( $object_id, 'rank_math_local_business_latitide', $schema['geo']['latitude'] );
update_post_meta( $object_id, 'rank_math_local_business_longitude', $schema['geo']['longitude'] );
}
/**
* Intialize.
*/
public function init() {
if ( ! Helper::get_settings( 'titles.use_multiple_locations', false ) ) {
return;
}
$this->post_singular_name = Helper::get_settings( 'titles.locations_post_type_label', 'Location' );
$this->register_location_post_type();
$this->register_location_taxonomy();
}
/**
* Filters the editors that are enabled for the post type.
*
* @param array $editors Associative array of the editors and whether they are enabled for the post type.
* @param string $post_type The post type.
*/
public function force_block_editor( $editors, $post_type ) {
if ( 'rank_math_locations' !== $post_type || ! $this->do_filter( 'schema/cpt_force_gutenberg', true ) ) {
return $editors;
}
$editors['classic_editor'] = false;
return $editors;
}
/**
* Add Locations KML file in the sitemap
*/
public function add_kml_file() {
return Helper::get_settings( 'sitemap.local_sitemap', true );
}
/**
* Include required files.
*/
private function includes() {
if ( is_admin() ) {
new Admin();
new RM_Pointers();
return;
}
if ( Helper::get_settings( 'titles.use_multiple_locations', false ) ) {
new Frontend();
new Location_Shortcode();
new KML_File();
}
}
/**
* Register Locations post type.
*/
private function register_location_post_type() {
$plural_label = Helper::get_settings( 'titles.locations_post_type_plural_label', 'RM Locations' );
$post_type_slug = Helper::get_settings( 'titles.locations_post_type_base', 'locations' );
$labels = [
'name' => $this->post_singular_name,
'singular_name' => $this->post_singular_name,
'menu_name' => $plural_label,
/* translators: Post Type Plural Name */
'all_items' => sprintf( esc_html__( 'All %s', 'rank-math-pro' ), $plural_label ),
/* translators: Post Type Singular Name */
'add_new_item' => sprintf( esc_html__( 'Add New %s', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'new_item' => sprintf( esc_html__( 'New %s', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'edit_item' => sprintf( esc_html__( 'Edit %s', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'update_item' => sprintf( esc_html__( 'Update %s', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'view_item' => sprintf( esc_html__( 'View %s', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Plural Name */
'view_items' => sprintf( esc_html__( 'View %s', 'rank-math-pro' ), $plural_label ),
/* translators: Post Type Singular Name */
'search_items' => sprintf( esc_html__( 'Search %s', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'not_found' => sprintf( esc_html__( 'No %s found.', 'rank-math-pro' ), $plural_label ),
/* translators: Post Type Singular Name */
'not_found_in_trash' => sprintf( esc_html__( 'No %s found in Trash.', 'rank-math-pro' ), $plural_label ),
/* translators: Post Type Singular Name */
'item_published' => sprintf( esc_html__( '%s published.', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'item_published_privately' => sprintf( esc_html__( '%s published privately.', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'item_reverted_to_draft' => sprintf( esc_html__( '%s reverted to draft.', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'item_scheduled' => sprintf( esc_html__( '%s scheduled.', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'item_updated' => sprintf( esc_html__( '%s updated.', 'rank-math-pro' ), $this->post_singular_name ),
];
$capability = 'rank_math_general';
$args = [
'label' => $this->post_singular_name,
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'hierarchical' => false,
'has_archive' => $post_type_slug,
'menu_icon' => 'dashicons-location',
'query_var' => true,
'show_in_rest' => true,
'rest_base' => 'rank-math-locations',
'supports' => [ 'title', 'editor', 'excerpt', 'author', 'thumbnail', 'revisions', 'custom-fields', 'page-attributes', 'publicize' ],
'rewrite' => [
'slug' => $post_type_slug,
'with_front' => $this->filter( 'locations/front', true ),
],
'capabilities' => [
'edit_post' => $capability,
'read_post' => $capability,
'delete_post' => $capability,
'edit_posts' => $capability,
'edit_others_posts' => $capability,
'publish_posts' => $capability,
'read_private_posts' => $capability,
'create_posts' => $capability,
],
];
register_post_type( $this->post_type, $args );
}
/**
* Register Locations Category taxonomy.
*/
private function register_location_taxonomy() {
$category_slug = esc_html( Helper::get_settings( 'titles.locations_category_base', 'locations-category' ) );
$labels = [
/* translators: Post Type Singular Name */
'name' => sprintf( esc_html__( '%s categories', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'singular_name' => sprintf( esc_html__( '%s category', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'all_items' => sprintf( esc_html__( 'All %s categories', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'edit_item' => sprintf( esc_html__( 'Edit %s category', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'update_item' => sprintf( esc_html__( 'Update %s category', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'add_new_item' => sprintf( esc_html__( 'Add New %s category', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'new_item_name' => sprintf( esc_html__( 'New %s category', 'rank-math-pro' ), $this->post_singular_name ),
/* translators: Post Type Singular Name */
'menu_name' => sprintf( esc_html__( '%s categories', 'rank-math-pro' ), $this->post_singular_name ),
'search_items' => esc_html__( 'Search categories', 'rank-math-pro' ),
'parent_item' => esc_html__( 'Parent Category', 'rank-math-pro' ),
'parent_item_colon' => esc_html__( 'Parent Category:', 'rank-math-pro' ),
];
$args = [
'hierarchical' => true,
'labels' => $labels,
'show_ui' => true,
'show_admin_column' => true,
'query_var' => true,
'show_in_rest' => true,
'rewrite' => [ 'slug' => $category_slug ],
];
register_taxonomy( 'rank_math_location_category', [ $this->post_type ], $args );
}
/**
* Check for relevant post type before invalidation.
*
* @param int $post_id Post ID to possibly invalidate for.
*/
public function invalidate_cache( $post_id ) {
if ( get_post_type( $post_id ) !== $this->post_type ) {
return false;
}
Cache_Watcher::clear( [ 'locations' ] );
}
/**
* Add custom columns for post type.
*
* @param array $columns Current columns.
*
* @return array
*/
public function posts_columns( $columns ) {
$columns['address'] = __( 'Address', 'rank-math-pro' );
$columns['telephone'] = __( 'Phone', 'rank-math-pro' );
return $columns;
}
/**
* Add the content in the custom columns.
*
* @param string $column Column name.
* @param int $post_id Post ID.
*
* @return void
*/
public function posts_custom_column( $column, $post_id ) {
$schemas = \RankMath\Schema\DB::get_schemas( $post_id );
if ( empty( $schemas ) ) {
return;
}
$schema = reset( $schemas );
if ( empty( $schema[ $column ] ) ) {
return;
}
switch ( $column ) {
case 'address':
unset( $schema['address']['@type'] );
echo esc_html( join( ' ', $schema['address'] ) );
break;
case 'telephone':
echo esc_html( $schema['telephone'] );
break;
}
}
/**
* Remove unneeded bulk actions.
*
* @param array $actions Actions.
* @return array New actions.
*/
public function post_bulk_actions( $actions ) {
unset( $actions['rank_math_bulk_schema_none'], $actions['rank_math_bulk_schema_default'] );
return $actions;
}
}