Intereting Posts
Я хочу расширить текущие темы «single.php», чтобы отобразить мета-поля моего CPT Лучший способ обновить пользовательскую тему wp на сервере с локального хоста обновить идентификатор термина (сохраненный как пост-мета-значение) при экспорте / импорте сообщений генерировать автоматически увеличивающийся идентификационный номер при регистрации нового пользователя Получить атрибуты вложенных коротких кодов Как удалить некоторые параметры экрана и мета-ящики из добавления / редактирования типа сообщения? W3 Общий кеш «пустые все кеши» и никакие таблицы стилей не отображаются Как добавить столбец / s в таблицу wp_posts? Добавить категории и теги для WP User FrontEnd Запрос с отношением и один без отношения с использованием нескольких таксономий? Вставка кода AdSense сразу после тега </ head> Как повысить производительность для перенаправления домена.tld / 35 на domain.tld / full-permalink? Загрузите другой шаблон для CPT (в цикле) в моем плагине? Отображение разных страниц в зависимости от значения cookie Невозможно правильно установить функцию WordPress add_filter

Загрузка сообщений через AJAX в скрытом div с обновленным URL?

Я использую приведенный ниже код для асинхронной загрузки сообщений на одной странице индекса через AJAX. Я также хотел бы иметь возможность обновлять URL-адрес, но я не уверен, как я могу добавить это к тому, что у меня есть.

Конечной целью является эффект, подобный этому . Если вы нажмете на сообщение, вы сможете увидеть загрузку сообщений в скрытом div выше, и вы увидите, что URL-адреса обновляются в адресной строке.

Может кто-нибудь мне помочь?

Шаблон индекса

<div id="single-post-container"></div> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <a class="post-link" rel="<?php the_ID(); ?>" href="<?php the_permalink(); ?>"> <?php the_title(); ?> </a> <?php endwhile; endif; ?> 

Шаблон для одного сообщения

 <?php $post = get_post($_POST['id']); ?> <div id="single-post post-<?php the_ID(); ?>"> <?php while (have_posts()) : the_post(); ?> <?php the_title();?> <?php the_content();?> <?php endwhile;?> </div> 

JQuery

  $(document).ready(function(){ $.ajaxSetup({cache:false}); $(".post-link").click(function(){ var post_link = $(this).attr("href"); $("#single-post-container").html("content loading"); $("#single-post-container").load(post_link); return false; }); }); 

Edit: Кроме того, я прочитал из нескольких источников, что рекомендуется использовать WordPress в admin-ajax.php . Было бы полезно использовать admin-ajax.php и если да, то как бы я «переключил его» на то, что у меня сейчас?

Обновление (1/4/2015):


Шаблон индекса

 <div id="project-container"></div> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <a class="post-link" rel="<?php the_ID(); ?>" href="<?php the_permalink(); ?>"> <?php the_title(); ?> </a> <?php endwhile; endif; ?> 

Шаблон для одного сообщения

 <div id="single-post post-<?php the_ID(); ?>"> <?php while (have_posts()) : the_post(); ?> <?php the_title();?> <?php the_content();?> <?php endwhile;?> </div> 

functions.php

 /** * Enqueue scripts and styles. */ function starter_scripts() { wp_deregister_script( 'jquery' ); wp_register_script( 'jquery', includes_url( '/js/jquery/jquery.js' ), false, NULL, true ); wp_enqueue_script( 'jquery' ); wp_enqueue_style( 'starter-style', get_stylesheet_uri() ); wp_enqueue_script( 'includes', get_template_directory_uri() . '/js/min/includes.min.js', array('jquery'), '', true ); wp_enqueue_script( 'gray', get_template_directory_uri() . '/js/min/jquery.gray.min.js', array('jquery'), '', true ); wp_localize_script( 'includes', 'site', array( 'theme_path' => get_template_directory_uri(), 'ajaxurl' => admin_url('admin-ajax.php') ) ); } add_action( 'wp_enqueue_scripts', 'starter_scripts' ); /** * AJAX nopriv */ add_action('wp_ajax_load-single-post', 'prefix_ajax_single_post'); add_action('wp_ajax_nopriv_load-single-post', 'prefix_ajax_single_post'); function prefix_ajax_single_post() { $pid = (int) filter_input(INPUT_GET, 'pID', FILTER_SANITIZE_NUMBER_INT); if ($pid > 0) { global $post; $post = get_post($pid); setup_postdata($post); printf('<div id="single-post post-%d">', $pid); the_title(); the_content(); echo '</div>'; } exit(); } 

