web-dev-qa-db-fra.com

La bonne façon d'appeler les messages avec ajax

J'essaie d'écrire un plugin de galerie d'images avec jQuery. J'utilise la méthode jQuerys $ .post AJAX pour envoyer et recevoir des informations de la page de publication appropriée. Fondamentalement, je vais parcourir les pièces jointes et ajouter une nouvelle image à chaque fois que le bouton suivant est enfoncé, jusqu'à ce que toutes les images soient utilisées (lorsque je devrai retourner quelque chose pour arrêter AJAX, sans savoir comment. .. .).

J'ai lu des informations très contradictoires sur la façon de procéder. J'aimerais beaucoup savoir comment j'accède aux données et fonctions WP à partir d'un autre fichier PHP. Des idées? Je suis usé, stressé et hors de mon esprit avec celui-ci:)

2
Dan

Comme @MatthewBoynes l'a déjà indiqué, faire une demande $.post() pour chaque image peut entraîner des frais supplémentaires.

Une solution peut-être meilleure serait de les récupérer et de les mettre en cache, puis de les jeter dans vos fichiers js en utilisant wp_localize_script() .

$attachments = get_posts( array(
     'post_parent'    => get_the_ID()
    ,'post_type'      => 'attachment'
    ,'posts_per_page' => -1
    #,'exclude'        => get_post_thumbnail_ID() // only needed if we want to exclude the feat. image
) );

// Hook those to `wp_enqueue_scripts`
wp_register_script( 
     'gallery'
    ,get_template_directory_uri().'/js/gallery.js'
    ,array( 'jquery' )
    ,filemtime( get_template_directory().'/js/gallery.js' )
    ,true
);
wp_localize_script(
     'gallery'
    ,'gallery_object'
    ,json_encode( $attachments )
);

Ensuite, vous pouvez accéder au gallery_object depuis votre fichier ~/js/gallery.js et passer à l’image suivante avec un gestionnaire de clics .on().

1
kaiser

Utiliser ajax ici ne serait probablement pas dans votre intérêt (à une exception près, voir ci-dessous). Tout d'abord, vous allez créer des appels inutiles sur votre serveur pour interroger chaque image. Deuxièmement, les résultats ne pourront pas être mis en cache, surtout si vous faites des POST demandes (qui ne seraient pas la méthode/le verbe HTTP correct pour cela, car vous ne changez rien; dans Dans votre exemple, vous voudriez utiliser les requêtes GET [$.get() dans jQuery ajax speak], mais je digresse). Troisièmement, cela sera lent pour l'utilisateur.

La meilleure solution consiste à parcourir vos publications dans l'appel de la page initiale et à exporter les URL de l'image vers un tableau javascript ou à générer le tableau de vos publications au format JSON. Vous pouvez également parcourir et générer les balises <img>, mais les images se chargent immédiatement et non sur demande (que ce soit une bonne chose ou non, cela dépend du site et des images). Je choisirais la première option et voici comment procéder:

<script type="text/javascript">
var my_images = [
<?php
# Here is where you'll loop through your attachments
?>
];
</script>

La seule exception à cette règle est si vous aviez beaucoup d’images, par exemple. > 100 par page. Dans ce cas, vous devrez trouver le bon équilibre et faire des appels ajax pour des lots d'images, en combinant ce que vous demandez avec ce que j'ai suggéré ci-dessus.

Bonne chance!

Modifier:

Après réflexion, ce que je ferais serait de générer une liste de liens vers les images, avec les titres comme texte du lien, puis d'utiliser JS pour le lire, configurer le diaporama et charger dynamiquement les images (href de la balise link). à la demande. Ce n'est vraiment pas différent du tableau JS, sauf que les données sont stockées en HTML. Comme il est en HTML, il présente certains avantages: les navigateurs avec JS désactivé pourront toujours accéder aux photos, vous aurez des légendes pour les images, les moteurs de recherche qui ne traitent pas JS indexeront toujours les images, et votre J'espère que les titres d'images riches en mots clés seront également lus par les araignées. Voici comment vous pourriez configurer ceci, en partie tiré du codex :

<ul>
    <?php if ( have_posts() ) : while ( have_posts() ) : the_post();
    $attachments = get_posts( array(
        'post_type' => 'attachment',
        'numberposts' => -1,
        'post_status' => null,
        'post_parent' => $post->ID
    ) );
    if ( $attachments ) foreach ( $attachments as $attachment ) : ?>
    <li><a href="<?php echo wp_get_attachment_url( $attachment->ID ); ?>"><?php echo apply_filters( 'the_title', $attachment->post_title ); ?></a></li>
    <?php endforeach; ?>
</ul>
0
Matthew Boynes