resolve some errors in php logic, like strlen with str containing space that is interpreted as array instead of string
This commit is contained in:
BIN
plug/map_prof.zip
Normal file
BIN
plug/map_prof.zip
Normal file
Binary file not shown.
BIN
plug/map_prof/images/marker.png
Normal file
BIN
plug/map_prof/images/marker.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 13 KiB |
BIN
plug/map_prof/images/marker_cluster.png
Normal file
BIN
plug/map_prof/images/marker_cluster.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
147
plug/map_prof/map_prof_hooks.php
Normal file
147
plug/map_prof/map_prof_hooks.php
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
Plugin Name: map_prof
|
||||||
|
Plugin URI:
|
||||||
|
Description: add/remove locations on map at publication/deletion of posts
|
||||||
|
Author: hugogogo
|
||||||
|
Version: 1.2.0
|
||||||
|
Author URI:
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* inclusions :
|
||||||
|
*/
|
||||||
|
|
||||||
|
include_once(dirname(__FILE__) . '/utils/mp_console_log.php');
|
||||||
|
include_once(dirname(__FILE__) . '/utils/mp_get_ip.php');
|
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . '/mp_enqueue.php');
|
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . '/settings/mp_required.php');
|
||||||
|
require_once(dirname(__FILE__) . '/settings/mp_optionnals.php');
|
||||||
|
require_once(dirname(__FILE__) . '/settings/mp_globals.php');
|
||||||
|
require_once(dirname(__FILE__) . '/settings/mp_url_api.php');
|
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/errors/mp_address_errors.php');
|
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/map/mp_add_to_scripts.php');
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/map/mp_create_div.php');
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/map/mp_get_events.php');
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/map/mp_get_filters.php');
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/map/mp_get_locations.php');
|
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/map_posts/mp_post_events_pages.php');
|
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/publish/mp_get_coordinates.php');
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/publish/mp_update_publish.php');
|
||||||
|
|
||||||
|
require_once(dirname(__FILE__) . '/srcs/menu/mp_menu_content.php');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* when 'shortcode' found in page, enqueue scripts and styles,
|
||||||
|
* run php script, and replace shortcode by return value
|
||||||
|
*/
|
||||||
|
|
||||||
|
function mp_ljdp_map() {
|
||||||
|
|
||||||
|
mp_enqueue_scripts_and_styles();
|
||||||
|
|
||||||
|
$events = mp_get_published_events(); // mp_get_events.php
|
||||||
|
//mp_console_log("events :");
|
||||||
|
//mp_console_log($events);
|
||||||
|
//foreach ($events as $event)
|
||||||
|
// mp_console_log($event);
|
||||||
|
|
||||||
|
$locations = mp_sort_events($events); // mp_get_locations.php
|
||||||
|
|
||||||
|
$filters = mp_get_filters($events); // mp_get_filters.php
|
||||||
|
|
||||||
|
// if post event instead of map page, change coordinate and zoom
|
||||||
|
mp_post_event_pages_setting();
|
||||||
|
|
||||||
|
mp_add_to_scripts(array(
|
||||||
|
"locations" => $locations,
|
||||||
|
"filters" => $filters,
|
||||||
|
));
|
||||||
|
|
||||||
|
return mp_create_div($filters);
|
||||||
|
}
|
||||||
|
add_shortcode('lejourduprof_map', 'mp_ljdp_map');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* re-publish posts
|
||||||
|
*/
|
||||||
|
|
||||||
|
// function mp_add_update_button() {
|
||||||
|
// return mp_create_republish_button();
|
||||||
|
// }
|
||||||
|
// add_shortcode('ljdp_update_publish', 'mp_add_update_button');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* errors map
|
||||||
|
*/
|
||||||
|
|
||||||
|
function mp_errors_map() {
|
||||||
|
return mp_find_address_errors();
|
||||||
|
}
|
||||||
|
add_shortcode('ljdp_errors_map', 'mp_errors_map');
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* when a post is saved or published or updated,
|
||||||
|
* find its coordinates
|
||||||
|
*/
|
||||||
|
|
||||||
|
function post_published_coordinates($id, $post) {
|
||||||
|
|
||||||
|
$location = mp_get_coordinates($id);
|
||||||
|
//mp_console_log("location: ");
|
||||||
|
//mp_console_log($location);
|
||||||
|
|
||||||
|
if ( ! add_post_meta( $id, 'location', $location, true ) )
|
||||||
|
update_post_meta( $id, 'location', $location );
|
||||||
|
|
||||||
|
}
|
||||||
|
add_action( 'publish_post', 'post_published_coordinates', 10, 2 );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* menu plugin
|
||||||
|
*/
|
||||||
|
|
||||||
|
function ljdp_map_menu() {
|
||||||
|
add_menu_page(
|
||||||
|
'JIPF map', // page_title
|
||||||
|
'JIPF map', // menu_title
|
||||||
|
'manage_options', // capability
|
||||||
|
'ljdp-map-plugin', // menu_slug
|
||||||
|
'ljdp_map_plugin_content' // callback function to display page content
|
||||||
|
);
|
||||||
|
}
|
||||||
|
add_action('admin_menu', 'ljdp_map_menu');
|
||||||
|
|
||||||
|
?>
|
||||||
26
plug/map_prof/mp_enqueue.php
Normal file
26
plug/map_prof/mp_enqueue.php
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_enqueue_scripts_and_styles() {
|
||||||
|
|
||||||
|
// https://developers.google.com/maps/documentation/javascript/marker-clustering
|
||||||
|
$marker_clusterer = "https://unpkg.com/@googlemaps/markerclusterer/dist/index.min.js";
|
||||||
|
|
||||||
|
wp_enqueue_style('mp__style', plugins_url('styles/mp__style.css' , __FILE__), '', '', false);
|
||||||
|
|
||||||
|
// enqueue header
|
||||||
|
wp_enqueue_script('mp_info_window', plugins_url('scripts/mp_info_window.js' , __FILE__), '', '', false);
|
||||||
|
wp_enqueue_script('mp_errors_map', plugins_url('scripts/mp_errors_map.js' , __FILE__), '', '', false);
|
||||||
|
wp_enqueue_script('mp_create_filters', plugins_url('scripts/mp_create_filters.js' , __FILE__), '', '', false);
|
||||||
|
wp_enqueue_script('mp_create_markers', plugins_url('scripts/mp_create_markers.js' , __FILE__), '', '', false);
|
||||||
|
wp_enqueue_script('mp_create_map', plugins_url('scripts/mp_create_map.js' , __FILE__), '', '', false);
|
||||||
|
wp_enqueue_script('mp_draw_clusters', plugins_url('scripts/mp_draw_clusters.js' , __FILE__), '', '', false);
|
||||||
|
wp_enqueue_script('mp_filter_events', plugins_url('scripts/mp_filter_events.js' , __FILE__), '', '', false);
|
||||||
|
|
||||||
|
// enqueue footer
|
||||||
|
wp_enqueue_script('mp_marker_clusterer', $marker_clusterer, '', '', true);
|
||||||
|
wp_enqueue_script('mp_init_map', plugins_url('scripts/mp_init_map.js' , __FILE__), ['mp_marker_clusterer'],'', true);
|
||||||
|
wp_enqueue_script('mp_google_api', mp_url_api(), ['mp_init_map'], '', true);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
103
plug/map_prof/scripts/mp_create_filters.js
Normal file
103
plug/map_prof/scripts/mp_create_filters.js
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
function fill_filters(filters_div) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* following variable are created by mp_add_to_script.php
|
||||||
|
*
|
||||||
|
* { }
|
||||||
|
* { [ ] }
|
||||||
|
* - filters: { - pays : [ { - _name : "" } ] }
|
||||||
|
* { [ { - villes : [] } ] }
|
||||||
|
* { [ { - categories: [] } ] }
|
||||||
|
* { [ { - mode : [] }, ...] }
|
||||||
|
* { [ ] }
|
||||||
|
* { }
|
||||||
|
* { [ ] }
|
||||||
|
* { - villes : [ { - _name : "" } ] }
|
||||||
|
* { [ { - pays : [] } ] }
|
||||||
|
* { [ { - categories: [] } ] }
|
||||||
|
* { [ { - mode : [] }, ...] }
|
||||||
|
* { [ ] }
|
||||||
|
* { }
|
||||||
|
* { [ ] }
|
||||||
|
* { - categories: [ { - _name : "" } ] }
|
||||||
|
* { [ { - pays : [] } ] }
|
||||||
|
* { [ { - villes : [] } ] }
|
||||||
|
* { [ { - mode : [] }, ...] }
|
||||||
|
* { [ ] }
|
||||||
|
* { }
|
||||||
|
* { }
|
||||||
|
* { [ ] }
|
||||||
|
* { - mode : [ { - _name : "" } ] }
|
||||||
|
* { [ { - pays : [] } ] }
|
||||||
|
* { [ { - villes : [] } ] }
|
||||||
|
* { [ { - categories: [] }, ...] }
|
||||||
|
* { [ ] }
|
||||||
|
* { }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
let content = "";
|
||||||
|
// use Object.keys to obtain an array of object keys
|
||||||
|
let keys = Object.keys(filters);
|
||||||
|
keys.forEach((key) => {
|
||||||
|
|
||||||
|
// // version input checkbox
|
||||||
|
//
|
||||||
|
// content += `
|
||||||
|
// <div class="filter_menu">
|
||||||
|
// <input id="filter_menu_title_${key}" class="filter_menu_title" type="checkbox" />
|
||||||
|
// <label for="filter_menu_title_${key}" class="filter_menu_title">
|
||||||
|
// <p>${key}</p>
|
||||||
|
// </label>
|
||||||
|
// <div class="filter_menu_drop">
|
||||||
|
// `;
|
||||||
|
// for (value of filters[key]) {
|
||||||
|
// content += `
|
||||||
|
// <p>${value._name}</p>
|
||||||
|
// `;
|
||||||
|
// }
|
||||||
|
// content += `
|
||||||
|
// </div>
|
||||||
|
// </div>
|
||||||
|
// `;
|
||||||
|
|
||||||
|
// // version select
|
||||||
|
//
|
||||||
|
// content += `
|
||||||
|
// <div class="filter_menu">
|
||||||
|
// <select id="filter_menu_drop_${key}" class="filter_menu_drop" name="${key}">
|
||||||
|
// `;
|
||||||
|
// for (value of filters[key]) {
|
||||||
|
// content += `
|
||||||
|
// <option value="${value._name}"><p>${value._name}</p></option>
|
||||||
|
// `;
|
||||||
|
// }
|
||||||
|
// content += `
|
||||||
|
// </select>
|
||||||
|
// </div>
|
||||||
|
// `;
|
||||||
|
|
||||||
|
// // version div
|
||||||
|
//
|
||||||
|
content += `
|
||||||
|
<div class="filter_menu">
|
||||||
|
<div class="filter_menu_title" tabindex=0>
|
||||||
|
<p>${key}</p>
|
||||||
|
</div>
|
||||||
|
<div class="filter_menu_drop" tabindex=0>
|
||||||
|
<p>PAS DE FILTRE</p>
|
||||||
|
`;
|
||||||
|
for (value of filters[key]) {
|
||||||
|
content += `
|
||||||
|
<p>${value._name}</p>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
content += `
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
filters_div.innerHTML = content;
|
||||||
|
}
|
||||||
41
plug/map_prof/scripts/mp_create_map.js
Normal file
41
plug/map_prof/scripts/mp_create_map.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
|
||||||
|
function restrict_map(restrict) {
|
||||||
|
let map_restriction = {
|
||||||
|
latLngBounds: g_world_bound,
|
||||||
|
strictBounds: true,
|
||||||
|
};
|
||||||
|
if (restrict)
|
||||||
|
g_map.setOptions({restriction: map_restriction,});
|
||||||
|
else
|
||||||
|
g_map.setOptions({restriction: null,});
|
||||||
|
};
|
||||||
|
|
||||||
|
function create_map(map_div) {
|
||||||
|
// default map center to france
|
||||||
|
let map_center = coordinates_default;
|
||||||
|
// map_center = {lat:-2.515748362923059, lng:32.93366215464864};
|
||||||
|
let map_restriction = {
|
||||||
|
latLngBounds: g_world_bound,
|
||||||
|
strictBounds: true,
|
||||||
|
};
|
||||||
|
let map_options = {
|
||||||
|
/* map options : https://developers.google.com/maps/documentation/javascript/reference/map#MapOptions */
|
||||||
|
disableDefaultUI: true,
|
||||||
|
zoomControl: true,
|
||||||
|
scaleControl: true,
|
||||||
|
zoom: map_zoom,
|
||||||
|
|
||||||
|
//gestureHandling: "cooperative",
|
||||||
|
gestureHandling: "greedy",
|
||||||
|
//gestureHandling: "none",
|
||||||
|
//gestureHandling: "auto",
|
||||||
|
|
||||||
|
//disableDoubleClickZoom: "false", // deprecated
|
||||||
|
//draggable: "true", // deprecated
|
||||||
|
|
||||||
|
center: map_center,
|
||||||
|
restriction: map_restriction,
|
||||||
|
}
|
||||||
|
|
||||||
|
return new google.maps.Map(map_div, map_options);
|
||||||
|
}
|
||||||
57
plug/map_prof/scripts/mp_create_markers.js
Normal file
57
plug/map_prof/scripts/mp_create_markers.js
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
function create_markers(map, locations, infowindow) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* following variable are created by mp_add_to_script.php
|
||||||
|
* - let icon_color = ""
|
||||||
|
* - let icon_color_back = ""
|
||||||
|
* - let icon_size = [x, y]
|
||||||
|
* - let cluster_size_factor = Number
|
||||||
|
* - let icon_stroke_width = Number
|
||||||
|
*/
|
||||||
|
|
||||||
|
let icon_circle_radius = 40 - icon_stroke_width / 2;
|
||||||
|
|
||||||
|
let markers = [];
|
||||||
|
for (loc of locations) {
|
||||||
|
|
||||||
|
if (loc.coordinates == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
let count = loc.events.length;
|
||||||
|
|
||||||
|
let marker_icon_size = [
|
||||||
|
icon_size[0] + ( icon_size_factor * (count - 2) ),
|
||||||
|
icon_size[1] + ( icon_size_factor * (count - 2) )
|
||||||
|
];
|
||||||
|
let svg_icon = window.btoa(`
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="${marker_icon_size[0]}" height="${marker_icon_size[1]}">
|
||||||
|
<circle cx="50%" cy="50%" r="${icon_circle_radius}%" stroke="${icon_color}" stroke-width="${icon_stroke_width}" fill="${icon_color_back}" />
|
||||||
|
</svg>
|
||||||
|
`);
|
||||||
|
let icon_options = {
|
||||||
|
url: `data:image/svg+xml;base64,${svg_icon}`,
|
||||||
|
scaledSize: new google.maps.Size(marker_icon_size[0], marker_icon_size[1]),
|
||||||
|
};
|
||||||
|
let marker_label = {
|
||||||
|
text: String(count),
|
||||||
|
color: icon_color,
|
||||||
|
fontSize: "12px",
|
||||||
|
fontWeight: "bold",
|
||||||
|
};
|
||||||
|
let marker_title = `address of ${count} events`;
|
||||||
|
|
||||||
|
let marker = new google.maps.Marker({
|
||||||
|
position: loc.coordinates,
|
||||||
|
map: map,
|
||||||
|
icon: icon_options,
|
||||||
|
title: marker_title,
|
||||||
|
label: marker_label,
|
||||||
|
});
|
||||||
|
|
||||||
|
attach_info_window(map, marker, loc.events, infowindow);
|
||||||
|
|
||||||
|
markers.push(marker);
|
||||||
|
};
|
||||||
|
|
||||||
|
return markers;
|
||||||
|
}
|
||||||
58
plug/map_prof/scripts/mp_draw_clusters.js
Normal file
58
plug/map_prof/scripts/mp_draw_clusters.js
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
function draw_clusters(map, markers) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* following variable are created by mp_add_to_script.php
|
||||||
|
* - let icon_color = ""
|
||||||
|
* - let icon_color_back = ""
|
||||||
|
* - let icon_size = [x, y]
|
||||||
|
* - let icon_size_factor = Number
|
||||||
|
* - let icon_stroke_width = Number
|
||||||
|
*/
|
||||||
|
|
||||||
|
let icon_circle_radius = 40 - icon_stroke_width / 2;
|
||||||
|
|
||||||
|
let renderer = {
|
||||||
|
render({ count, position }, stats) {
|
||||||
|
|
||||||
|
/* CLUSTERS SETTINGS */
|
||||||
|
|
||||||
|
let marker_icon_size = [
|
||||||
|
icon_size[0] + ( icon_size_factor * (count - 2) ),
|
||||||
|
icon_size[1] + ( icon_size_factor * (count - 2) )
|
||||||
|
];
|
||||||
|
let cluster_svg = window.btoa(`
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="${marker_icon_size[0]}" height="${marker_icon_size[1]}">
|
||||||
|
<circle cx="50%" cy="50%" r="${icon_circle_radius}%" stroke="${icon_color}" stroke-width="${icon_stroke_width}" fill="${icon_color_back}" />
|
||||||
|
</svg>
|
||||||
|
`);
|
||||||
|
let cluster_icon = {
|
||||||
|
url: `data:image/svg+xml;base64,${cluster_svg}`,
|
||||||
|
scaledSize: new google.maps.Size(marker_icon_size[0], marker_icon_size[1]),
|
||||||
|
};
|
||||||
|
let cluster_label = {
|
||||||
|
text: String(count),
|
||||||
|
color: icon_color,
|
||||||
|
fontSize: "12px",
|
||||||
|
fontWeight: "bold",
|
||||||
|
};
|
||||||
|
let cluster_title = `Cluster of ${count} markers`;
|
||||||
|
let cluster_zIndex = Number(google.maps.Marker.MAX_ZINDEX) + count;
|
||||||
|
|
||||||
|
return new google.maps.Marker({
|
||||||
|
position,
|
||||||
|
icon: cluster_icon,
|
||||||
|
label: cluster_label,
|
||||||
|
title: cluster_title,
|
||||||
|
zIndex: cluster_zIndex,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let onClusterClick = (_, cluster, map) => {
|
||||||
|
restrict_map(false);
|
||||||
|
map.fitBounds(cluster.bounds);
|
||||||
|
restrict_map(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
return new markerClusterer.MarkerClusterer({ map, markers, renderer, onClusterClick });
|
||||||
|
}
|
||||||
7
plug/map_prof/scripts/mp_errors_map.js
Normal file
7
plug/map_prof/scripts/mp_errors_map.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
function print_error(error) {
|
||||||
|
let div_map = document.getElementById("ljdp_map");
|
||||||
|
let p_err = document.createElement('p');
|
||||||
|
|
||||||
|
p_err.textContent = error;
|
||||||
|
div_map.after(p_err);
|
||||||
|
}
|
||||||
278
plug/map_prof/scripts/mp_filter_events.js
Normal file
278
plug/map_prof/scripts/mp_filter_events.js
Normal file
@@ -0,0 +1,278 @@
|
|||||||
|
|
||||||
|
// https://googlemaps.github.io/js-markerclusterer/classes/MarkerClusterer.html
|
||||||
|
// add true for noDraw
|
||||||
|
// bounds : https://stackoverflow.com/questions/19304574/center-set-zoom-of-map-to-cover-all-visible-markers/19304625#19304625
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function array_first_not_in_second(first, second) {
|
||||||
|
let temp_array = [];
|
||||||
|
for (let index of first) {
|
||||||
|
if (second.indexOf(index) == -1) {
|
||||||
|
temp_array.push(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return temp_array;
|
||||||
|
}
|
||||||
|
|
||||||
|
function filter_selection_indexes(menu, indexes, reverse, add) {
|
||||||
|
|
||||||
|
if (indexes.length === 0) {
|
||||||
|
// if array of index is empty, delete menu
|
||||||
|
delete g_indexes[menu];
|
||||||
|
}
|
||||||
|
else if (reverse) {
|
||||||
|
// if reverse is true, delete all indexes in g_indexes.menu
|
||||||
|
// https://stackoverflow.com/questions/5113374/javascript-check-if-variable-exists-is-defined-initialized
|
||||||
|
if ( typeof(g_indexes[menu]) !== "undefined" && g_indexes[menu] !== null ) {
|
||||||
|
// creates an array with all values of g_indexes[menu] minus indexes
|
||||||
|
let temp_array = array_first_not_in_second(g_indexes[menu], indexes);
|
||||||
|
if (temp_array.length === 0)
|
||||||
|
delete g_indexes[menu];
|
||||||
|
else
|
||||||
|
g_indexes[menu] = [].concat(temp_array);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (add && typeof(g_indexes[menu]) !== "undefined") {
|
||||||
|
// add array of menus to g_indexes{}
|
||||||
|
// creates an array with all values of indexes that are not in g_indexes[menu] already
|
||||||
|
let temp_array = array_first_not_in_second(indexes, g_indexes[menu]);
|
||||||
|
g_indexes[menu] = g_indexes[menu].concat(temp_array);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// replace or create array of menu in g_indexes{}
|
||||||
|
g_indexes[menu] = [].concat(indexes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// loop through all arrays of g_indexes to find intersection
|
||||||
|
// take first one as comparison
|
||||||
|
let keys = Object.keys(g_indexes);
|
||||||
|
let intersection = [];
|
||||||
|
let compare = [];
|
||||||
|
keys.forEach((key, i) => {
|
||||||
|
if (i == 0) {
|
||||||
|
intersection = g_indexes[key];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let temp = [];
|
||||||
|
compare = g_indexes[key];
|
||||||
|
for (let index of intersection) {
|
||||||
|
if (compare.indexOf(index) != -1)
|
||||||
|
temp.push(index);
|
||||||
|
}
|
||||||
|
intersection = [].concat(temp);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return intersection;
|
||||||
|
}
|
||||||
|
|
||||||
|
function redraw_clusters(indexes) {
|
||||||
|
|
||||||
|
let indexes_count = indexes.length;
|
||||||
|
|
||||||
|
if (indexes_count !== 0) {
|
||||||
|
// if index array, hide all other markers, and if zoomin, zoom to new markers
|
||||||
|
g_marker_cluster.clearMarkers(true);
|
||||||
|
|
||||||
|
let marker = g_markers[0];
|
||||||
|
let current_bounds = g_map.getBounds();
|
||||||
|
let bounds = new google.maps.LatLngBounds();
|
||||||
|
|
||||||
|
let outside_bounds = false;
|
||||||
|
for (let index of indexes) {
|
||||||
|
marker = g_markers[index];
|
||||||
|
position = marker.getPosition();
|
||||||
|
if (! current_bounds.contains(position))
|
||||||
|
outside_bounds = true;
|
||||||
|
bounds.extend(position);
|
||||||
|
|
||||||
|
g_marker_cluster.addMarker(marker, true);
|
||||||
|
}
|
||||||
|
if (outside_bounds) {
|
||||||
|
if (indexes_count === 1) {
|
||||||
|
g_map.setCenter(position);
|
||||||
|
g_map.setZoom(max_zoom);
|
||||||
|
}
|
||||||
|
else if (indexes_count > 1) {
|
||||||
|
g_map.fitBounds(bounds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if ( Object.keys(g_indexes).length === 0 ) {
|
||||||
|
// object is empty, there are no filters
|
||||||
|
g_map.setCenter(coordinates_default);
|
||||||
|
g_map.setZoom(2);
|
||||||
|
g_marker_cluster.addMarkers(g_markers, true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// filters intersection lets no markers on the map
|
||||||
|
g_marker_cluster.clearMarkers(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_marker_cluster.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
function html_item(menu_name, menu_item) {
|
||||||
|
let item = menu_item.replace(/ /g, "_");
|
||||||
|
let html_id = `filter_${menu_name}_${item}`;
|
||||||
|
return document.getElementById(html_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toggle_menu_items(menu_name, x_abled) {
|
||||||
|
|
||||||
|
let name = menu_name.replace(/ /g, "_");
|
||||||
|
let class_name = `filter_menu_${name}`;
|
||||||
|
let items = document.getElementsByClassName(class_name);
|
||||||
|
|
||||||
|
if (x_abled === "disable") {
|
||||||
|
for (let item of items) {
|
||||||
|
// if item is a menu title (like 'categorie' or 'pays')
|
||||||
|
// don't remove 'enable', instead add it, because it's not in the list of 'to_enable'
|
||||||
|
if (item.selected) {
|
||||||
|
item.classList.add('enable');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item.classList.remove('enable');
|
||||||
|
}
|
||||||
|
if (item.classList.contains('to_enable')) {
|
||||||
|
item.classList.replace('to_enable', 'enable');
|
||||||
|
item.removeAttribute('disabled');
|
||||||
|
}
|
||||||
|
else if (! item.selected)
|
||||||
|
item.setAttribute('disabled', '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (let item of items) {
|
||||||
|
item.classList.remove('enable');
|
||||||
|
item.removeAttribute('disabled');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function disable_menus(menu_name_ori, menu_item_ori, reverse, menu_index) {
|
||||||
|
|
||||||
|
let menu_item_name = "";
|
||||||
|
if (menu_item_ori == null) // it's a menu name
|
||||||
|
menu_item_name = menu_name_ori;
|
||||||
|
else
|
||||||
|
menu_item_name = menu_item_ori._name;
|
||||||
|
let item_ori_html = html_item(menu_name_ori, menu_item_name);
|
||||||
|
let is_enabled = item_ori_html.classList.contains('enable');
|
||||||
|
|
||||||
|
// in case it's a menu title, like "Pays" or "Categories",
|
||||||
|
// and it does'nt contains 'enable'
|
||||||
|
// just act like Reset button
|
||||||
|
// it's too bad it will also go through this menu items even though it's unnecessary
|
||||||
|
if (menu_index == 'menu_name') { // it's a menu name
|
||||||
|
if (! is_enabled) {
|
||||||
|
// "item" as a menu name will select all items in all menus
|
||||||
|
toggle_menu_items("item", "enable");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if it's Mode menu,
|
||||||
|
// and it was the first selection, meaning it does'nt contains 'enable'
|
||||||
|
// and both (irl and online) are abled or disabled,
|
||||||
|
// just act like Reset button
|
||||||
|
// it's too bas it will also go through this menu items even though it's unnecessary
|
||||||
|
if (menu_name_ori === "mode") {
|
||||||
|
let mode_menus = document.getElementsByClassName("filter_menu_mode");
|
||||||
|
let state = 0;
|
||||||
|
for (let mode_menu of mode_menus) {
|
||||||
|
if (mode_menu.checked)
|
||||||
|
state++;
|
||||||
|
else
|
||||||
|
state--;
|
||||||
|
}
|
||||||
|
if (state != 0) { // state equal 0 if both have a different state, because (0 + 1 - 1 = 0) and (0 - 1 + 1 = 0)
|
||||||
|
if (! is_enabled) {
|
||||||
|
// "item" as a menu name will select all items in all menus
|
||||||
|
toggle_menu_items("item", "enable");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (reverse) { // menu is "mode" and only one item is selected and the action was to deselect one, so the action has trigered one item but really we want to see the options of the other item, so let's switch them
|
||||||
|
if (menu_index == 0)
|
||||||
|
menu_index++;
|
||||||
|
else
|
||||||
|
menu_index--;
|
||||||
|
menu_item_ori = filters[menu_name_ori][menu_index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let keys = Object.keys(menu_item_ori);
|
||||||
|
// loop through list of other menu_items available for this menu_item
|
||||||
|
// loop though menu names (pays, categories, mode)
|
||||||
|
for (let menu_name of keys) {
|
||||||
|
if (menu_name === "_name")
|
||||||
|
continue;
|
||||||
|
if (menu_name === "indexes")
|
||||||
|
continue;
|
||||||
|
else if (! is_enabled) {
|
||||||
|
|
||||||
|
// // it's too bad it will disable all and then enable certains, it would be better to check each time
|
||||||
|
// toggle_menu_items(menu_name, "disable");
|
||||||
|
// // loop through items in menu names (ex. for "pays" : france, chili, cuba)
|
||||||
|
// for (let item of menu_item_ori[menu_name]) {
|
||||||
|
// let item_html = html_item(menu_name, item);
|
||||||
|
// item_html.classList.add('enable');
|
||||||
|
// item_html.removeAttribute('disabled');
|
||||||
|
// }
|
||||||
|
|
||||||
|
for (let item of menu_item_ori[menu_name]) {
|
||||||
|
let item_html = html_item(menu_name, item);
|
||||||
|
item_html.classList.add('to_enable');
|
||||||
|
}
|
||||||
|
toggle_menu_items(menu_name, "disable");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function filter_show_only(element, menu_name) {
|
||||||
|
|
||||||
|
g_infowindow.close();
|
||||||
|
|
||||||
|
let menu_index = element.getAttribute("data-menu_index");
|
||||||
|
let menu_item = null;
|
||||||
|
let indexes = [];
|
||||||
|
if (menu_index != "menu_name") {
|
||||||
|
menu_item = filters[menu_name][menu_index];
|
||||||
|
indexes = menu_item.indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
add = false;
|
||||||
|
reverse = false;
|
||||||
|
if (element.type === "checkbox") {
|
||||||
|
reverse = ! element.checked;
|
||||||
|
add = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
disable_menus(menu_name, menu_item, reverse, menu_index);
|
||||||
|
|
||||||
|
let index_array = filter_selection_indexes(menu_name, indexes, reverse, add);
|
||||||
|
|
||||||
|
redraw_clusters(index_array);
|
||||||
|
}
|
||||||
|
|
||||||
|
function filter_show_all() {
|
||||||
|
|
||||||
|
g_infowindow.close();
|
||||||
|
|
||||||
|
// "item" as a menu name will select all items in all menus
|
||||||
|
toggle_menu_items("item", "enable");
|
||||||
|
|
||||||
|
g_indexes = {};
|
||||||
|
g_marker_cluster.clearMarkers(true);
|
||||||
|
g_marker_cluster.addMarkers(g_markers);
|
||||||
|
/* dont use fitBounds because it's not well centered */
|
||||||
|
/* instead use setCenter and setZoom */
|
||||||
|
//g_map.fitBounds(g__init_bounds);
|
||||||
|
g_map.setCenter(coordinates_default);
|
||||||
|
g_map.setZoom(2);
|
||||||
|
}
|
||||||
|
|
||||||
82
plug/map_prof/scripts/mp_info_window.js
Normal file
82
plug/map_prof/scripts/mp_info_window.js
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
|
||||||
|
function attach_info_window(map, marker, events, infowindow) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* https://developers.google.com/maps/documentation/javascript/infowindows
|
||||||
|
* https://stackoverflow.com/questions/11106671/google-maps-api-multiple-markers-with-infowindows
|
||||||
|
*/
|
||||||
|
|
||||||
|
let window_content = `
|
||||||
|
<div id="infowindow_limits">
|
||||||
|
<div class="infowindow">
|
||||||
|
<div class="infowindow_head">
|
||||||
|
<p>${events[0].location.address}</p>
|
||||||
|
<div id="infowindow_close" onclick="g_infowindow.close()"></div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
for (key in events) {
|
||||||
|
window_content += `
|
||||||
|
<a class="infowindow_body" href="${events[key].url}">
|
||||||
|
<p>${events[key].title}</p>
|
||||||
|
</a>
|
||||||
|
`;
|
||||||
|
};
|
||||||
|
window_content += `
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
|
||||||
|
marker.addListener('click', () => {
|
||||||
|
|
||||||
|
let view_center = map.getCenter();
|
||||||
|
// height must be half css value (mp_info_windows.css -> '--size: XXXpx;')
|
||||||
|
let window_offset = { width: 0, height: 275 };
|
||||||
|
|
||||||
|
infowindow.setOptions({
|
||||||
|
//disableAutoPan: true,
|
||||||
|
disableAutoPan: false,
|
||||||
|
content: window_content,
|
||||||
|
|
||||||
|
/* dimensions */
|
||||||
|
//maxWidth: 400,
|
||||||
|
//minWidth: 400,
|
||||||
|
|
||||||
|
/* center window */
|
||||||
|
position: view_center,
|
||||||
|
pixelOffset: window_offset,
|
||||||
|
|
||||||
|
//shouldFocus: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
infowindow.open(map);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
event : {}
|
||||||
|
- heure_de_debut : "";
|
||||||
|
- heure_de_fin : "";
|
||||||
|
- categorie : "";
|
||||||
|
- date : "";
|
||||||
|
- pays : "";
|
||||||
|
- ville : "";
|
||||||
|
- adresse : "";
|
||||||
|
- prenom : "";
|
||||||
|
- nom : "";
|
||||||
|
- irl : bool;
|
||||||
|
- id : x;
|
||||||
|
- index : x (default null);
|
||||||
|
- title : "";
|
||||||
|
- url : "";
|
||||||
|
- location : {}
|
||||||
|
- street : "";
|
||||||
|
- city : "";
|
||||||
|
- country : "";
|
||||||
|
- address : "";
|
||||||
|
- approximate : bool;
|
||||||
|
- coordinates : {}
|
||||||
|
- lat : x;
|
||||||
|
- lng : x;
|
||||||
|
*/
|
||||||
|
|
||||||
72
plug/map_prof/scripts/mp_init_map.js
Normal file
72
plug/map_prof/scripts/mp_init_map.js
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
|
||||||
|
let g_map = {};
|
||||||
|
let g_markers = [];
|
||||||
|
let g_marker_cluster = {};
|
||||||
|
let g_indexes = {};
|
||||||
|
let g_infowindow = {};
|
||||||
|
const g_world_bound = {
|
||||||
|
north: 80,
|
||||||
|
south: -80,
|
||||||
|
west: -180,
|
||||||
|
east: 180,
|
||||||
|
};
|
||||||
|
|
||||||
|
function mp_init_map() {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* following variable are created by mp_add_to_script.php
|
||||||
|
* - let locations = [
|
||||||
|
* {
|
||||||
|
* coordinates: {}
|
||||||
|
* events : [{}, ...]
|
||||||
|
* },
|
||||||
|
* ...
|
||||||
|
* ]
|
||||||
|
*
|
||||||
|
* { }
|
||||||
|
* { [ ] }
|
||||||
|
* - filters: { - pays : [ { - _name : "" } ] }
|
||||||
|
* { [ { - villes : [] } ] }
|
||||||
|
* { [ { - categories: [] } ] }
|
||||||
|
* { [ { - indexes : [] } ] }
|
||||||
|
* { [ { - mode : [] }, ...] }
|
||||||
|
* { [ ] }
|
||||||
|
* { }
|
||||||
|
* { - villes : ... }
|
||||||
|
* { - categories: ... }
|
||||||
|
* { - mode : ... }
|
||||||
|
* { }
|
||||||
|
*
|
||||||
|
* - let coordinates_default = {lat: ,lng: }
|
||||||
|
* - let icon_color = ""
|
||||||
|
* - let icon_color_back = ""
|
||||||
|
* - let icon_size = [x, y]
|
||||||
|
* - let cluster_size_factor = Number
|
||||||
|
* - let map_zoom = x
|
||||||
|
* - let max_zoom = x
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
let map_div = document.getElementById("ljdp_map");
|
||||||
|
//let filters_div = document.getElementById("ljdp_map_filters");
|
||||||
|
g_infowindow = new google.maps.InfoWindow();
|
||||||
|
|
||||||
|
g_map = create_map(map_div);
|
||||||
|
g_markers = create_markers(g_map, locations, g_infowindow);
|
||||||
|
g_marker_cluster = draw_clusters(g_map, g_markers);
|
||||||
|
|
||||||
|
// add listener to close infowindow
|
||||||
|
// https://developers.google.com/maps/documentation/javascript/events
|
||||||
|
g_map.addListener('click', function() {
|
||||||
|
g_infowindow.close();
|
||||||
|
});
|
||||||
|
g_map.addListener('drag', function() {
|
||||||
|
g_infowindow.close();
|
||||||
|
});
|
||||||
|
g_map.addListener('zoom_changed', function() {
|
||||||
|
g_infowindow.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
//g_map.addListener('clusteringbegin', restrict_map(false));
|
||||||
|
|
||||||
|
}
|
||||||
21
plug/map_prof/scripts/mp_publish_error.js
Normal file
21
plug/map_prof/scripts/mp_publish_error.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
console.log("publish error");
|
||||||
|
|
||||||
|
wp.data.dispatch( 'core/notices' ).createNotice(
|
||||||
|
'error', // Can be one of: success, info, warning, error.
|
||||||
|
'impossible de publier : le pays est invalide', // Text string to display.
|
||||||
|
{
|
||||||
|
isDismissible: true, // Whether the user can dismiss the notice.
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
//( function ( wp ) {
|
||||||
|
// console.log("publish error");
|
||||||
|
// wp.data.dispatch( 'core/notices' ).createNotice(
|
||||||
|
// 'error', // Can be one of: success, info, warning, error.
|
||||||
|
// 'impossible de publie : le pays est invalide', // Text string to display.
|
||||||
|
// {
|
||||||
|
// isDismissible: true, // Whether the user can dismiss the notice.
|
||||||
|
// }
|
||||||
|
// );
|
||||||
|
//} )( window.wp );
|
||||||
80
plug/map_prof/settings/mp_globals.php
Normal file
80
plug/map_prof/settings/mp_globals.php
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* global variables :
|
||||||
|
*
|
||||||
|
* DO NOT MODIFY !
|
||||||
|
* modify mp_optionnals.php or mp_required.php instead
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ICON SIZE
|
||||||
|
*/
|
||||||
|
$mp_icon_size = [40, 40];
|
||||||
|
if (isset($mp_settings_icon_size)) {
|
||||||
|
if (is_array($mp_settings_icon_size)) {
|
||||||
|
if (count($mp_settings_icon_size) === 2) {
|
||||||
|
if ( is_numeric($mp_settings_icon_size[0]) && is_numeric($mp_settings_icon_size[1]) ) {
|
||||||
|
$mp_icon_size = $mp_settings_icon_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ICON COLOR
|
||||||
|
*/
|
||||||
|
$mp_icon_color = "#ba197a";
|
||||||
|
if (isset($mp_settings_icon_color))
|
||||||
|
$mp_icon_color = $mp_settings_icon_color;
|
||||||
|
|
||||||
|
|
||||||
|
/* ICON FACTOR SIZE
|
||||||
|
*/
|
||||||
|
$mp_icon_size_factor = 2.5;
|
||||||
|
if (isset($mp_settings_icon_size_factor))
|
||||||
|
$mp_icon_size_factor = $mp_settings_icon_size_factor;
|
||||||
|
|
||||||
|
|
||||||
|
/* DEFAULT ZOOM
|
||||||
|
*/
|
||||||
|
$mp_zoom_set = [2, 5];
|
||||||
|
if (isset($mp_settings_zoom_set))
|
||||||
|
$mp_zoom_set = $mp_settings_zoom_set;
|
||||||
|
// also create the variable, and set to map page by default
|
||||||
|
$mp_zoom = $mp_zoom_set[0];
|
||||||
|
|
||||||
|
|
||||||
|
/* DEFAULT COORDINATES
|
||||||
|
*/
|
||||||
|
$mp_coordinates_default = (object)["lat" => 46.227638, "lng" => 2.213749]; // france
|
||||||
|
if (isset($mp_settings_coordinates_default))
|
||||||
|
$mp_coordinates_default = $mp_settings_coordinates_default;
|
||||||
|
|
||||||
|
|
||||||
|
/* ICON COLOR
|
||||||
|
*/
|
||||||
|
$mp_icon_color = "#ba197a";
|
||||||
|
$mp_icon_color_back = "#ffffff99";
|
||||||
|
if (isset($mp_settings_icon_color))
|
||||||
|
$mp_icon_color = $mp_settings_icon_color;
|
||||||
|
if (isset($mp_settings_icon_color_back))
|
||||||
|
$mp_icon_color_back = $mp_settings_icon_color_back;
|
||||||
|
|
||||||
|
|
||||||
|
/* ICON STROKE WIDTH
|
||||||
|
*/
|
||||||
|
$mp_icon_stroke_width = 6;
|
||||||
|
if (isset($mp_settings_icon_stroke_width))
|
||||||
|
$mp_icon_stroke_width = $mp_settings_icon_stroke_width;
|
||||||
|
|
||||||
|
|
||||||
|
/* MAX ZOOM
|
||||||
|
*/
|
||||||
|
$mp_max_zoom = 5;
|
||||||
|
if (isset($mp_settings_max_zoom))
|
||||||
|
$mp_max_zoom = $mp_settings_max_zoom;
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
86
plug/map_prof/settings/mp_optionnals.php
Normal file
86
plug/map_prof/settings/mp_optionnals.php
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* de-commenter les parametres pour les appliquer
|
||||||
|
*
|
||||||
|
* les parametres suivants sont optionnels pour le fonctionnement du plugin
|
||||||
|
* le plugin fonctionne sans eux, grace a des valeurs par defauts
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************
|
||||||
|
facteur de taille des clusters
|
||||||
|
_
|
||||||
|
valeur par defaut "2.5"
|
||||||
|
************************************ */
|
||||||
|
//$mp_settings_icon_size_factor = 4;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************
|
||||||
|
zoom initial
|
||||||
|
- pour les pages
|
||||||
|
- pour les posts
|
||||||
|
_
|
||||||
|
valeur par defaut [2, 5]
|
||||||
|
************************************ */
|
||||||
|
//$mp_settings_zoom_set = [1, 6];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************
|
||||||
|
coordonnees par defaut
|
||||||
|
(pour centrer la carte globale,
|
||||||
|
et en cas de mauvaises adresses)
|
||||||
|
_
|
||||||
|
valeur par defaut "france"
|
||||||
|
************************************ */
|
||||||
|
$mp_settings_coordinates_default = (object)["lat" => 30.0, "lng" => -1.0]; // carte mieux centree
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************
|
||||||
|
couleurs d'icones
|
||||||
|
- couleur de contour
|
||||||
|
- couleur de remplissage
|
||||||
|
_
|
||||||
|
valeurs par defaut "#ba197a"
|
||||||
|
"#ffffff99"
|
||||||
|
************************************ */
|
||||||
|
//$mp_settings_icon_color = "#d168a8";
|
||||||
|
//$mp_settings_icon_color_back = "#ffffff80"; // transparency :
|
||||||
|
// 0.0 : 00
|
||||||
|
// 0.1 : 1a
|
||||||
|
// 0.2 : 33
|
||||||
|
// 0.3 : 4d
|
||||||
|
// 0.4 : 66
|
||||||
|
// 0.5 : 80
|
||||||
|
// 0.6 : 99
|
||||||
|
// 0.7 : b3
|
||||||
|
// 0.8 : cc
|
||||||
|
// 0.9 : e6
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************
|
||||||
|
epaisseur de trait des icones
|
||||||
|
_
|
||||||
|
valeurs par defaut "6"
|
||||||
|
************************************ */
|
||||||
|
$mp_settings_icon_stroke_width = 8;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************
|
||||||
|
zoom automatique maximum sur les
|
||||||
|
marqueurs
|
||||||
|
_
|
||||||
|
valeurs par defaut "5"
|
||||||
|
************************************ */
|
||||||
|
$mp_settings_max_zoom = 4;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
13
plug/map_prof/settings/mp_required.php
Normal file
13
plug/map_prof/settings/mp_required.php
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* les parametres suivants sont necessaires pour le fonctionnement du plugin
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* cle api google maps pour "Maps Javascript API" */
|
||||||
|
$mp_api_key = 'AIzaSyCvdGV2ssD4ov4a9CuIlQhoJyz5gWWiSvE';
|
||||||
|
|
||||||
|
/* cle api google maps pour "Geocoding API" */
|
||||||
|
$mp_api_key_geo = 'AIzaSyAEMZHpMxBQaovU_so_RH7p_pZbjaB2jO8';
|
||||||
|
|
||||||
|
?>
|
||||||
23
plug/map_prof/settings/mp_url_api.php
Normal file
23
plug/map_prof/settings/mp_url_api.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_url_api() {
|
||||||
|
global $mp_api_key;
|
||||||
|
$mp_url = array(
|
||||||
|
'src' => 'https://maps.googleapis.com/maps/api/js',
|
||||||
|
'key' => $mp_api_key,
|
||||||
|
'callback' => 'mp_init_map',
|
||||||
|
);
|
||||||
|
$mp_src = "";
|
||||||
|
foreach ($mp_url as $url_key => $url_value) {
|
||||||
|
if ($url_key === 'src') {
|
||||||
|
$mp_src .= $url_value;
|
||||||
|
if (count($mp_url) > 1)
|
||||||
|
$mp_src .= "?";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
$mp_src .= "&" . $url_key . "=" . $url_value;
|
||||||
|
};
|
||||||
|
|
||||||
|
return $mp_src;
|
||||||
|
}
|
||||||
|
?>
|
||||||
96
plug/map_prof/srcs/errors/mp_address_errors.php
Normal file
96
plug/map_prof/srcs/errors/mp_address_errors.php
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_is_precise($post, $id, $location) {
|
||||||
|
|
||||||
|
// is presentiel but not complete address ?
|
||||||
|
$presentiel = get_field("mode", $id);
|
||||||
|
if ($presentiel[0] === "En présentiel") {
|
||||||
|
if ($location->approximate) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_is_address_complete($post, $id, $location) {
|
||||||
|
|
||||||
|
// is presentiel but not complete address ?
|
||||||
|
$presentiel = get_field("mode", $id);
|
||||||
|
if ($presentiel[0] === "En présentiel") {
|
||||||
|
if (strlen($location->street) == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (strlen($location->city) == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_is_valid_address($post, $id, $location) {
|
||||||
|
|
||||||
|
// is coordinates ?
|
||||||
|
if ($location->coordinates == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_fill_address_message($post, $id, $location) {
|
||||||
|
|
||||||
|
$message = '<br /><p>article : "'
|
||||||
|
. $post->post_title . '"</p><p>- adresse fournie : "'
|
||||||
|
. get_field('adresse', $id) . ', '
|
||||||
|
. get_field('ville', $id) . ', '
|
||||||
|
. get_field('pays', $id)
|
||||||
|
. '"</p><p>- adresse trouvée : "'
|
||||||
|
. $location->address
|
||||||
|
. '"</p>';
|
||||||
|
|
||||||
|
return $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_find_address_errors() {
|
||||||
|
|
||||||
|
$errors = "";
|
||||||
|
$incompletes = "";
|
||||||
|
$approximates = "";
|
||||||
|
$count_errors = 0;
|
||||||
|
$count_incompletes = 0;
|
||||||
|
$count_approximates = 0;
|
||||||
|
|
||||||
|
$get_posts_args = array(
|
||||||
|
'numberposts' => -1,
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'post',
|
||||||
|
);
|
||||||
|
$posts = get_posts($get_posts_args);
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
$id = $post->ID;
|
||||||
|
$location = get_field('location', $id);
|
||||||
|
if (! mp_is_valid_address($post, $id, $location)) {
|
||||||
|
$count_errors++;
|
||||||
|
$errors .= mp_fill_address_message($post, $id, $location);
|
||||||
|
}
|
||||||
|
// else if (! mp_is_address_complete($post, $id, $location)) {
|
||||||
|
// $count_incompletes++;
|
||||||
|
// $incompletes .= mp_fill_address_message($post, $id, $location);
|
||||||
|
// }
|
||||||
|
else if (! mp_is_precise($post, $id, $location)) {
|
||||||
|
$count_approximates++;
|
||||||
|
$approximates .= mp_fill_address_message($post, $id, $location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$message = "<h2>nombre d'erreurs : " . $count_errors . "</h2>";
|
||||||
|
// $message .= "<h2>nombre d'adresses incompletes pour des evenements en presentiels : " . $count_incompletes . "</h2>";
|
||||||
|
$message .= "<h2>nombre d'adresses approximatives pour des evenements en presentiels : " . $count_approximates . "</h2>";
|
||||||
|
$message .= "<br /><h2>erreurs :</h2>" . $errors;
|
||||||
|
// $message .= "<br /><h2>adresses incompletes:</h2>" . $incompletes;
|
||||||
|
$message .= "<br /><h2>approximatives :</h2>" . $approximates;
|
||||||
|
|
||||||
|
return $message;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
34
plug/map_prof/srcs/map/mp_add_to_scripts.php
Normal file
34
plug/map_prof/srcs/map/mp_add_to_scripts.php
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_php_to_js($php_var, $js_var_name) {
|
||||||
|
$js_var = 'let ' . $js_var_name . ' = ';
|
||||||
|
$js_var .= json_encode($php_var);
|
||||||
|
$js_var .= ';';
|
||||||
|
return $js_var;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_add_to_scripts($to_add) {
|
||||||
|
global $mp_icon_size;
|
||||||
|
global $mp_icon_color;
|
||||||
|
global $mp_icon_color_back;
|
||||||
|
global $mp_icon_size_factor;
|
||||||
|
global $mp_zoom;
|
||||||
|
global $mp_coordinates_default;
|
||||||
|
global $mp_icon_stroke_width;
|
||||||
|
global $mp_max_zoom;
|
||||||
|
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($mp_icon_size, 'icon_size'), 'before');
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($mp_icon_color, 'icon_color'), 'before');
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($mp_icon_color_back, 'icon_color_back'), 'before');
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($mp_icon_size_factor, 'icon_size_factor'), 'before');
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($mp_zoom, 'map_zoom'), 'before');
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($mp_coordinates_default, 'coordinates_default'), 'before');
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($mp_icon_stroke_width, 'icon_stroke_width'), 'before');
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($mp_max_zoom, 'max_zoom'), 'before');
|
||||||
|
|
||||||
|
foreach ($to_add as $key => $var) {
|
||||||
|
wp_add_inline_script('mp_init_map', mp_php_to_js($var, $key), 'before');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
135
plug/map_prof/srcs/map/mp_create_div.php
Normal file
135
plug/map_prof/srcs/map/mp_create_div.php
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_filter_drop_down($key, &$filter) {
|
||||||
|
/*
|
||||||
|
onfocusin="filter_show_only_selection(this, '.json_encode($value->indexes).', '."'".$key."'".')"
|
||||||
|
onclick="filter_show_only_selection(this, '.json_encode($value->indexes).', '."'".$key."'".')"
|
||||||
|
onfocus="filter_show_only_selection(this, '.json_encode($value->indexes).', '."'".$key."'".')"
|
||||||
|
onclick="filter_show_only_selection(this, '.json_encode(array()).', '."'".$key."'".')"
|
||||||
|
onchange="filter_show_only_selection(this, '.json_encode($value->indexes).', '."'".$key."'".')"
|
||||||
|
|
||||||
|
onchange="filter_show_only_selection(this, '.json_encode(array()).', '."'".$key."'".')"
|
||||||
|
onchange="filter_event(this, this.options[this.selectedIndex], \''.$key.'\')"
|
||||||
|
*/
|
||||||
|
$menu_name_class = 'filter_menu_'.str_replace(" ", "_", $key).'';
|
||||||
|
$id = "filter_"
|
||||||
|
. $key
|
||||||
|
. "_"
|
||||||
|
. $key
|
||||||
|
;
|
||||||
|
$content = '
|
||||||
|
<select
|
||||||
|
form="ljdp_form"
|
||||||
|
class="filter_menu filter_menu_drop"
|
||||||
|
onchange="filter_show_only(this.options[this.selectedIndex], \''.$key.'\')"
|
||||||
|
>
|
||||||
|
<option
|
||||||
|
selected
|
||||||
|
id="'.$id.'"
|
||||||
|
class="filter_menu_item '.$menu_name_class.'"
|
||||||
|
data-menu_index="menu_name"
|
||||||
|
>
|
||||||
|
'.$key.'
|
||||||
|
</option>
|
||||||
|
';
|
||||||
|
foreach ($filter as $key_filter => $value) {
|
||||||
|
$id = "filter_"
|
||||||
|
. $key
|
||||||
|
. "_"
|
||||||
|
. str_replace( " ", "_", $value->_name)
|
||||||
|
;
|
||||||
|
$content .= '
|
||||||
|
<option
|
||||||
|
id="'.$id.'"
|
||||||
|
class="filter_menu_item '.$menu_name_class.'"
|
||||||
|
data-menu_index="'.$key_filter.'"
|
||||||
|
>
|
||||||
|
'.$value->_name.'
|
||||||
|
</option>
|
||||||
|
';
|
||||||
|
}
|
||||||
|
$content .= '
|
||||||
|
</select>
|
||||||
|
';
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
};
|
||||||
|
|
||||||
|
function mp_filter_buttons($key, &$filter) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
onclick="filter_show_only_selection(this, '.json_encode($value->indexes).', '."'".$key."'".', true)"
|
||||||
|
*/
|
||||||
|
$menu_name_class = 'filter_menu_'.str_replace(" ", "_", $key).'';
|
||||||
|
$content = '';
|
||||||
|
foreach ($filter as $key_filter => $value) {
|
||||||
|
$id = "filter_"
|
||||||
|
. $key
|
||||||
|
. "_"
|
||||||
|
. str_replace( " ", "_", $value->_name)
|
||||||
|
;
|
||||||
|
$content .= '
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
form="ljdp_form"
|
||||||
|
id="'.$id.'"
|
||||||
|
class="filter_menu_checkbox filter_menu_item '.$menu_name_class.'"
|
||||||
|
onclick="filter_show_only(this, \''.$key.'\')"
|
||||||
|
style="display:none;"
|
||||||
|
data-menu_index="'.$key_filter.'",
|
||||||
|
>
|
||||||
|
<label
|
||||||
|
for="'.$id.'"
|
||||||
|
class="filter_menu filter_menu_checkbox"
|
||||||
|
>
|
||||||
|
<p>'.$value->_name.'</p>
|
||||||
|
</label>
|
||||||
|
';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $content;
|
||||||
|
};
|
||||||
|
|
||||||
|
function mp_create_div(&$filters) {
|
||||||
|
$mp_map_div = '
|
||||||
|
<div id="ljdp_map_wrapper">
|
||||||
|
<form id="ljdp_form" style="display:none;"></form>
|
||||||
|
<div id="ljdp_map_filters">
|
||||||
|
';
|
||||||
|
|
||||||
|
foreach ($filters as $key => $filter) {
|
||||||
|
|
||||||
|
if ($key == "mode")
|
||||||
|
$mp_map_div .= mp_filter_buttons($key, $filter);
|
||||||
|
else
|
||||||
|
$mp_map_div .= mp_filter_drop_down($key, $filter);
|
||||||
|
};
|
||||||
|
|
||||||
|
$mp_map_div .= '
|
||||||
|
<input
|
||||||
|
type="reset"
|
||||||
|
form="ljdp_form"
|
||||||
|
id="filter_menu_reset"
|
||||||
|
class="filter_menu_button"
|
||||||
|
onclick="filter_show_all()"
|
||||||
|
style="display:none;"
|
||||||
|
>
|
||||||
|
<label
|
||||||
|
for="filter_menu_reset"
|
||||||
|
class="filter_menu filter_menu_reset"
|
||||||
|
>
|
||||||
|
<p>Effacer</p>
|
||||||
|
</label>
|
||||||
|
';
|
||||||
|
|
||||||
|
$mp_map_div .= '
|
||||||
|
</div>
|
||||||
|
<div id="ljdp_map"></div>
|
||||||
|
</div>
|
||||||
|
';
|
||||||
|
|
||||||
|
return $mp_map_div;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
212
plug/map_prof/srcs/map/mp_get_events.php
Normal file
212
plug/map_prof/srcs/map/mp_get_events.php
Normal file
@@ -0,0 +1,212 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
GET_POST :
|
||||||
|
|
||||||
|
1 ID: 29693
|
||||||
|
2 comment_count: "0"
|
||||||
|
3 comment_status: "closed"
|
||||||
|
4 filter: "raw"
|
||||||
|
5 guid: "https://local_lejourduprof.com/?p=29693"
|
||||||
|
6 menu_order: 0
|
||||||
|
7 ping_status: "closed"
|
||||||
|
8 pinged: ""
|
||||||
|
9 post_author: "1"
|
||||||
|
10 post_content: ""
|
||||||
|
11 post_content_filtered: ""
|
||||||
|
12 post_date: "2022-11-04 18:05:49"
|
||||||
|
13 post_date_gmt: "2022-11-04 17:05:49"
|
||||||
|
14 post_excerpt: "Les enseignants vont présenter les projets développés dans leurs classes et partager leurs pratiques et expériences."
|
||||||
|
15 post_mime_type: ""
|
||||||
|
16 post_modified: "2022-11-05 09:39:46"
|
||||||
|
17 post_modified_gmt: "2022-11-05 08:39:46"
|
||||||
|
18 post_name: "construisons-ensemble-lavenir"
|
||||||
|
19 post_parent: 0
|
||||||
|
20 post_password: ""
|
||||||
|
21 post_status: "draft"
|
||||||
|
22 post_title: "Construisons ensemble l'avenir"
|
||||||
|
23 post_type: "post"
|
||||||
|
24 to_ping: ""
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
GET_POST_CUSTOM :
|
||||||
|
|
||||||
|
1 _cf7_2_post_form_submitted : "yes"
|
||||||
|
2 _edit_last : "3"
|
||||||
|
3 _edit_lock : "1695215530:3"
|
||||||
|
4 _encloseme : "1"
|
||||||
|
5 _et_builder_dynamic_assets_loading_attr_threshold : "3"
|
||||||
|
6 _pingme : "1"
|
||||||
|
7 _thumbnail_id : "32583"
|
||||||
|
8 _wp_old_date : "2023-09-06"
|
||||||
|
|
||||||
|
1 activite_concerne : "les enseignants de français langue étrangère ou français langue seconde"
|
||||||
|
2 adresse : ""
|
||||||
|
3 adresse_courriel : "ivan.centre@gmail.com"
|
||||||
|
4 adresse_courriel_de_contact : "ivan.centre@gmail.com"
|
||||||
|
5 categorie : "Conférence/Table ronde/Salon"
|
||||||
|
6 composition : `a:4:{i:0;s:62:"Association de professeurs de français membre du réseau FIPF";i:1;s:38:"Ambassade de France/Institut français";i:2;s:27:"Université membre de l'AUF";i:3;s:23:"Organe de presse locale";}`
|
||||||
|
7 composition_1 : "Association des professeurs de français de Serbie"
|
||||||
|
8 composition_2 : "Institut français de Serbie"
|
||||||
|
9 composition_3 : "Faculté de philosophie de l'Université de Nis"
|
||||||
|
10 composition_4 : "Média et Reforme Centre"
|
||||||
|
11 composition_autres : ""
|
||||||
|
12 date : "2023-11-23"
|
||||||
|
13 depenses_prevues : "4000"
|
||||||
|
14 description_courte : `L'activité prévue: "Pensez vert, sauvez la Terre". Mettre FLE au service de l'écologie!`
|
||||||
|
15 description_longue : `L'activité "Pensez vert, sauvez la Terre" est composée de deux segments: a) concours national destiné aux professeurs de FLE qui auront pour tâche de concevoir les fiches pédagogiques à partir de trois films écologiques courts métrages: https://vimeo.com/124807861; https://vimeo.com/120562699; https://vimeo.com/63528500; b) conférences nationales qui se feront en ligne et en présentiel. L'objectif est de faire prendre conscience de la problématique relative au changement climatique et à la biodiversité mais aussi d’encourager les enseignants d'intégrer le FLE au service de l'écologie! \r\n`
|
||||||
|
16 fichier : "https://local_lejourduprof.com/wp-content/uploads/2023/09/Budget_previsionnel_JIPF_2023-1.docx"
|
||||||
|
17 financement : 'a:1:{i:0;s:3:"oui";}'
|
||||||
|
18 fonction : "Président"
|
||||||
|
19 heure_de_debut : "10:00"
|
||||||
|
20 heure_de_fin : "18:00"
|
||||||
|
21 institution : "Association des professeurs de français de Serbie"
|
||||||
|
22 lien_internet : "http://www.apfs.edu.rs"
|
||||||
|
23 liste_des_depenses : ""
|
||||||
|
24 mode : 'a:1:{i:0;s:8:"En ligne";}'
|
||||||
|
25 montant_demande : "2000"
|
||||||
|
26 nom : "JOVANOVIĆ"
|
||||||
|
27 participation : "1000"
|
||||||
|
28 pays : "Serbie"
|
||||||
|
29 plan_de_communication : "Avant le projet: organisation d'une conférence de presse pour parler de l'activité; création des affiches de l'activité; annoncer le projet dans les médias et sur les réseaux sociaux ainsi que sur les sites des partenaires concernés.\r\n\r\nPendant le projet: communication sur les réseaux sociaux et sur les sites des partenaires concernés.\r\n\r\nAprès le projet: médias, réseaux sociaux et les sites des partenaires concernés."
|
||||||
|
30 prenom : "Ivan"
|
||||||
|
31 public_vise : "1000, enseignants de FLE, étudiants, lycéens bilingues"
|
||||||
|
32 recettes_prevues : "0"
|
||||||
|
33 resultat_attendu : "Les enseignants seront mobilisés face à la langue française et le mettront au service de l'écologie globale! Grâce à leur engagement et leur dévouement auprès des élèves ils seront motivés de les faire sensibiliser sur les causes et les effets de l’érosion de la biodiversité, de leur monter le rôle important de l'apprentissage du français dans la préservation de la Terre et de sa population. Aussi, Cette activité a pour l’ambition de construire la nécessité d’acquérir les compétences à leur activité future à une citoyenneté éco active. On développera chez eux des compétences de communication, d’expression orale, d’expression écrite, d’argumentation, de justification."
|
||||||
|
34 resultats_attendus : "Les enseignants seront mobilisés face à la langue française et le mettront au service de l'écologie globale! Grâce à leur engagement et leur dévouement auprès des élèves ils seront motivés de les faire sensibiliser sur les causes et les effets de l’érosion de la biodiversité, de leur monter le rôle important de l'apprentissage du français dans la préservation de la Terre et de sa population. Aussi, Cette activité a pour l’ambition de construire la nécessité d’acquérir les compétences à leur activité future à une citoyenneté éco active. On développera chez eux des compétences de communication, d’expression orale, d’expression écrite, d’argumentation, de justification."
|
||||||
|
35 se_connecter : "meet.google.com/mnu-czps-rrh "
|
||||||
|
36 telephone : "+381649997389"
|
||||||
|
*/
|
||||||
|
|
||||||
|
function mp_get_published_posts() {
|
||||||
|
|
||||||
|
$get_posts_args = array(
|
||||||
|
'numberposts' => -1,
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'post',
|
||||||
|
);
|
||||||
|
$posts_published = get_posts($get_posts_args);
|
||||||
|
|
||||||
|
return $posts_published;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_fill_fields_value($id) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* get_field is an ACF function
|
||||||
|
* in "pure" worpdress use :
|
||||||
|
* get_post_meta or get_post_custom
|
||||||
|
* - https://developer.wordpress.org/reference/functions/get_post_meta/
|
||||||
|
* - https://developer.wordpress.org/reference/functions/get_post_custom/
|
||||||
|
* if you try to use `get_fields(id)` to retrieve all the acf7 custom fields,
|
||||||
|
* sometimes it fails eventhough you can get a specific value with `get_field(value, id)`,
|
||||||
|
* it's because acf7 didn´t insert the field itself and so some hidden data is not there :
|
||||||
|
* - https://coreysalzano.com/wordpress/acf-get_fields-not-working-but-get_field-does/
|
||||||
|
*/
|
||||||
|
|
||||||
|
// add fields
|
||||||
|
$fields = array(
|
||||||
|
"heure_de_debut",
|
||||||
|
"heure_de_fin",
|
||||||
|
"categorie",
|
||||||
|
"date",
|
||||||
|
"pays",
|
||||||
|
"ville",
|
||||||
|
"adresse",
|
||||||
|
"prenom",
|
||||||
|
"nom",
|
||||||
|
"location",
|
||||||
|
);
|
||||||
|
$event = (object)[];
|
||||||
|
foreach($fields as $field) {
|
||||||
|
$value = get_field($field, $id);
|
||||||
|
if ($value === "↓")
|
||||||
|
$value = "Autre";
|
||||||
|
if (gettype($value) === "string")
|
||||||
|
$value = trim($value, " ");
|
||||||
|
$event->$field = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add mode irl or online (irl: true | false)
|
||||||
|
$presentiel = get_field("mode", $id);
|
||||||
|
$event->irl = false;
|
||||||
|
if ($presentiel[0] === "En présentiel")
|
||||||
|
$event->irl = true;
|
||||||
|
|
||||||
|
// add post url
|
||||||
|
$event->url = get_post_permalink($id);
|
||||||
|
|
||||||
|
return $event;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_get_published_events() {
|
||||||
|
$posts_list = mp_get_published_posts();
|
||||||
|
|
||||||
|
// mp_console_log("posts :");
|
||||||
|
// mp_console_log($posts_list);
|
||||||
|
// foreach ($posts_list as $post) {
|
||||||
|
// mp_console_log("--------------- post :");
|
||||||
|
// $id = $post->ID;
|
||||||
|
// mp_console_log("id: " . $id);
|
||||||
|
// mp_console_log("adresse: " . $event->adresse);
|
||||||
|
// mp_console_log("pays: " . $event->pays);
|
||||||
|
// mp_console_log("ville: " . $event->ville);
|
||||||
|
// mp_console_log("irl: " . $event->irl);
|
||||||
|
// mp_console_log($event);
|
||||||
|
//
|
||||||
|
// $fields = get_fields($id);
|
||||||
|
// mp_console_log("fields:");
|
||||||
|
// mp_console_log($fields);
|
||||||
|
// $field_heure = get_field("heure_de_debut", $id);
|
||||||
|
// mp_console_log("field_heure: " . $field_heure);
|
||||||
|
// $post_metas = get_post_meta($id);
|
||||||
|
// mp_console_log("post_metas:");
|
||||||
|
// mp_console_log($post_metas);
|
||||||
|
// $post_custom = get_post_custom($id);
|
||||||
|
// mp_console_log("post_custom:");
|
||||||
|
// mp_console_log($post_custom);
|
||||||
|
// foreach( $fields as $name => $value )
|
||||||
|
// mp_console_log($name . " : " . $value);
|
||||||
|
// }
|
||||||
|
|
||||||
|
$events = [];
|
||||||
|
foreach ($posts_list as $post) {
|
||||||
|
$event = mp_fill_fields_value($post->ID);
|
||||||
|
$event->id = $post->ID;
|
||||||
|
$event->title = trim($post->post_title, " ");
|
||||||
|
$event->index = null;
|
||||||
|
array_push($events, $event);
|
||||||
|
}
|
||||||
|
return $events;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
event : {}
|
||||||
|
- heure_de_debut : "";
|
||||||
|
- heure_de_fin : "";
|
||||||
|
- categorie : "";
|
||||||
|
- date : "";
|
||||||
|
- pays : "";
|
||||||
|
- ville : "";
|
||||||
|
- adresse : "";
|
||||||
|
- prenom : "";
|
||||||
|
- nom : "";
|
||||||
|
- irl : bool;
|
||||||
|
- id : x;
|
||||||
|
- index : x (default null);
|
||||||
|
- title : "";
|
||||||
|
- url : "";
|
||||||
|
- location : {}
|
||||||
|
- street : "";
|
||||||
|
- city : "";
|
||||||
|
- country : "";
|
||||||
|
- address : "";
|
||||||
|
- approximate : bool;
|
||||||
|
- coordinates : {}
|
||||||
|
- lat : x;
|
||||||
|
- lng : x;
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
160
plug/map_prof/srcs/map/mp_get_filters.php
Normal file
160
plug/map_prof/srcs/map/mp_get_filters.php
Normal file
@@ -0,0 +1,160 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_filter_compare($a, $b) {
|
||||||
|
|
||||||
|
$compare = strcmp($a->_name, $b->_name);
|
||||||
|
|
||||||
|
if ($a->_name === "Autre") {
|
||||||
|
if ($compare !== 0)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if ($b->_name === "Autre") {
|
||||||
|
if ($compare !== 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $compare;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_already_in_menu(&$menu, $name) {
|
||||||
|
foreach ($menu as $field) {
|
||||||
|
if ($field->_name == $name)
|
||||||
|
return $field;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* creates the menus
|
||||||
|
* from the events fields
|
||||||
|
* and add the index of the event as it is in location (events when they are sorted)
|
||||||
|
*
|
||||||
|
* fields: [ countries:"", cities:"", categories:"", ... ]
|
||||||
|
* name : field's values -> countries, cities, categories, ...
|
||||||
|
* menu : [ { _name:"", field_1:[], field_2:[] }, ... ]
|
||||||
|
* index : index of this event in locations[] array
|
||||||
|
*/
|
||||||
|
function mp_fill_name($fields, $name, &$menu, $index) {
|
||||||
|
if ($fields[$name] == null)
|
||||||
|
return;
|
||||||
|
if (gettype($fields[$name]) != 'string')
|
||||||
|
return;
|
||||||
|
if (strlen($fields[$name]) == 0)
|
||||||
|
return;
|
||||||
|
// menu_item, ex: for menu "countries" -> france
|
||||||
|
$menu_item = mp_already_in_menu($menu, $fields[$name]);
|
||||||
|
if ($menu_item != null) {
|
||||||
|
// add to this menu item, eg "Austria", the infos of this
|
||||||
|
// event, like "city" or "category", if not there already
|
||||||
|
foreach ($fields as $key_field => $value) {
|
||||||
|
// no need to add name if already exist
|
||||||
|
if ($key_field == $name)
|
||||||
|
continue;
|
||||||
|
if (! isset($menu_item->$key_field) )
|
||||||
|
$menu_item->$key_field = [];
|
||||||
|
if (!is_string($value))
|
||||||
|
continue;
|
||||||
|
if (strlen($value) != 0) {
|
||||||
|
if (! in_array($value, $menu_item->$key_field) )
|
||||||
|
array_push($menu_item->$key_field, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// add location index, if not there already
|
||||||
|
if (! in_array($index, $menu_item->indexes) ) {
|
||||||
|
array_push($menu_item->indexes, $index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$menu_item = (object)[];
|
||||||
|
$menu_item->_name = $fields[$name];
|
||||||
|
// add lists of event info (cities, countries, ...)
|
||||||
|
foreach ($fields as $key_field => $value) {
|
||||||
|
if ($key_field == $name)
|
||||||
|
continue;
|
||||||
|
$menu_item->$key_field = [];
|
||||||
|
if (!is_string($value))
|
||||||
|
continue;
|
||||||
|
if (strlen($value) != 0)
|
||||||
|
array_push($menu_item->$key_field, $value);
|
||||||
|
}
|
||||||
|
// add list of location index
|
||||||
|
$menu_item->indexes = [$index];
|
||||||
|
|
||||||
|
// and add this item to list of menu
|
||||||
|
array_push($menu, $menu_item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_get_filters(&$events) {
|
||||||
|
$filters = (object)[];
|
||||||
|
|
||||||
|
foreach ($events as $event) {
|
||||||
|
|
||||||
|
// no index means no coordinates
|
||||||
|
$index = $event->index;
|
||||||
|
if ($index === null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// create array of menus
|
||||||
|
$fields = array(
|
||||||
|
"Pays" => $event->location->country,
|
||||||
|
"Catégories" => $event->categorie,
|
||||||
|
"mode" => ($event->irl)? "En présentiel" : "En ligne",
|
||||||
|
);
|
||||||
|
|
||||||
|
// fill all menu with other menus without doubles
|
||||||
|
foreach ($fields as $name => $value) {
|
||||||
|
if (! isset($filters->$name))
|
||||||
|
$filters->$name = [];
|
||||||
|
mp_fill_name($fields, $name, $filters->$name, $index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($filters as $key => $value) {
|
||||||
|
usort($filters->$key, 'mp_filter_compare');
|
||||||
|
}
|
||||||
|
|
||||||
|
return $filters;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
{ }
|
||||||
|
{ [ ] }
|
||||||
|
filters: { - countries : [ { - _name : "" } ] }
|
||||||
|
{ [ { - categories: [] } ] }
|
||||||
|
{ [ { - indexes : [] }, ... ] }
|
||||||
|
{ [ ] }
|
||||||
|
{ }
|
||||||
|
{ - categories: }
|
||||||
|
{ - modes : }
|
||||||
|
{ }
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
event : {}
|
||||||
|
- heure_de_debut : "";
|
||||||
|
- heure_de_fin : "";
|
||||||
|
- categorie : "";
|
||||||
|
- date : "";
|
||||||
|
- pays : "";
|
||||||
|
- ville : "";
|
||||||
|
- adresse : "";
|
||||||
|
- prenom : "";
|
||||||
|
- nom : "";
|
||||||
|
- irl : bool;
|
||||||
|
- id : x;
|
||||||
|
- index : x;
|
||||||
|
- title : "";
|
||||||
|
- location : {}
|
||||||
|
- street : "";
|
||||||
|
- city : "";
|
||||||
|
- country : "";
|
||||||
|
- address : "";
|
||||||
|
- approximate : bool;
|
||||||
|
- coordinates : {}
|
||||||
|
- lat : x;
|
||||||
|
- lng : x;
|
||||||
|
*/
|
||||||
|
|
||||||
|
?>
|
||||||
66
plug/map_prof/srcs/map/mp_get_locations.php
Normal file
66
plug/map_prof/srcs/map/mp_get_locations.php
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_coord_already_exist(&$coordinates, &$locations) {
|
||||||
|
foreach ($locations as $location) {
|
||||||
|
if ($location->coordinates->lat == $coordinates->lat)
|
||||||
|
if ($location->coordinates->lng == $coordinates->lng)
|
||||||
|
return $location;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_sort_n_insert(&$event, &$locations) {
|
||||||
|
$coordinates = $event->location->coordinates;
|
||||||
|
if ($coordinates == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
$already_exist = mp_coord_already_exist($coordinates, $locations);
|
||||||
|
if ($already_exist) {
|
||||||
|
// add index to the event
|
||||||
|
$index = $already_exist->index;
|
||||||
|
$event->index = $index;
|
||||||
|
// add event to events[]
|
||||||
|
array_push($already_exist->events, $event);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// create new location object
|
||||||
|
$location = (object)[];
|
||||||
|
$location->events = [];
|
||||||
|
|
||||||
|
// add index to the location and event
|
||||||
|
$index = count($locations);
|
||||||
|
$location->index = $index;
|
||||||
|
$event->index = $index;
|
||||||
|
// add coordinates to the location
|
||||||
|
$location->coordinates = $coordinates;
|
||||||
|
// add first event to events[]
|
||||||
|
array_push($location->events, $event);
|
||||||
|
// add this location to locations[]
|
||||||
|
array_push($locations, $location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_sort_events(&$events) {
|
||||||
|
$locations = [];
|
||||||
|
|
||||||
|
foreach ($events as $event) {
|
||||||
|
mp_sort_n_insert($event, $locations);
|
||||||
|
};
|
||||||
|
|
||||||
|
return $locations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
locations = [
|
||||||
|
{
|
||||||
|
index : x
|
||||||
|
coordinates: {}
|
||||||
|
events : [{}, ...]
|
||||||
|
},
|
||||||
|
...
|
||||||
|
]
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
?>
|
||||||
27
plug/map_prof/srcs/map_posts/mp_post_events_pages.php
Normal file
27
plug/map_prof/srcs/map_posts/mp_post_events_pages.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function is_event_post() {
|
||||||
|
if ( is_admin() )
|
||||||
|
return false;
|
||||||
|
if ( get_post_type() != "post" )
|
||||||
|
return 0;
|
||||||
|
if ( get_post_status() != "publish" )
|
||||||
|
return 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_post_event_pages_setting() {
|
||||||
|
global $mp_zoom;
|
||||||
|
global $mp_zoom_set;
|
||||||
|
global $mp_coordinates_default;
|
||||||
|
if (is_event_post()) {
|
||||||
|
$mp_zoom = $mp_zoom_set[1];
|
||||||
|
|
||||||
|
$location = get_field("location");
|
||||||
|
$coordinates = $location->coordinates;
|
||||||
|
|
||||||
|
$mp_coordinates_default = $coordinates;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
258
plug/map_prof/srcs/menu/mp_menu_content.php
Normal file
258
plug/map_prof/srcs/menu/mp_menu_content.php
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_get_all_posts() {
|
||||||
|
|
||||||
|
$get_posts_args = array(
|
||||||
|
'numberposts' => -1,
|
||||||
|
'post_status' => 'any',
|
||||||
|
'post_type' => 'post',
|
||||||
|
);
|
||||||
|
$posts_list = get_posts($get_posts_args);
|
||||||
|
|
||||||
|
return $posts_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function mp_posts_published($posts_list) {
|
||||||
|
|
||||||
|
$posts_published = [];
|
||||||
|
foreach ($posts_list as $post) {
|
||||||
|
$status = $post->post_status;
|
||||||
|
if ($status == "publish")
|
||||||
|
array_push($posts_published, $post);
|
||||||
|
}
|
||||||
|
return $posts_published;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function mp_have_no_address($posts_list) {
|
||||||
|
|
||||||
|
$posts_no_address = [];
|
||||||
|
foreach ($posts_list as $post) {
|
||||||
|
$address = mp_get_address($post->ID);
|
||||||
|
if (empty($address))
|
||||||
|
array_push($posts_no_address, $post);
|
||||||
|
}
|
||||||
|
return $posts_no_address;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function mp_have_no_coordinates($posts_list) {
|
||||||
|
|
||||||
|
$posts_no_coordinates = [];
|
||||||
|
foreach ($posts_list as $post) {
|
||||||
|
$location = get_field("location", $post->ID);
|
||||||
|
if (empty($location))
|
||||||
|
array_push($posts_no_coordinates, $post);
|
||||||
|
else if (empty($location->coordinates))
|
||||||
|
array_push($posts_no_coordinates, $post);
|
||||||
|
}
|
||||||
|
return $posts_no_coordinates;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function mp_show_list_posts_no_address($posts) {
|
||||||
|
|
||||||
|
echo <<<HTML
|
||||||
|
<div style="border: 1px solid red; margin: 20px 20px 20px auto; padding: 0px 20px;">
|
||||||
|
<p style="color: red;">
|
||||||
|
<b>ATTENTION !</b>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<b>
|
||||||
|
HTML;
|
||||||
|
echo count($posts);
|
||||||
|
echo '</b>';
|
||||||
|
if (count($posts) == 1)
|
||||||
|
echo " article n'a pas d'adresse :";
|
||||||
|
else
|
||||||
|
echo " articles n'ont pas d'adresses :";
|
||||||
|
echo <<<HTML
|
||||||
|
</p>
|
||||||
|
<ul style="list-style: square inside;">
|
||||||
|
HTML;
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
echo <<<HTML
|
||||||
|
<li><b>
|
||||||
|
HTML;
|
||||||
|
echo 'id: ';
|
||||||
|
echo $post->ID;
|
||||||
|
echo ' (status: ';
|
||||||
|
echo $post->post_status;
|
||||||
|
echo ') - ';
|
||||||
|
if (!empty($post->mode))
|
||||||
|
echo $post->mode[0];
|
||||||
|
echo ' : </b>';
|
||||||
|
echo $post->post_title;
|
||||||
|
echo <<<HTML
|
||||||
|
</li>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
echo <<<HTML
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function mp_show_list_posts_no_coordinates($posts) {
|
||||||
|
|
||||||
|
echo <<<HTML
|
||||||
|
<div style="border: 1px solid blue; margin: 20px 20px 20px auto; padding: 0px 20px;">
|
||||||
|
<p style="color: blue;">
|
||||||
|
<b>INFORMATION :</b>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<b>
|
||||||
|
HTML;
|
||||||
|
echo count($posts);
|
||||||
|
echo '</b>';
|
||||||
|
if (count($posts) == 1)
|
||||||
|
echo " article n'a pas de coordonnees :";
|
||||||
|
else
|
||||||
|
echo " articles n'ont pas de coordonnees :";
|
||||||
|
echo <<<HTML
|
||||||
|
</p>
|
||||||
|
<ul style="list-style: square inside;">
|
||||||
|
HTML;
|
||||||
|
foreach ($posts as $post) {
|
||||||
|
echo <<<HTML
|
||||||
|
<li><b>
|
||||||
|
HTML;
|
||||||
|
echo 'id: ';
|
||||||
|
echo $post->ID;
|
||||||
|
echo ' (status: ';
|
||||||
|
echo $post->post_status;
|
||||||
|
echo ') - ';
|
||||||
|
if (!empty($post->mode))
|
||||||
|
echo $post->mode[0];
|
||||||
|
echo ' : </b>';
|
||||||
|
echo $post->post_title;
|
||||||
|
echo <<<HTML
|
||||||
|
</li>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
echo <<<HTML
|
||||||
|
</ul>
|
||||||
|
<p style="background-color: lightblue; padding: 5px 10px; width: fit-content;">
|
||||||
|
<b>pour actualiser les coordonnees d'un article, il suffit de le remettre en "brouillon" puis de le publier a nouveau</b>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function mp_show_post_number($posts_list, $posts_published) {
|
||||||
|
|
||||||
|
echo <<<HTML
|
||||||
|
<p>nombre d'articles au total : <b>
|
||||||
|
HTML;
|
||||||
|
echo count($posts_list);
|
||||||
|
echo "</b> (dont <b>";
|
||||||
|
echo count($posts_published) . "</b>";
|
||||||
|
if (count($posts_published) == 1)
|
||||||
|
echo " publié)</p>";
|
||||||
|
else
|
||||||
|
echo " publiés)</p>";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function mp_show_api_key_n_ip() {
|
||||||
|
global $mp_api_key;
|
||||||
|
global $mp_api_key_geo;
|
||||||
|
|
||||||
|
echo <<<HTML
|
||||||
|
<p>l'adresse ip du serveur est : <b>
|
||||||
|
HTML;
|
||||||
|
$external_ip = mp_get_ip();
|
||||||
|
echo $external_ip;
|
||||||
|
echo <<<HTML
|
||||||
|
</b></p>
|
||||||
|
HTML;
|
||||||
|
|
||||||
|
echo <<<HTML
|
||||||
|
<p>les cles api de google maps utilisees sont :</p>
|
||||||
|
<ul style="list-style: square inside; max-width: 500px;">
|
||||||
|
<li>pour la carte : <b style='float:right; margin-right: 10px;'>
|
||||||
|
HTML;
|
||||||
|
echo $mp_api_key;
|
||||||
|
echo <<<HTML
|
||||||
|
</b></li>
|
||||||
|
<li>pour les coordonnees : <b style='float:right; margin-right: 10px;'>
|
||||||
|
HTML;
|
||||||
|
echo $mp_api_key_geo;
|
||||||
|
echo <<<HTML
|
||||||
|
</b></li></ul>
|
||||||
|
<p>(elles sont inscrites dans ./settings/mp_required.php)</p>
|
||||||
|
HTML;
|
||||||
|
|
||||||
|
// need to use an api key with special restrictions :
|
||||||
|
// https://stackoverflow.com/questions/42167695/api-key-browser-api-keys-cannot-have-referer-restrictions-when-used-with-this-ap
|
||||||
|
echo <<<HTML
|
||||||
|
<p style="color: blue;">
|
||||||
|
<b>→ pour la carte : </b>
|
||||||
|
cette cle api peut etre restreinte par url, et par api avec l'api <b>"Maps Javascript API"</b>
|
||||||
|
</p>
|
||||||
|
<p style="color: blue;">
|
||||||
|
<b>→ pour les coordonnees : </b>
|
||||||
|
cette cle api ne doit pas etre restreinte par url, elle peut etre restreinte par adresse ip du serveur, et par api avec l'api <b>"Geocoding API"</b>
|
||||||
|
</p>
|
||||||
|
<p style="color: blue;">
|
||||||
|
<b>→ pour utiliser une seule cle api : </b>
|
||||||
|
cette cle api ne doit pas etre restreinte ni par url ni par adresse ip, elle peut etre restreinte par api avec les deux apis <b>"Maps Javascript API"</b> et <b>"Geocoding API"</b>
|
||||||
|
</p>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function ljdp_map_plugin_content() {
|
||||||
|
|
||||||
|
$posts_list = mp_get_all_posts();
|
||||||
|
//mp_console_log("posts_list: ");
|
||||||
|
//mp_console_log($posts_list);
|
||||||
|
|
||||||
|
$posts_published = mp_posts_published($posts_list);
|
||||||
|
|
||||||
|
$posts_no_address = mp_have_no_address($posts_list);
|
||||||
|
//mp_console_log("posts_no_address: ");
|
||||||
|
//mp_console_log($posts_no_address);
|
||||||
|
|
||||||
|
$posts_no_coordinates = mp_have_no_coordinates($posts_list);
|
||||||
|
//mp_console_log("posts_no_coordinates: ");
|
||||||
|
//mp_console_log($posts_no_coordinates);
|
||||||
|
|
||||||
|
echo <<<HTML
|
||||||
|
<div>
|
||||||
|
<h2>JIPF map plugin</h2>
|
||||||
|
HTML;
|
||||||
|
|
||||||
|
mp_show_post_number($posts_list, $posts_published);
|
||||||
|
|
||||||
|
mp_show_api_key_n_ip();
|
||||||
|
|
||||||
|
if (count($posts_no_address) > 0)
|
||||||
|
mp_show_list_posts_no_address($posts_no_address);
|
||||||
|
|
||||||
|
if (count($posts_no_coordinates) > 0){
|
||||||
|
mp_show_list_posts_no_coordinates($posts_no_coordinates);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
echo <<<HTML
|
||||||
|
<p style="color: green;">✔ tous les articles ont des coordonnees correctes :)</p>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
echo <<<HTML
|
||||||
|
</div>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
80
plug/map_prof/srcs/publish/mp_get_coordinates.php
Normal file
80
plug/map_prof/srcs/publish/mp_get_coordinates.php
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_get_address($id) {
|
||||||
|
$presentiel = get_field("mode", $id);
|
||||||
|
|
||||||
|
if (empty($presentiel))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
// irl or online
|
||||||
|
if ($presentiel[0] === "En présentiel")
|
||||||
|
$address = get_field("adresse", $id);
|
||||||
|
else
|
||||||
|
$address = get_field("pays", $id);
|
||||||
|
|
||||||
|
return $address;
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_get_coordinates($id) {
|
||||||
|
global $mp_api_key_geo;
|
||||||
|
$event = (object)[];
|
||||||
|
$location = (object)[];
|
||||||
|
$location->coordinates = null;
|
||||||
|
$location->street = "";
|
||||||
|
$location->city = "";
|
||||||
|
$location->country = "";
|
||||||
|
$location->address = "";
|
||||||
|
$location->approximate = false;
|
||||||
|
|
||||||
|
$address = mp_get_address($id);
|
||||||
|
//mp_console_log("adresse: " . $address);
|
||||||
|
|
||||||
|
// get coordinates from google maps api
|
||||||
|
$geolocation = 'https://maps.googleapis.com/maps/api/geocode/json'
|
||||||
|
. '?language=fr'
|
||||||
|
. '&address=' . urlencode($address)
|
||||||
|
. '&key=' . $mp_api_key_geo;
|
||||||
|
//mp_console_log("geolocation:");
|
||||||
|
//mp_console_log($geolocation);
|
||||||
|
$jsoncontent = file_get_contents($geolocation);
|
||||||
|
mp_console_log("jsoncontent:");
|
||||||
|
mp_console_log($jsoncontent);
|
||||||
|
|
||||||
|
// extract coordinates from json
|
||||||
|
// https://developers.google.com/maps/documentation/geocoding/requests-geocoding#Types
|
||||||
|
$content = json_decode($jsoncontent);
|
||||||
|
$location->coordinates = $content->results[0]->geometry->location;
|
||||||
|
$location->address = $content->results[0]->formatted_address;
|
||||||
|
foreach ($content->results[0]->address_components as $component) {
|
||||||
|
if (in_array("street_number", $component->types))
|
||||||
|
$location->street = $component->long_name;
|
||||||
|
else if (in_array("route", $component->types)) {
|
||||||
|
if (strlen($location->street) != 0)
|
||||||
|
$location->street .= " ";
|
||||||
|
$location->street .= $component->long_name;
|
||||||
|
}
|
||||||
|
else if (in_array("locality", $component->types))
|
||||||
|
$location->city = $component->long_name;
|
||||||
|
else if (in_array("postal_town", $component->types)) {
|
||||||
|
if (strlen($location->city) != 0)
|
||||||
|
$location->city .= "/";
|
||||||
|
$location->city .= $component->long_name;
|
||||||
|
}
|
||||||
|
else if (in_array("country", $component->types))
|
||||||
|
$location->country = $component->long_name;
|
||||||
|
}
|
||||||
|
if ($content->results[0]->geometry->location_type == "APPROXIMATE")
|
||||||
|
$location->approximate = true;
|
||||||
|
|
||||||
|
// clean strings
|
||||||
|
foreach ($location as $value) {
|
||||||
|
if (gettype($value) != "string")
|
||||||
|
continue;
|
||||||
|
$value = trim($value, " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $location;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
48
plug/map_prof/srcs/publish/mp_update_publish.php
Normal file
48
plug/map_prof/srcs/publish/mp_update_publish.php
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
function mp_update_publish() {
|
||||||
|
$post_args = array(
|
||||||
|
'numberposts' => -1,
|
||||||
|
//'post_status' => 'draft',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
'post_type' => 'post',
|
||||||
|
);
|
||||||
|
$post_list = get_posts($post_args);
|
||||||
|
foreach ($post_list as $post) {
|
||||||
|
wp_update_post(array(
|
||||||
|
'ID' => $post->ID,
|
||||||
|
//'post_status' => 'draft',
|
||||||
|
'post_status' => 'publish',
|
||||||
|
));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
add_action( 'admin_post_update_publish', 'mp_update_publish' );
|
||||||
|
add_action( 'admin_post_nopriv_update_publish', 'mp_update_publish' );
|
||||||
|
|
||||||
|
// https://developer.wordpress.org/reference/hooks/admin_post_action/
|
||||||
|
// https://wordpress.stackexchange.com/questions/309440/wordpress-plugin-how-to-run-function-when-button-is-clicked
|
||||||
|
function mp_create_republish_button() {
|
||||||
|
$content = '
|
||||||
|
<br />
|
||||||
|
<div style="border:1px solid black;padding:20px;">
|
||||||
|
<h2>mettre a jour les publications</h2>
|
||||||
|
<p>
|
||||||
|
cliquez sur ce bouton pour mettre a jour toutes les publications
|
||||||
|
<br />
|
||||||
|
une nouvelle page vide va s\'ouvrir dans un nouvel onglet, vous pouvez la fermer
|
||||||
|
</p>
|
||||||
|
<form action="'.admin_url('admin-post.php').'" method="post" target="_blank">
|
||||||
|
<input type="hidden" name="action" value="update_publish">
|
||||||
|
<input type="submit" value="mettre a jour">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<br />
|
||||||
|
';
|
||||||
|
return $content;
|
||||||
|
}
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
?>
|
||||||
22
plug/map_prof/styles/mp__style.css
Normal file
22
plug/map_prof/styles/mp__style.css
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
|
||||||
|
@import "mp_info_windows.css";
|
||||||
|
@import "mp_zoom.css";
|
||||||
|
@import "mp_filters.css";
|
||||||
|
|
||||||
|
#ljdp_map_wrapper {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ljdp_map {
|
||||||
|
height: 600px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media only screen and (max-width: 700px) {
|
||||||
|
#ljdp_map {
|
||||||
|
height: 400px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
146
plug/map_prof/styles/mp_filters.css
Normal file
146
plug/map_prof/styles/mp_filters.css
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* FILTERS
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
#ba197a;
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
GENERAL SETTINGS
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
#ljdp_map_filters,
|
||||||
|
#ljdp_map_filters * {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
position: relative;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ljdp_map_filters {
|
||||||
|
display: flex !important;
|
||||||
|
position: relative;
|
||||||
|
width: 100%;
|
||||||
|
z-index: 1;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
#ljdp_map_filters .filter_menu {
|
||||||
|
display: flex !important;
|
||||||
|
width: auto;
|
||||||
|
cursor: pointer;
|
||||||
|
border-radius: 3px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
DROP DOWN MENU
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
*/
|
||||||
|
#ljdp_map_filters .filter_menu_drop {
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
margin: 0px;
|
||||||
|
padding: 5px;
|
||||||
|
font-size: 100%;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #666;
|
||||||
|
border: 1px solid #ba197a;
|
||||||
|
}
|
||||||
|
#ljdp_map_filters .filter_menu_drop option {
|
||||||
|
font-size: 100%;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
MENU CHECKBOX
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ljdp_map_filters .filter_menu_checkbox p {
|
||||||
|
--size: 16px;
|
||||||
|
--left-offset: calc( var(--size) + 5px );
|
||||||
|
margin-left: var(--left-offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ljdp_map_filters .filter_menu_checkbox p::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: calc( 50% - var(--size) / 2 - 1px );
|
||||||
|
left: calc( var(--left-offset) * -1 );
|
||||||
|
border: 1px solid #ba197a;
|
||||||
|
border-radius: 3px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
width: var(--size);
|
||||||
|
height: var(--size);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ljdp_map_filters input.filter_menu_checkbox:checked
|
||||||
|
+ label.filter_menu_checkbox p::before {
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ljdp_map_filters input.filter_menu_checkbox:disabled
|
||||||
|
+ label.filter_menu_checkbox {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
#ljdp_map_filters input.filter_menu_checkbox:disabled
|
||||||
|
+ label.filter_menu_checkbox p::before {
|
||||||
|
border-color: #ccc;
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
#ljdp_map_filters input.filter_menu_checkbox:disabled
|
||||||
|
+ label.filter_menu_checkbox p {
|
||||||
|
color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
MENU RESET
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ljdp_map_filters .filter_menu_reset {
|
||||||
|
/*
|
||||||
|
flex-shrink: 2;
|
||||||
|
white-space: nowrap;
|
||||||
|
*/
|
||||||
|
border: 1px solid #ba197a;
|
||||||
|
background-color: #ba197a;
|
||||||
|
color: #fff;
|
||||||
|
padding: 5px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
RESONSIVE DESIGN
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@media only screen and (max-width: 700px) {
|
||||||
|
#ljdp_map_filters {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
margin: 10px;
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
187
plug/map_prof/styles/mp_info_windows.css
Normal file
187
plug/map_prof/styles/mp_info_windows.css
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* INFO WINDOW
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
GOOGLE WINDOW
|
||||||
|
*/
|
||||||
|
|
||||||
|
div.gm-style-iw.gm-style-iw-c {
|
||||||
|
padding: 0px !important;
|
||||||
|
background-color: transparent;
|
||||||
|
pointer-events: none;
|
||||||
|
box-shadow: 0 2px 7px 1px rgba(0,0,0,.3);
|
||||||
|
box-shadow: none;
|
||||||
|
border-radius: 0 !important;
|
||||||
|
max-width: 75vw !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
GOOGLE TRIANGLE
|
||||||
|
*/
|
||||||
|
|
||||||
|
.gm-style-iw-tc {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
GOOGLE CROICE
|
||||||
|
*/
|
||||||
|
|
||||||
|
button.gm-ui-hover-effect {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
CONTENT
|
||||||
|
*/
|
||||||
|
|
||||||
|
#infowindow_limits,
|
||||||
|
#infowindow_limits * {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
position: relative;
|
||||||
|
margin: auto;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits {
|
||||||
|
/* height must be twice js 'height' value (mp_info_windows.js -> '{ ... height: XXX }' */
|
||||||
|
height: 550px;
|
||||||
|
max-width: 380px;
|
||||||
|
flex-direction: column;
|
||||||
|
pointer-events: none;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits .infowindow {
|
||||||
|
pointer-events: auto;
|
||||||
|
height: auto;
|
||||||
|
max-height: 400px;
|
||||||
|
padding: 0px;
|
||||||
|
overflow: scroll;
|
||||||
|
flex-direction: column;
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: #fff;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits #infowindow_close {
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
right: 0px;
|
||||||
|
width: 30px;
|
||||||
|
height: 30px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits #infowindow_close::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: calc(50% - 0.8px);
|
||||||
|
left: 25%;
|
||||||
|
width: 50%;
|
||||||
|
height: 1.6px;
|
||||||
|
background-color: #fff;
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits #infowindow_close::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: calc(50% - 0.8px);
|
||||||
|
left: 25%;
|
||||||
|
width: 50%;
|
||||||
|
height: 1.6px;
|
||||||
|
background-color: #fff;
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits .infowindow_head {
|
||||||
|
padding: 5px 10px;
|
||||||
|
margin: 0px;
|
||||||
|
background-color: #ab197a;
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits .infowindow_head p {
|
||||||
|
font-size: 115%;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 1.7em;
|
||||||
|
color: #fff;
|
||||||
|
margin-right: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits .infowindow_body {
|
||||||
|
padding: 10px 10px 10px 10px;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits .infowindow_body::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0px;
|
||||||
|
left: 0px;
|
||||||
|
margin: 0px;
|
||||||
|
width: 100%;
|
||||||
|
height: 1px;
|
||||||
|
background-color: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
#infowindow_limits .infowindow_body p {
|
||||||
|
font-size: 115%;
|
||||||
|
font-weight: 500;
|
||||||
|
line-height: 1.7em;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
HIDE SCROLL BARS
|
||||||
|
*/
|
||||||
|
/* chrome safari opera */
|
||||||
|
.gm-style-iw-d::-webkit-scrollbar,
|
||||||
|
#infowindow_limits::-webkit-scrollbar,
|
||||||
|
#infowindow_limits .infowindow::-webkit-scrollbar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gm-style-iw-d,
|
||||||
|
#infowindow_limits,
|
||||||
|
#infowindow_limits .infowindow {
|
||||||
|
-ms-overflow-style: none; /* Ie edge */
|
||||||
|
scrollbar-width: none; /* firefox */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* **************************************
|
||||||
|
MOBILE RESPONSIVE
|
||||||
|
*/
|
||||||
|
|
||||||
|
@media only screen and (max-width: 400px) {
|
||||||
|
#infowindow_limits .infowindow_body p,
|
||||||
|
#infowindow_limits .infowindow_head p {
|
||||||
|
font-size: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
24
plug/map_prof/styles/mp_zoom.css
Normal file
24
plug/map_prof/styles/mp_zoom.css
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* ZOOM BUTTONS
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* hide the rectangular box container
|
||||||
|
div.gmnoprint div {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/* shape buttons in circles
|
||||||
|
button.gm-control-active {
|
||||||
|
visibility: visible;
|
||||||
|
border-radius: 50% !important;
|
||||||
|
background-color: rgb(255, 255, 255) !important;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/* gap between the buttons
|
||||||
|
button.gm-control-active ~ div {
|
||||||
|
height: 10px !important;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
28
plug/map_prof/utils/mp_console_log.php
Normal file
28
plug/map_prof/utils/mp_console_log.php
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
// https://stackify.com/how-to-log-to-console-in-php/
|
||||||
|
|
||||||
|
function mp_log($output) {
|
||||||
|
$type = gettype($output);
|
||||||
|
if ($type == 'object')
|
||||||
|
$output = serialize($output);
|
||||||
|
$time = date('H:i');
|
||||||
|
$file = '/var/www/html/wp-debug.log';
|
||||||
|
file_put_contents($file, $time . " " . $output . "\n", FILE_APPEND);
|
||||||
|
}
|
||||||
|
|
||||||
|
function mp_console_log($output) {
|
||||||
|
$js_code = 'console.log(' . json_encode($output, JSON_HEX_TAG) . ');';
|
||||||
|
$js_code = '<script>' . $js_code . '</script>';
|
||||||
|
echo $js_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
// function mp_console_log($output, $with_script_tags = true) {
|
||||||
|
// $js_code = 'console.log(' . json_encode($output, JSON_HEX_TAG) .
|
||||||
|
// ');';
|
||||||
|
// if ($with_script_tags) {
|
||||||
|
// $js_code = '<script>' . $js_code . '</script>';
|
||||||
|
// }
|
||||||
|
// echo $js_code;
|
||||||
|
// }
|
||||||
|
|
||||||
|
?>
|
||||||
18
plug/map_prof/utils/mp_get_ip.php
Normal file
18
plug/map_prof/utils/mp_get_ip.php
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
function mp_get_ip() {
|
||||||
|
$external_ip = "";
|
||||||
|
// curl with php :
|
||||||
|
// https://www.php.net/manual/en/function.curl-init.php
|
||||||
|
$ch = curl_init('https://ifconfig.me/ip');
|
||||||
|
// CURLOPT_RETURNTRANSFER is set to true, which means that cURL should return the response from the HTTP request as a string, rather than printing it to the screen
|
||||||
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||||||
|
$external_ip = curl_exec($ch);
|
||||||
|
//mp_console_log("ip:");
|
||||||
|
//mp_console_log($external_ip);
|
||||||
|
curl_close($ch);
|
||||||
|
|
||||||
|
return $external_ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
BIN
plug/map_prof_2.zip
Normal file
BIN
plug/map_prof_2.zip
Normal file
Binary file not shown.
BIN
plug/map_prof_3.zip
Normal file
BIN
plug/map_prof_3.zip
Normal file
Binary file not shown.
@@ -42,8 +42,8 @@ EXECUTION_TIME=300
|
|||||||
#EXPEND_HOST_VOLUME_PLUGINS=$PWD_PATH/srcs/plugins
|
#EXPEND_HOST_VOLUME_PLUGINS=$PWD_PATH/srcs/plugins
|
||||||
#EXPEND_HOST_VOLUME_CERTS=$PWD_PATH/srcs/requirements/nginx/conf/ssl
|
#EXPEND_HOST_VOLUME_CERTS=$PWD_PATH/srcs/requirements/nginx/conf/ssl
|
||||||
# EXPENDED LINES :
|
# EXPENDED LINES :
|
||||||
HOST_VOLUME_CERTS=/home/asususus/Nextcloud/informatique/lejourduprof/srcs/requirements/nginx/conf/ssl
|
HOST_VOLUME_CERTS=/home/asususus/nextcloud_backup/backup_planethoster_server/nextclouddata/hugogogo/files/informatique/ljdp/srcs/requirements/nginx/conf/ssl
|
||||||
HOST_VOLUME_PLUGINS=/home/asususus/Nextcloud/informatique/lejourduprof/srcs/plugins
|
HOST_VOLUME_PLUGINS=/home/asususus/nextcloud_backup/backup_planethoster_server/nextclouddata/hugogogo/files/informatique/ljdp/srcs/plugins
|
||||||
HOST_VOLUME_DB=/home/asususus/data/lejourduprof/db_volume
|
HOST_VOLUME_DB=/home/asususus/data/lejourduprof/db_volume
|
||||||
HOST_VOLUME_WP=/home/asususus/data/lejourduprof/wp_volume
|
HOST_VOLUME_WP=/home/asususus/data/lejourduprof/wp_volume
|
||||||
|
|
||||||
|
|||||||
@@ -135,8 +135,8 @@ add_action( 'publish_post', 'post_published_coordinates', 10, 2 );
|
|||||||
|
|
||||||
function ljdp_map_menu() {
|
function ljdp_map_menu() {
|
||||||
add_menu_page(
|
add_menu_page(
|
||||||
'ljdp map', // page_title
|
'JIPF map', // page_title
|
||||||
'ljdp map', // menu_title
|
'JIPF map', // menu_title
|
||||||
'manage_options', // capability
|
'manage_options', // capability
|
||||||
'ljdp-map-plugin', // menu_slug
|
'ljdp-map-plugin', // menu_slug
|
||||||
'ljdp_map_plugin_content' // callback function to display page content
|
'ljdp_map_plugin_content' // callback function to display page content
|
||||||
|
|||||||
@@ -53,6 +53,8 @@ function mp_fill_name($fields, $name, &$menu, $index) {
|
|||||||
continue;
|
continue;
|
||||||
if (! isset($menu_item->$key_field) )
|
if (! isset($menu_item->$key_field) )
|
||||||
$menu_item->$key_field = [];
|
$menu_item->$key_field = [];
|
||||||
|
if (!is_string($value))
|
||||||
|
continue;
|
||||||
if (strlen($value) != 0) {
|
if (strlen($value) != 0) {
|
||||||
if (! in_array($value, $menu_item->$key_field) )
|
if (! in_array($value, $menu_item->$key_field) )
|
||||||
array_push($menu_item->$key_field, $value);
|
array_push($menu_item->$key_field, $value);
|
||||||
@@ -71,6 +73,8 @@ function mp_fill_name($fields, $name, &$menu, $index) {
|
|||||||
if ($key_field == $name)
|
if ($key_field == $name)
|
||||||
continue;
|
continue;
|
||||||
$menu_item->$key_field = [];
|
$menu_item->$key_field = [];
|
||||||
|
if (!is_string($value))
|
||||||
|
continue;
|
||||||
if (strlen($value) != 0)
|
if (strlen($value) != 0)
|
||||||
array_push($menu_item->$key_field, $value);
|
array_push($menu_item->$key_field, $value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,7 +84,8 @@ function mp_show_list_posts_no_address($posts) {
|
|||||||
echo ' (status: ';
|
echo ' (status: ';
|
||||||
echo $post->post_status;
|
echo $post->post_status;
|
||||||
echo ') - ';
|
echo ') - ';
|
||||||
echo $post->mode[0];
|
if (!empty($post->mode))
|
||||||
|
echo $post->mode[0];
|
||||||
echo ' : </b>';
|
echo ' : </b>';
|
||||||
echo $post->post_title;
|
echo $post->post_title;
|
||||||
echo <<<HTML
|
echo <<<HTML
|
||||||
@@ -128,7 +129,8 @@ function mp_show_list_posts_no_coordinates($posts) {
|
|||||||
echo ' (status: ';
|
echo ' (status: ';
|
||||||
echo $post->post_status;
|
echo $post->post_status;
|
||||||
echo ') - ';
|
echo ') - ';
|
||||||
echo $post->mode[0];
|
if (!empty($post->mode))
|
||||||
|
echo $post->mode[0];
|
||||||
echo ' : </b>';
|
echo ' : </b>';
|
||||||
echo $post->post_title;
|
echo $post->post_title;
|
||||||
echo <<<HTML
|
echo <<<HTML
|
||||||
@@ -229,7 +231,7 @@ function ljdp_map_plugin_content() {
|
|||||||
|
|
||||||
echo <<<HTML
|
echo <<<HTML
|
||||||
<div>
|
<div>
|
||||||
<h2>ljdp map plugin</h2>
|
<h2>JIPF map plugin</h2>
|
||||||
HTML;
|
HTML;
|
||||||
|
|
||||||
mp_show_post_number($posts_list, $posts_published);
|
mp_show_post_number($posts_list, $posts_published);
|
||||||
@@ -239,8 +241,9 @@ function ljdp_map_plugin_content() {
|
|||||||
if (count($posts_no_address) > 0)
|
if (count($posts_no_address) > 0)
|
||||||
mp_show_list_posts_no_address($posts_no_address);
|
mp_show_list_posts_no_address($posts_no_address);
|
||||||
|
|
||||||
if (count($posts_no_coordinates) > 0)
|
if (count($posts_no_coordinates) > 0){
|
||||||
mp_show_list_posts_no_coordinates($posts_no_coordinates);
|
mp_show_list_posts_no_coordinates($posts_no_coordinates);
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
echo <<<HTML
|
echo <<<HTML
|
||||||
<p style="color: green;">✔ tous les articles ont des coordonnees correctes :)</p>
|
<p style="color: green;">✔ tous les articles ont des coordonnees correctes :)</p>
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
function mp_get_address($id) {
|
function mp_get_address($id) {
|
||||||
$presentiel = get_field("mode", $id);
|
$presentiel = get_field("mode", $id);
|
||||||
|
|
||||||
|
if (empty($presentiel))
|
||||||
|
return null;
|
||||||
|
|
||||||
// irl or online
|
// irl or online
|
||||||
if ($presentiel[0] === "En présentiel")
|
if ($presentiel[0] === "En présentiel")
|
||||||
|
|||||||
Reference in New Issue
Block a user