帖子在背景图片上以300px x 250px的框进行布局。这些帖子是使用WordPress管理员创建和编辑的,但我想允许站点管理员使用前端的拖放界面来调整框的顺序。
我有拖放式可排序部分工作,但需要想出一种方法来保存盒子的状态(顺序)。理想情况下,我希望能够将状态另存为选项,并将其构建到查询中。
$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只是基本的默认可排序指令
jQuery(document).ready(function() {
jQuery("#sortable").sortable();
});
有些方法可以使用cookie来保存状态,但我还需要为非管理员用户,所以我真的需要保存到数据库。
我正在寻找最有创意和最实用的方法,并将奖励100分以奖励最佳答案。
更新:
我得到了躯体化的答案,并做了一个小的更改。将订单仅安排给管理员,我在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' ) ) );
}
}
我要o再做一些测试,将此问题标记为已解决,并颁发赏金。
#1 楼
Brady是正确的,处理自定义帖子类型订单的最佳方法是使用menu_order
属性这是使列表可排序并将数据通过ajax传递到wordpress的jquery:
jQuery(document).ready(function($) {
var itemList = $('#sortable');
itemList.sortable({
update: function(event, ui) {
$('#loading-animation').show(); // Show the animate loading gif while waiting
opts = {
url: ajaxurl, // ajaxurl is defined by WordPress and points to /wp-admin/admin-ajax.php
type: 'POST',
async: true,
cache: false,
dataType: 'json',
data:{
action: 'item_sort', // Tell WordPress how to handle this ajax request
order: itemList.sortable('toArray').toString() // Passes ID's of list items in 1,3,2 format
},
success: function(response) {
$('#loading-animation').hide(); // Hide the loading animation
return;
},
error: function(xhr,textStatus,e) { // This can be expanded to provide more information
alert(e);
// alert('There was an error saving the updates');
$('#loading-animation').hide(); // Hide the loading animation
return;
}
};
$.ajax(opts);
}
});
});
这是wordpress函数,用于侦听ajax回调并在DB上执行更改:
function my_save_item_order() {
global $wpdb;
$order = explode(',', $_POST['order']);
$counter = 0;
foreach ($order as $item_id) {
$wpdb->update($wpdb->posts, array( 'menu_order' => $counter ), array( 'ID' => $item_id) );
$counter++;
}
die(1);
}
add_action('wp_ajax_item_sort', 'my_save_item_order');
add_action('wp_ajax_nopriv_item_sort', 'my_save_item_order');
按保存顺序显示帖子的关键是将
menu_order
属性添加到查询args:$args= array(
'meta_key' => 'c3m_shown_on',
'meta_value'=> 'home'
'orderby' => 'menu_order',
'order' => 'ASC'
);
$box_query = new WP_Query($args);
然后运行循环并输出每个项目。 ..(第一行是wp加载动画的核心-您首先需要通过CSS将其隐藏,然后在处理时会显示jquery函数)。
<img src="<?php bloginfo('url'); ?>/wp-admin/images/loading.gif" id="loading-animation" />
<ul id="sortable">
<li id="{echo post ID here}">{echo title or other name here}</li>
</ul>
受soulsizzle优秀教程启发的代码。
评论
极好的答案。我会试一试。
– Chris_O
2011年5月6日21:30
非常感谢您-完全帮了我的忙。我碰到的一个问题是,可排序列表中的每个项目都需要具有与帖子ID匹配的ID。这在soulsizzle的教程中,但不在OP的帖子中。
–道尔顿·鲁尼
11年8月17日在20:51
完全正确,道尔顿,我的例子太简短了。代码已更新。
–体细胞
2011年8月29日,1:11
#2 楼
http://jsfiddle.net/TbR69/1/远未完成,但其想法是在拖放时发送ajax请求。您可能还想仅在单击“保存”按钮或其他内容后触发ajax请求。将发送包含帖子ID和新订单的数组。
然后,您必须在服务器端更新数据库中的帖子。最后,将一个
order
参数添加到您的WP_Query
循环中。任何人都可以继续摆弄。#3 楼
/**
* Enqueue javascript and css files
*/
function uc_enqueue_my_assets() {
wp_enqueue_script( 'jquery-ui-sortable');
wp_register_script( 'order', plugins_url( '/js/order.js', __FILE__ ), array( 'jquery' ) );
wp_enqueue_script( 'order' );
}
function uc_is_user_logged_in()
{
if ( is_user_logged_in()) {
add_action( 'wp_enqueue_scripts', 'uc_enqueue_my_assets' );
add_action( 'admin_enqueue_scripts', 'uc_enqueue_my_assets' );
}
}
add_action('init', 'uc_is_user_logged_in');
/**
* Update order of posts by ajax on trigger of drag and drop event
*/
function uc_sort_post_items() {
$order = wp_parse_id_list(explode(',', $_POST['order']));
write_log($order);
global $wpdb;
$list = join(', ', $order);
$wpdb->query('SELECT @i:=0');
$wpdb->query(
"UPDATE wp_posts SET menu_order = ( @i:= @i+1 )
WHERE ID IN ( $list ) ORDER BY FIELD( ID, $list );"
);
wp_die();
}
add_action('wp_ajax_uc_sort_post_items', 'uc_sort_post_items');
add_action('wp_ajax_nopriv_uc_sort_post_items', 'uc_sort_post_items');
/**
* Display sorted posts
*/
function uc_pre_get_posts( $wp_query ) {
write_log(basename($_SERVER['PHP_SELF']));
$wp_query->set('orderby', 'menu_order');
$wp_query->set('order', 'ASC');
}
add_action( 'pre_get_posts', 'uc_pre_get_posts', 1 );
JavaScript文件order.js
$('#the-list').sortable({
update: function(event, ui) {
$.ajax({
url: '/wp-admin/admin-ajax.php',
type: 'post',
dataType: 'json',
data:{
action: 'uc_sort_post_items', // Tell WordPress how to handle this ajax request
order: '4567,4569,4565 ' // Passes ID's of list items in 1,3,2 format. Write your own js method to access the list of id from frontend.
},
success: function(data, response) {
console.log(response);
},
error: function(xhr,textStatus,e) {
alert(e);
}
});
}
});
评论
请不要只是转储代码。请您添加一些解释,为什么认为上面的代码会回答问题。
– Mayeenul伊斯兰教
19年5月28日在5:50
@MayeenulIslam说明已经在代码段中添加为注释行。
– SkyRar
19年5月28日在20:13
评论
您是否可以在帖子上使用menu_order?我知道您可以在附件上使用它们,为什么不发布?如果可能的话,这是您可以存储帖子顺序的地方...看起来可以-'menu_order'-按页面顺序排序。最常用于“页面”(“编辑页面属性”框中的“订单”字段)和附件(“插入/上传媒体库”对话框中的整数字段),但可用于具有不同“ menu_order”值的任何帖子类型(它们均为默认值)到0)。
@Brady关于使用menu_order的好主意。 @somatic对其进行了扩展,并且可以正常工作。谢谢!