jQuery (includes.js)

 // Load posts via AJAX (function($, D){ $.ajaxSetup({cache:false}); $(".post-link").click(function(){ var postID = $(this).attr('rel'); var $container = $("#project-container"); $container.html("content loading"); $.get(D.ajaxurl, {action: 'load-single-post', pID: postID}, function(content) { $container.html(content); }); }); })(jQuery, site); 

Обновление URL-адреса через javascript не связано с WordPress, однако вам просто нужно изменить window.location.hash в вашем коде jQuery.

Что касается использования admin-ajax.php рекомендуется выполнить задачи с помощью AJAX, которые должны загружать среду WordPress, вместо того, чтобы вручную требовать wp-load.php .

В вашем случае вы отправляете запрос на обычный URL WordPress, так что это не так уж плохо, однако у вашего текущего кода есть некоторые проблемы.

« $_POST['id'] " Проблема

В вашем единственном письме у вас есть

 $post = get_post($_POST['id']); 

это не требуется вообще, потому что вы отправляете запрос на уникальный URL-адрес, это означает, что переменная сообщения автоматически устанавливается WordPress.

Более того, $_POST['id'] может быть не установлен, особенно если вы используете довольно постоянные ссылки, что вызовет предупреждение PHP.

Проблема «Single View»

Ваши уникальные сообщения будут по-прежнему иметь собственные постоянные ссылки. Если вы посетили одну из этих постоянных ссылок, вы увидите сломанную страницу html, которая не содержит тегов <html> , <head> или <body> , а только содержимое страницы.

Вы можете исправить эту проблему двумя способами:

  • используйте 'post_link' для изменения постоянной ссылки на сообщения и сделайте ее направленной на индексную страницу с соответствующим хэшем, а также 'post_link' перенаправление для отправки пользователям, которые вводят особый url в адресной строке, чтобы индексировать страницу с соответствующим хешем. Это может быть хорошо, но таким образом ваш пост никогда не может быть замечен в единственном представлении.

  • второй способ – отредактировать ваш единственный шаблон сообщения и условно вывести правильные теги html, когда страница загружается в обычном (то есть не AJAX) запросе.

     function is_ajax() { return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'; } if (is_ajax()) { // open here <html>, <head> and <body> tags } // page content here if (is_ajax()) { // close here <html>, <head> and <body> tags } 

Таким образом, при запросе с использованием регулярных запросов ваши сообщения отображаются на хорошо сформированной странице html.

Эффективные последствия

Используя один из двух способов, предложенных выше, вы можете решить основную проблему вашего текущего кода, но все еще есть проблема с производительностью.

Запросы на URL-адреса WordPress немного дороже, чем запросы admin-ajax.php . Даже если оба загружают полную среду WP, для регулярных запросов WordPress необходимо разрешить постоянную ссылку на запрос. Это делается путем загрузки набора правил перезаписи из базы данных и программным выполнением проверки регулярного выражения по любому из правил, пока один из них не соответствует текущему URL-адресу.

Если вы можете отправить запрос ajax, содержащий идентификатор сообщения, как часть самого запроса, вы сможете вывести пропущенное содержимое, которое проверяет и тем самым улучшает производительность.

Чтобы получить это, вы должны использовать API WordPress AJAX . Что-то вроде:

в functions.php

 add_action('wp_enqueue_scripts', function() { // $script_url is the full url to your js file wp_enqueue_script('myjs', $script_url, array('jquery'), true, null, true); wp_localize_script('myjs', 'myData', array('ajaxurl' => admin_url('admin-ajax.php)); }); add_action('wp_ajax_load-single-post', 'prefix_ajax_single_post'); add_action('wp_ajax_nopriv_load-single-post', 'prefix_ajax_single_post'); function prefix_ajax_single_post() { $pid = (int) filter_input(INPUT_GET, 'pID', FILTSER_SANITIZE_NUMBER_INT); if ($pid > 0) { global $post; $post = get_post($pid); setup_postdata($post); printf('<div id="single-post post-%d">', $pid); the_title(); the_content(); echo '</div>'; } exit(); } 

jQuery (идет в файл, чей url является $script_url var в коде выше)

 (function($, D){ $.ajaxSetup({cache:false}); $(".post-link").click(function(){ var postID = $(this).attr('rel'); var $container = $("#single-post-container"); $container.html("content loading"); $.get(D.ajaxurl, {action: 'load-single-post', pID: postID}, function(content) { $container.html(content); }); }); })(jQuery, myData); 

Код вашего индексного шаблона может оставаться неизменным.

Используя этот подход, все проблемы решаются, и, как вы видите, единственный шаблон сообщения вообще не задействован, это означает, что вы можете использовать его для отображения уникального почтового представления по своему усмотрению. (Если вы не хотите какого-либо сингулярного представления, первое предложение в разделе «Одиночный просмотр» может по-прежнему использоваться).