Динамическое изменение навигационных ссылок (next и previous) в Wordpress через AJAX
у меня на моем сайте wordpress, внутри цикла single.php, тег select, в котором параметры являются сообщениями текущей категории, возвращаемыми через пользовательский запрос.
при изменении выбранного параметра у меня есть много функций javascript, которые работают хорошо, но последняя функция среди них (function f_next-previous
), похоже, не работает.
цель этой функции-обновить следующие и предыдущие ссылки без перезагрузки страницы.
код относительно навигационные ссылки (следующие и предыдущие) в моем шаблоне работают хорошо и выше:
<div id="nav-above" class="navigation">
<div class="nav-previous"><?php previous_post_link( '%link', '<img height="34" src="' . get_bloginfo("template_directory") . '/images/previous.png" />' ); ?></div>
<div class="nav-next"><?php next_post_link( '%link', '<img height="34" src="' . get_bloginfo("template_directory") . '/images/next.png" />' ); ?></div>
</div><!-- #nav-above -->
код javascript этой функции:
function f_next-previous(id)
{
$.ajax({
cache: true,
type: "GET",
timeout: 5000,
url: 'wp-content/themes/twentyten/pages/next-previous.php?p='+id,
success: function(msg)
{
$('#nav-above').html(msg);
},
error: function(msg)
{
alert("Your browser broke!");
return false;
}
});
}
файл next-previous.php
содержание :
<?php
$p=$_GET['p'];
require( '../../../wp-load.php' );
$my_query = new WP_Query();
$my_query->query(array( 'post__in' => array($p)));
if ($my_query->have_posts()) : while ($my_query->have_posts()) : $my_query->the_post(); ?>
<div class="nav-previous"><?php previous_post_link( '%link', '<img height="34" src="' . get_bloginfo("template_directory") . '/images/previous.png" />' ); ?></div>
<div class="nav-next"><?php next_post_link( '%link', '<img height="34" src="' . get_bloginfo("template_directory") . '/images/next.png" />' ); ?></div>
<?php
endwhile;
endif;
?>
при тестировании этого php-файла, давая ему значение параметра p, он дает логический результат в браузере. JQuery и функциональные скрипты хорошо включены, и все AJAX на моем сайте в порядке. Чего мне не хватает в этом? работа????
обновление: Обратите внимание, что часть моего сингла.php-файл, ответственный за запуск вызова AJAX:
<form method="post" action="">
<select class="select2" name="" id="" >
<option value="<?php the_ID();?>"><?php the_title();?></option>
<?php
global $post;
$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : 1;
$myposts = get_posts("paged=$paged&category=4");
foreach($myposts as $post) :?>
<option value="<?php the_ID();?>"><?php the_title();?></option>
<?php endforeach;
wp_reset_postdata(); ?>
</select>
</form>
1 ответов
во-первых, я хочу отметить, что подход, который я упомянул в своем вопросе, плох в соответствии с почти учебниками, говорящими об AJAX в wordpress. Поэтому я решил изменить его, основываясь на совете hakre
и его ссылка:http://codex.wordpress.org/AJAX_in_Plugins#Ajax_on_the_Viewer-Facing_Side.
другими словами, лучший способ для моей ситуации-использовать встроенный AJAX в Wordpress, используя wp-admin / admin-ajax.РНР. Запросы AJAX должны быть направлены в этот файл. Я знаю, что часть "admin" имени файла немного вводит в заблуждение. но все запросы в интерфейсе (сторона просмотра), а также панель администратора могут быть обработаны в admin-ajax.php, с большим количеством преимуществ, особенно для безопасности.
действия:
1.Код JavaScript, который отправляет запрос AJAX, должен выглядеть примерно так:
$(document).ready(function() {
$('.select2').change(function(e) {
e.preventDefault();
var v = $('.select2 option:selected').val();
$.ajax({
type: "GET",
url: "wp-admin/admin-ajax.php", // check the exact URL for your situation
dataType: 'html',
data: ({ action: 'nextPrevious', id: v}),
success: function(data){
$('#nav-above').html(data);
},
error: function(data)
{
alert("Your browser broke!");
return false;
}
});
});
});
обратите внимание, что вы должны уважать requeriements Вордпресс поставить JS скрипт (обычно в футере.php перед wp-footer ())
2 - Обработка действия:
на functions.php
вашей темы (или непосредственно в вашем файле плагина), добавьте:
add_action('wp_ajax_nextPrevious', 'nextPrevious');
add_action('wp_ajax_nopriv_nextPrevious', 'nextPrevious');
и определить в том же файле nextPrevious
функция обратного вызова такой:
function nextPrevious() {
$p= $_GET['id'];
$my_query = new WP_Query();
$my_query->query(array( 'post__in' => array($p)));
if ($my_query->have_posts()) : while ($my_query->have_posts()) : $my_query->the_post(); ?>
<div class="nav-previous"><?php previous_post_link( '%link', '<img height="34" src="' . get_bloginfo("template_directory") . '/images/previous.png" />' ); ?></div>
<div class="nav-next"><?php next_post_link( '%link', '<img height="34" src="' . get_bloginfo("template_directory") . '/images/next.png" />' ); ?></div>
<?php endwhile;
endif;
wp_reset_query();
die();
}
не забудьте функцию die, это обязательно.
для получения более подробной информации о AJAX в Wordpress, учебники первой страницы Google хороши.