方法一:
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
声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。