Je construis un éditeur de mise en page de publication à l'aide de jQuery UI Sortable .
Les messages sont disposés dans des boîtes de 300 x 250 pixels sur une image d'arrière-plan. Les messages sont créés et modifiés à l'aide de l'administrateur WordPress mais je veux permettre à l'administrateur des sites d'ajuster l'ordre des boîtes à l'aide d'une interface glisser-déposer sur le front-end.
J'ai la partie triable par glisser-déposer qui fonctionne, mais je dois trouver un moyen de sauvegarder l'état (l'ordre) des boîtes. Idéalement, j'aimerais pouvoir enregistrer l'état en tant qu'option et l'intégrer dans la requête.
La requête pour les publications est une simple WP_Query qui obtient également des données à partir de métadonnées personnalisées pour déterminer la disposition de la boîte individuelle .:
$args= array(
'meta_key' => 'c3m_shown_on',
'meta_value'=> 'home' );
$box_query = new WP_Query($args); ?>
<ul id="sortable">
<?php
while ($box_query->have_posts()) : $box_query->the_post(); global $post; global $prefix;
$box_size = c3m_get_field($prefix.'box_size', FALSE);
$box_image = c3m_get_field($prefix.'post_box_image', FALSE);
$overlay_class = c3m_get_field($prefix.'overlay_class', FALSE);
if ( c3m_get_field($prefix.'external_link', FALSE) ) {
$post_link = c3m_get_field($prefix.'external_link', FALSE);
} else
{ $post_link = post_permalink();
} ?>
<li class="<?php echo $box_size;?> ui-state-default">
<article <?php post_class() ?> id="post-<?php the_ID(); ?>">
<?php echo '<a href="'.$post_link.'" ><img src="'.esc_url($box_image).'" alt="Image via xxxxx.com" /></a>'; ?>
<div class="post-box <?php echo $overlay_class;?>">
<?php if ( c3m_get_field( $prefix.'text_display', FALSE) ) { ?>
<h2><a href="<?php echo $post_link?>"><?php the_title();?></a></h2>
<p><?php echo substr($post->post_excerpt, 0, 90) . '...'; ?></p>
<?php } ?>
</div>
</article>
</li>
<?php endwhile; ?>
</ul>
</section>
Le javascript n'est que les instructions de tri par défaut de base
jQuery(document).ready(function() {
jQuery("#sortable").sortable();
});
Il existe des méthodes disponibles à l'aide de cookies pour enregistrer l'état, mais je dois également désactiver le glisser-déposer triable pour les utilisateurs non administrateurs, j'ai donc vraiment besoin d'enregistrer dans la base de données.
Je recherche la méthode la plus créative et la plus utilisable et attribuerai une prime de 100 points à la meilleure réponse.
Mise à jour:
J'ai obtenu la réponse de somatic avec un changement mineur.
ajaxurl ne renvoie pas la valeur sur les pages non admin, j'ai donc utilisé wp_localize_script( 'functions', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
pour définir la valeur et changé la ligne javascript sous options en:
url: MyAjax.ajaxurl,
Pour limiter l'accès à l'organisation de la commande aux seuls administrateurs, j'ai ajouté une condition à ma fonction wp_enqueue_script:
function c3m_load_scripts() {
if ( current_user_can( 'edit_posts' ) ) {
wp_enqueue_script( 'jquery-ui' );
wp_enqueue_script( 'functions', get_bloginfo( 'stylesheet_directory' ) . '/_/js/functions.js', array( 'jquery', 'jquery-ui' ), false);
wp_localize_script( 'functions', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
}
}
Je vais faire un peu plus de tests et marquer cette question comme résolue et attribuer la prime.
Réponses:
Brady a raison de dire que la meilleure façon de gérer l'enregistrement et l'affichage des commandes de type de message personnalisé est d'utiliser la
menu_order
propriétéVoici le jquery pour rendre la liste triable et pour passer les données via ajax à wordpress:
Voici la fonction wordpress qui écoute le rappel ajax et effectue les modifications sur la base de données:
La clé pour afficher les publications dans l'ordre que vous avez enregistré consiste à ajouter la
menu_order
propriété aux arguments de requête:Ensuite, exécutez votre boucle et sortez chaque élément ... (la première ligne est l'animation de chargement du noyau wp - vous voudrez la masquer initialement via css, puis la fonction jquery s'affichera lors du traitement)
Code inspiré de l' excellent tutoriel de soulsizzle .
la source
http://jsfiddle.net/TbR69/1/
Loin d'être terminé, mais l'idée est d'envoyer une requête ajax par glisser-déposer. Vous pouvez également vouloir déclencher la demande ajax uniquement après avoir cliqué sur un bouton "enregistrer" ou quelque chose. Un tableau contenant des identifiants de poste et une nouvelle commande serait envoyé.
Ensuite, vous devez mettre à jour les publications dans la base de données côté serveur. Enfin, ajoutez un
order
paramètre à votreWP_Query
boucle.J'espère que cela vous aidera à démarrer. Quiconque se sent libre de continuer à jouer.
la source
Fichier Javascript order.js
la source