Modalitatea corectă de a încărca un articol prin Ajax

24 ian. 2015, 17:31:20
Vizualizări: 20.9K
Voturi: 2

Î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?

7
Comentarii

dar, de ce ai nevoie de asta? adică, care ar putea fi motivul pentru a încărca conținutul folosind ajax în loc să afișezi datele direct în single.php? Nu știi că majoritatea motoarelor de căutare nu vor vedea deloc conținutul?!

Sagive Sagive
24 ian. 2015 19:02:54

@SagiveSEO Ei bine, acest site este similar cu ceea ce aveam în minte. Vezi cum se încarcă pagina cu proiectul deja în div? Am observat că în rezultatele de căutare, duce la template-ul single, ceea ce este ok pentru mine.

j85 j85
25 ian. 2015 02:31:38

Nu înțeleg... (Scuze). ce înseamnă "proiect deja în div" te referi la acest efect? https://mixitup.kunkalabs.com/ ??

Sagive Sagive
25 ian. 2015 04:03:15

@SagiveSEO Oh, nu acel efect. Scuze dacă nu am fost clar. Când dai click pe acest link, se deschide cu proiectul "Partitura" încărcat în div. Pagina principală se deschide fără niciun proiect încărcat.

j85 j85
25 ian. 2015 04:32:04

@SagiveSEO Este zona evidențiată cu roșu aici: http://i.imgur.com/md0a1Ul.jpg

j85 j85
25 ian. 2015 05:17:03

da, am înțeles după ce am analizat tema mai în detaliu... asta nu contează pentru codul pe care ți l-am dat. trebuie doar să preiei ceea ce dorești să returnezi. adică imaginea, video / etc... fragmentul, titlul și așa mai departe.

Sagive Sagive
25 ian. 2015 08:37:56

codul meu js funcționează la încărcarea paginii. Trebuie să-l înfășori cu jQuery și nu document.ready, apoi să asculți de un click de pe un buton care oferă id-ul postării și apoi să returnezi datele ca răspuns. vezi revizia 2

Sagive Sagive
25 ian. 2015 08:39:31
Arată celelalte 2 comentarii
Toate răspunsurile la întrebare 1
7

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.

24 ian. 2015 19:11:27
Comentarii

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ă?

j85 j85
25 ian. 2015 11:35:10

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...!

Sagive Sagive
25 ian. 2015 12:42:59

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).

Desi Desi
25 ian. 2015 16:54:30

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?

Sagive Sagive
25 ian. 2015 17:25:51

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

Desi Desi
25 ian. 2015 17:33:37

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

Sagive Sagive
25 ian. 2015 18:21:07

Î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

Sagive Sagive
26 ian. 2015 03:38:57
Arată celelalte 2 comentarii