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
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;
|
|
}
|
|
}
|