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.
120 lines
3.5 KiB
PHTML
120 lines
3.5 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* The Map shortcode Class.
|
||
|
*
|
||
|
* @since 1.0.1
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMathPro
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMathPro\Local_Seo;
|
||
|
|
||
|
use RankMath\Schema\DB;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Map class.
|
||
|
*/
|
||
|
class Map {
|
||
|
|
||
|
/**
|
||
|
* Shortcode Instance.
|
||
|
*
|
||
|
* @var Location_Shortcode
|
||
|
*/
|
||
|
public $shortcode;
|
||
|
|
||
|
/**
|
||
|
* Get Address Data.
|
||
|
*
|
||
|
* @param Location_Shortcode $shortcode Location_Shortcode Instance.
|
||
|
* @param array $locations Locations data.
|
||
|
* @return string
|
||
|
*/
|
||
|
public function get_data( $shortcode, $locations ) {
|
||
|
$this->shortcode = $shortcode;
|
||
|
$atts = $shortcode->atts;
|
||
|
|
||
|
$options = [
|
||
|
'map_style' => $atts['map_style'],
|
||
|
'allow_zoom' => $atts['allow_zoom'],
|
||
|
'zoom_level' => $atts['zoom_level'],
|
||
|
'allow_dragging' => $atts['allow_dragging'],
|
||
|
'show_clustering' => $atts['show_marker_clustering'],
|
||
|
'show_infowindow' => $atts['show_infowindow'],
|
||
|
];
|
||
|
|
||
|
$terms_data = [];
|
||
|
foreach ( $locations as $location ) {
|
||
|
$schema = DB::get_schemas( $location->ID );
|
||
|
if ( empty( $schema ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$schema = current( $shortcode->replace_variables( $schema ) );
|
||
|
|
||
|
if ( empty( $schema['geo']['latitude'] ) || empty( $schema['geo']['longitude'] ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$options['locations'][ $location->ID ] = [
|
||
|
'content' => $this->get_infobox_content( $location->ID, $schema ),
|
||
|
'lat' => $schema['geo']['latitude'],
|
||
|
'lng' => $schema['geo']['longitude'],
|
||
|
];
|
||
|
|
||
|
if ( ! empty( $atts['show_category_filter'] ) && 'map' === $atts['type'] ) {
|
||
|
$terms = get_the_terms( $location->ID, 'rank_math_location_category' );
|
||
|
if ( ! is_wp_error( $terms ) && ! empty( $terms ) ) {
|
||
|
$terms_data = array_merge( $terms_data, $terms );
|
||
|
|
||
|
$options['locations'][ $location->ID ]['terms'] = wp_list_pluck( $terms, 'term_id' );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( empty( $options['locations'] ) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
wp_enqueue_script( 'rank-math-local' );
|
||
|
|
||
|
$width = ! empty( $atts['map_width'] ) ? $atts['map_width'] : '100%';
|
||
|
$height = ! empty( $atts['map_height'] ) ? $atts['map_height'] : '500px';
|
||
|
$style = sprintf( 'style="width: %s; height: %s"', $width, $height );
|
||
|
ob_start();
|
||
|
?>
|
||
|
<div class="rank-math-local-map-wrapper">
|
||
|
<div class="rank-math-local-map" data-map-options="<?php echo esc_attr( wp_json_encode( $options ) ); ?>" <?php printf( 'style="width: %s; height: %s"', esc_attr( $width ), esc_attr( $height ) ); ?>></div>
|
||
|
<?php
|
||
|
if ( ! empty( $terms_data ) ) {
|
||
|
echo '<select id="rank-math-select-category">';
|
||
|
echo '<option value="">' . esc_html__( 'Select Category', 'rank-math-pro' ) . '</option>';
|
||
|
foreach ( $terms_data as $term ) {
|
||
|
echo '<option value="' . esc_attr( $term->term_id ) . '">' . esc_html( $term->name ) . '</option>';
|
||
|
}
|
||
|
echo '</select>';
|
||
|
}
|
||
|
?>
|
||
|
</div>
|
||
|
<?php
|
||
|
return ob_get_clean();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get Infobox Content.
|
||
|
*
|
||
|
* @param int $location_id The Location ID.
|
||
|
* @param array $schema Schema Data.
|
||
|
* @return string
|
||
|
*/
|
||
|
public function get_infobox_content( $location_id, $schema ) {
|
||
|
return '<div class="rank-math-infobox-wrapper">
|
||
|
<h5><a href="' . esc_url( get_the_permalink( $location_id ) ) . '">' . esc_html( get_the_title( $location_id ) ) . '</a></h5>
|
||
|
<p>' . $this->shortcode->address->get_data( $this->shortcode, $schema ) . '</p>
|
||
|
</div>';
|
||
|
}
|
||
|
}
|