Modalitatea corectă de a încărca un articol prin Ajax
Încarc articole individuale prin Ajax într-un div setat pe pagina mea index. Totul funcționează bine în această privință. Vreau să folosesc history.js pentru a modifica/restaura starea astfel încât atunci când utilizatorii introduc example.com/my-post
în bara de adrese, să se încarce pagina index cu articolul deja încărcat în div. Aici apare problema.
Aceasta este o versiune simplificată a funcției pe care o folosesc (cea reală include și o animație):
function my_load_ajax_content () {
$args = array(
'p' => $_POST['post_id'],
'post_type' => 'projects'
);
$post_query = new WP_Query( $args );
while( $post_query->have_posts() ) : $post_query->the_post(); ?>
<div class="post-container">
<div id="project-content">
<?php the_title( '<h1 class="entry-title">', '</h1>' ); ?>
<?php the_content(); ?>
</div>
</div><!-- .post-container -->
<?php
endwhile;
wp_die();
}
add_action ( 'wp_ajax_nopriv_load-content', 'my_load_ajax_content' );
add_action ( 'wp_ajax_load-content', 'my_load_ajax_content' );
Așa o apelez:
$('.post-link').on('click', function(e) {
e.preventDefault();
var post_id = $(this).data('id'), // atributul data-id pentru .post-link
projectTitle = $(this).data('title'), // atributul data-title pentru .post-link
projectSlug = $(this).data('slug'), // atributul data-slug pentru .post-link
ajaxURL = site.ajaxurl; // URL-ul Ajax localizat din functions.php
$.ajax({
type: 'POST',
url: ajaxURL,
context: this,
data: {'action': 'load-content', post_id: post_id },
success: function(response) {
$('#project-container').html(response);
return false;
}
});
});
Aici este bucla
<?php $home_query = new WP_Query('post_type=projects');
while($home_query->have_posts()) : $home_query->the_post(); ?>
<article class="project">
<?php the_post_thumbnail( 'home-thumb' ); ?>
<div class="overlay">
<a class="post-link expand" href="<?php the_permalink(); ?>" data-id="<?php the_ID(); ?>" data-title="<?php the_title(); ?>" data-slug="<?php global $post; echo $post->post_name; ?>">+</a>
</div>
</article>
<?php endwhile; ?>
<?php wp_reset_postdata(); // resetează query-ul ?>
Mă întreb dacă abordez greșit această problemă. Sunt confuz și o parte din mine crede că ar trebui să pun tot HTML-ul în template-ul meu single
și să-l apelez din funcția Ajax. Dar apoi nu știu exact cum ar funcționa asta pentru că dacă utilizatorul introduce example.com/my-post
în browser, va încărca doar articolul individual fără tot HTML-ul de pe pagina index. Sper că explic corect. Poate cineva să-mi arate cum se face corect?
Iată părerea mea: Încarcă-l în single.php - de ce să folosești deloc ajax? Google nu va putea vedea acest conținut (folosind majoritatea crawlerelor).
În orice caz - iată modul corect de a returna datele...
te rog să notezi că poți folosi get_post sau wp_query. Depinde de tine.
Partea JS:
jQuery(document).ready(function($) {
$.post(ajax_object.ajaxurl, {
action: 'my_load_ajax_content ',
post_id: post_id // << ar trebui să obții asta din input...
}, function(data) {
var $response = $(data);
var postdata = $response.filter('#postdata').html();
$('.TARGETDIV').html(postdata);
});
});
Partea PHP:
function my_load_ajax_content () {
$pid = intval($_POST['post_id']);
$the_query = new WP_Query(array('p' => $pid));
if ($the_query->have_posts()) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
$data = '
<div class="post-container">
<div id="project-content">
<h1 class="entry-title">'.get_the_title().'</h1>
<div class="entry-content">'.get_the_content().'</div>
</div>
</div>
';
}
}
else {
echo '<div id="postdata">'.__('Nu am găsit nimic', THEME_NAME).'</div>';
}
wp_reset_postdata();
echo '<div id="postdata">'.$data.'</div>';
}
add_action ( 'wp_ajax_nopriv_load-content', 'my_load_ajax_content' );
add_action ( 'wp_ajax_load-content', 'my_load_ajax_content' );
Sper că acest lucru te ajută.
Din nou, nu aș recomanda să faci asta, dar... ar trebui să funcționeze.
REVIZIE PENTRU GET POST ON CLICK
În primul rând: butonul / linkul - ar trebui să arate cam așa:
<button class="get_project" data-postid="POSTID AICI!">NUMELE PROIECTULUI</button>
În al doilea rând: codul JS care ascultă după click:
jQuery(function($){
$('.get_project').click(function() {
var postid = $(this).attr('data-postid');
$.post(ajax_object.ajaxurl, {
action: 'my_load_ajax_content ',
postid: postid
}, function(data) {
var $response = $(data);
var postdata = $response.filter('#postdata').html();
$('.TARGETDIV').html(postdata);
});
})
});
Codul PHP nu necesită modificări - doar setează datele de care ai nevoie.

Scuze, cred că nu am fost clar în întrebarea mea. Nu am probleme cu preluarea postării. Am actualizat postarea pentru a-ți arăta apelul Ajax complet și, de asemenea, bucla mea WordPress. Problema mea este că atunci când reîncarc (sau introduc direct URL-ul proiectului în browser, adică example.com/post-title
, acesta nu se încarcă pentru că acel URL nu există. Deci, cum pot face să se încarce cu proiectul deja încărcat ca pe această pagină?

Scuze, încă nu înțeleg. Dacă postarea ta personalizată "single" nu apare - poate ai uitat să creezi o pagină single-projects.php? Când dai click pe un link către o pagină personalizată care are fișierul menit să afișeze acel conținut - atunci... nu ar trebui să ai nicio problemă. Acest lucru nu are nicio legătură cu ajax...!

Am și o pagină single și una single-projects, dar nu am nevoie de ele pentru că construiesc un site one-page. Postările vor fi doar pe pagina principală, așa că vreau să aibă URL-uri de genul: example.com/titlu-postare
în loc de example.com/proiecte/titlu-postare
. Pot redirecționa pe cea din urmă către prima folosind htaccess
, dar nu sunt sigur cum pot face postarea să se încarce folosind acel URL (example.com/titlu-postare
).

ascultă, amice... e greu de înțeles ce vrei cu adevărat. Când dai click pe link - nu vrei să mergi pe altă pagină? dar funcționalitatea ta cu ajax merge - deci? ce vrei? doar să adaugi o liniuță în url?

Nu, nu vreau să merg pe altă pagină. Vreau să se comporte exact ca această pagină dar fără hashtag în URL: http://themetrust.com/demos/reveal/#partitura

dar asta face exact ajax-ul... deci - ce parte îți lipsește? ce nu funcționează?

În primul rând... există un script care se încarcă înainte de jQuery (nu știu dacă are legătură) - văd apelul ajax dar URL-ul tău încă se încarcă. De ce nu încerci standardul meu - funcțional - testat ajax... Poți să mă contactezi și pe Skype și atunci poate pot arunca o privire mai atentă - skype-ul meu: sagive-seo
