Buduję edytor układu postu front-end przy użyciu jQuery UI Sortable .
Posty są rozmieszczone w polach 300 na 250 pikseli na obrazie tła. Wpisy są tworzone i edytowane za pomocą administratora WordPress, ale chcę umożliwić administratorowi witryn dostosowanie kolejności skrzynek za pomocą interfejsu przeciągnij i upuść na interfejsie.
Mam działającą funkcję sortowania metodą przeciągnij i upuść, ale muszę wymyślić sposób, aby zapisać stan (kolejność) pól. Idealnie chciałbym móc zapisać stan jako opcję i wbudować go w zapytanie.
Zapytanie o posty jest prostym WP_Query, który pobiera również dane z niestandardowych pól meta w celu ustalenia układu poszczególnych pól:
$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>
JavaScript jest tylko podstawową domyślną instrukcją sortowania
jQuery(document).ready(function() {
jQuery("#sortable").sortable();
});
Istnieją metody wykorzystujące pliki cookie do zapisania stanu, ale muszę również wyłączyć sortowanie metodą przeciągnij i upuść dla użytkowników niebędących administratorami, więc naprawdę muszę zapisać w bazie danych.
Szukam najbardziej kreatywnej i użytecznej metody i przyznam nagrodę w wysokości 100 punktów za najlepszą odpowiedź.
Aktualizacja:
Otrzymałem odpowiedź somatyczną, pracując z jedną drobną zmianą.
ajaxurl nie zwraca wartości na stronach innych niż admin, więc użyłem jej wp_localize_script( 'functions', 'MyAjax', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) );
do zdefiniowania wartości i zmieniłem wiersz javascript w opcjach na:
url: MyAjax.ajaxurl,
Aby ograniczyć dostęp do organizowania zamówienia tylko dla administratorów, dodałem warunek do mojej funkcji 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' ) ) );
}
}
Zrobię jeszcze więcej testów i oznaczę to pytanie jako rozwiązane i przyznam nagrodę.
Odpowiedzi:
Brady ma rację, że najlepszym sposobem obsługi zapisywania i wyświetlania niestandardowych zamówień typu post jest użycie
menu_order
właściwościOto jquery, aby umożliwić sortowanie listy i przekazać dane przez ajax do wordpress:
Oto funkcja wordpress, która nasłuchuje wywołania zwrotnego ajax i wykonuje zmiany w DB:
Kluczem do wyświetlania postów w zapisanej kolejności jest dodanie
menu_order
właściwości do argumentów zapytania:Następnie uruchom pętlę i wypisz każdy element ... (pierwszy wiersz to podstawowa animacja ładowania pliku wp - będziesz chciał ukryć go początkowo za pomocą css, a następnie funkcja jquery wyświetli się podczas przetwarzania)
Kod inspirowany doskonałym przewodnikiem soulsizzle .
źródło
http://jsfiddle.net/TbR69/1/
Nie jest to jeszcze ukończone, ale pomysł polega na wysłaniu żądania ajax podczas przeciągania i upuszczania. Możesz także chcieć wywołać żądanie ajax tylko po kliknięciu przycisku „zapisz” lub coś w tym rodzaju. Zostanie wysłana tablica zawierająca identyfikatory postów i nowe zamówienie.
Następnie musisz zaktualizować posty w bazie danych po stronie serwera. Na koniec dodaj
order
parametr do swojejWP_Query
pętli.Mam nadzieję, że dzięki temu zaczniesz. Każdy może nadal bawić się.
źródło
Plik JavaScript order.js
źródło