Wordpress подсчитывает дочерние записи каждого родительского пользовательского типа записей и использует их в массиве json для плагина jquery google maps
Итак, я ищу уже пару дней и нигде не могу найти решение этой проблемы. Это довольно индивидуальный запрос от клиента... Я использую плагин jQuery google maps для добавления маркеров для каждой записи (области), которую администратор создает с помощью пользовательского мета-поля с широкими и длинными координатами.
С каждым из этих маркеров связана всплывающая подсказка. В подсказке у меня есть текст, заголовок каждого сообщения, используемый для создания самого маркера, и постоянная ссылка на сообщение (область).
Но я хотел бы отобразить количество всех дочерних сообщений (сделок) каждого из сообщений (областей).
Я работаю над самими сообщениями (области), но не могу заставить их отображаться во всплывающих подсказках на карте.
Это код, который у меня есть до сих пор, я не думаю, что я далек от решения, но мои навыки php все еще находятся на уровне новичка, поэтому любая помощь будет очень признательна.
<script type="text/javascript">
$(document).ready(function(){
var myMarkers = {"markers": [
<?php $items3 = new wp_Query( array(
'post_type' => 'area',
'post_status' => 'publish',
'posts_per_page' => -1,
'orderby' => 'date',
'order' => 'desc',
) );
$post_id = $post->ID; //or somehow get the current post ID.
$parent_id = get_post_ancestors($post_id);
$parent = get_post_type( $parent_id );
$args = array(
'post_type' => 'deal',
'post_status' => 'published',
'post_parent' => $parent,
'numberposts' => -1
);
$this_page_id=$wp_query->post->ID;
$num = count( get_posts( $args ) );
while ( $items3->have_posts() ) : $items3->the_post(); ?>
{"latitude": "<?php echo get_post_meta($post->ID, '_arealat', true); ?>", "longitude": "<?php echo get_post_meta($post->ID, '_arealong', true); ?>", "icon": "/wp-content/themes/localdoubleglazingdeals/assets/img/design/logo-icon.png", "baloon_text": 'We have <span><?php echo $num ?></span> deals in <strong><?php the_title(); ?></strong><br/><a href="<?php the_permalink(); ?>">View deals</a>'},
<?php endwhile; ?>
]
};
$("#map").mapmarker({
zoom : 7,
center : 'Liverpool',
markers : myMarkers
});
});
Это...
<?php echo $num ?>
Часть, которой я являюсь застрял.
1 answers
Прежде всего, вы всегда должны отделять php от javascript.
Вообще говоря, это плохая практика смешивать их, и, в частности, для WordPress, это также заставляет вас добавлять встроенный javascript вместо правильного использования WordPress: использование wp_enqueue_script
.
Когда вам нужно передать переменные из PHP в javascript, правильный способ WordPress для этого - использовать wp_localize_script
.
Итак, ваш код javascript должен быть примерно таким:
jQuery(document).ready(function($){
var myMarkers = {"markers": [ my_map_data.markers ] };
$("#map").mapmarker({
zoom : 7,
center : 'Liverpool',
markers : myMarkers
});
});
Читабельно, не так ли? Также обратите внимание, как я использовал оболочку jQuery без конфликтов, это потому, что я надеюсь, что вы правильно ставите jQuery в очередь (т.Е. Используете wp_enqueue_script
для загрузки встроенной версии jQuery WP), и если это так, WordPress использует jQuery в режиме без конфликтов, поэтому, чтобы он работал, вы должны использовать без оболочек конфликтов.
Теперь, когда у вас есть приведенный выше код, вы должны сохранить его в файле и назвать его, например my-map.js и сохраните в папке темы (вложенной) (или в папке плагина, если вы разрабатываете плагин).
Предполагая, что здесь вы сохраните этот файл в подпапке "js" вашей темы.
Теперь вам нужно включить в правильный шаблон. Я не знаю, где вы печатаете карту, и я предполагаю, что здесь у вас есть шаблон страницы под названием 'page-map.php'
, и вы хотите включить туда свою карту, поэтому вам нужно включить туда свой javascript.
В вашем functions.php
вы должны добавить:
add_action('wp_enqueue_scripts', 'add_map_scripts');
function add_map_scripts() {
if ( is_page_template('page-map.php') ) {
$jsurl = get_template_directory_uri() . '/js/my-map.js';
wp_enqueue_script('my-map', $jsurl, array('jquery') );
wp_localize_script('my-map', 'my_map_data', get_map_data() );
}
}
Это правильный способ добавить скрипт в WordPress. Если вы посмотрите на wp_enqueue_script
документы, которые я связал, вы увидите, что я добавлен 3-й аргумент функции, это массив зависимостей, любой скрипт, который вы добавили в массив, если он еще не включен на странице, будет добавлен, а также ваш скрипт будет включен после этого. Я включил jQuery в массив зависимостей, таким образом, я уверен, что jQuery будет добавлен на страницу: если вы вручную добавляете jquery на страницу... уберите его.
Вы сказали, что используете плагин, у которого есть собственный js-скрипт, вы должны посмотреть на дескриптор этого скрипта (это первый параметр wp_enqueue_script
) и добавьте его в массив зависимостей, таким образом, вы уверены, что ваш скрипт добавлен после скрипта плагина.
Теперь, если вы посмотрите на код javascript, который я опубликовал, вы заметите, что массив маркеров взят из переменной my_map_data.markers
. Но где определена эта переменная?
Ответ содержится в wp_localize_script
, который я вызвал в приведенном выше коде, сразу после wp_enqueue_script
. Если вы видите документы wp_localize_script
, на которые я ссылался выше, вы видите, что я передаю объект скрипту под названием 'my_map_data'
и его содержимое объект - это то, что возвращается функцией get_map_data
. эта функция еще не существует, поэтому давайте напишем ее (должна идти в вашем functions.php
):
function get_map_data() {
// assure we are in right page
if ( ! is_page_template('page-map.php' ) return;
$areas = new WP_Query( array(
'post_type' => 'area', 'post_status' => 'publish', 'posts_per_page' => -1,
'orderby' => 'date', 'order' => 'desc'
) );
if ( ! $areas->have_posts() ) return; // no areas, nothing to do
$markers = array();
while ( $areas->have_posts() ) : $areas->the_post();
global $post; // current area post object
$deals_args = array(
'post_type' => 'deal', 'post_status' => 'publish', 'numberposts' => -1
'post_parent' => $post->post_parent
);
$d_num = count( get_posts($deals_args) );
$ballon_f = 'We have <span>%d</span> deals in <strong>%s</strong>';
$ballon_f .= '<br/><a href="%s">View deals</a>';
$marker = array(
'latidude' => get_post_meta( get_the_ID(), '_arealat', true),
'longitude' => get_post_meta( get_the_ID(), '_arealong', true),
'icon': get_template_directory_uri() . '/assets/img/design/logo-icon.png',
'baloon_text' => sprintf($ballon_f, $d_num, get_the_title(), get_permalink() );
);
$markers[] = (object) $marker; // collect all markes in the $markes array
endwhile;
wp_reset_postdata(); // reset the post data after the custom query
// return the array of markes to wp_localize_script that will json_encode it and
// pass it to javascipt
return array( 'markers' => $markers );
}
Теперь наша функция возвращает массив в wp_localize_script
, и эта функция преобразует этот массив в JSON и передает его как глобальный объект (с именем "my_map_data") в javascript. Таким образом, когда в javascript вы используете
{"markers": [ my_map_data.markers ] };
Он будет содержать массив объектов, созданных функцией get_map_data
.