WordPress 按自定义排序的两种方法

方法一:


add_action( 'add_meta_boxes', 'vm_add_custom_box' );
add_action( 'save_post', 'vm_save_postdata' );

function vm_add_custom_box() {
  //需要添加自定义字段的页面
  $screens = array('post'); // 'post', 'page',
  foreach ($screens as $screen) {
    add_meta_box(
      'html_meta_div_id',
      __( '主题自定义字段', 'field_textdomain' ),
      'vm_inner_custom_box',
      $screen
    );
  }
}

// 显示自定义字段编辑框
function vm_inner_custom_box($post){
	// 使用随机数进行核查
	wp_nonce_field(plugin_basename(__FILE__), 'myplugin_noncename');
	// 用于数据输入的实际字段
	// 使用 get_post_meta 从数据库中检索现有的值,并应用到表单中
	$list_order = get_post_meta($post->ID, 'list_order', true);
	echo '<label for="list_order">' . _e("排序字段:", 'field_textdomain') . '</label>';
	echo '<input type="text" id="list_order" name="list_order" value="' . esc_attr($list_order) . '" size="25" />';
}

// 文章保存时,保存自定义数据
function vm_save_postdata($post_id) {
	// 首先,我们需要检查当前用户是否被授权做这个动作。 
	if ('page' == $_POST['post_type']) {
		if (!current_user_can('edit_page', $post_id))
			return;
	} else {
		if (!current_user_can('edit_post', $post_id))
			return;
	}

	// 其次,我们需要检查,是否用户想改变这个值。
	if (!isset($_POST['myplugin_noncename']) || !wp_verify_nonce($_POST['myplugin_noncename'], plugin_basename(__FILE__)))
		return;

	// 第三,我们可以保存值到数据库中
	//如果保存在自定义的表,获取文章ID
	$post_ID = $_POST['post_ID'];
	//过滤用户输入
	$mydata = sanitize_text_field($_POST['list_order']);

	add_post_meta($post_ID, 'list_order', $mydata, true) or
		update_post_meta($post_ID, 'list_order', $mydata);
}


调用方法:

$args = array(
      'orderby'  => 'meta_value',
      'order'   => 'asc',
      'meta_key' => 'list_order' 
    );

这种方法,如果文章之前没有对应的 wp_postmeta 记录,该文章不会被搜索到。


方法二:

/**
 * Add page attributes to post
 */
function vm_add_post_attributes()
{
  add_post_type_support('post', 'page-attributes');
}
add_action('init', 'vm_add_post_attributes', 500);


古登堡编辑器以后还需要添加下面两个:

/**
 * Add the menu_order property to the post object being saved
 *
 * @param \WP_Post|\stdClass $post
 * @param WP_REST_Request $request
 *
 * @return \WP_Post
 */
function vm_pre_insert_post($post, \WP_REST_Request $request)
{
  $body = $request->get_body();
  if ($body) {
    $body = json_decode($body);
    if (isset($body->menu_order)) {
      $post->menu_order = $body->menu_order;
    }
  }

  return $post;
}
add_filter('rest_pre_insert_post', 'vm_pre_insert_post', 12, 2);


/**
 * Load the menu_order property for frontend display in the admin
 *
 * @param \WP_REST_Response $response
 * @param \WP_Post $post
 * @param \WP_REST_Request $request
 *
 * @return \WP_REST_Response
 */
function vm_prepare_post(\WP_REST_Response $response, $post, $request)
{
  $response->data['menu_order'] = $post->menu_order;

  return $response;
}
add_filter('rest_prepare_post', 'vm_prepare_post', 12, 3);

调用方法:

$args = array(
      'orderby'  => 'menu_order',
      'order'   => 'desc',
      'posts_per_page' => 8
    );
query_posts($args);


参考:

https://stackoverflow.com/questions/55433707/wordpress-post-custom-order-not-working-showing-up-but-not-saving

修改时间 2023-11-14

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
WordPress 添加 Favicon 图标的方法
Node.js MySQL2 如何编写事务
Node.js zlib 模块
Node.js net 模块
WordPress 数据库表结构
River 主题
MySQL 表名预处理
JavaScript 中 0.1 加 0.2 不等于 0.3 的原因和解决方法