Intereting Posts
Могу ли я динамически создать ссылку на мою страницу настроек / параметров плагина из моего описания плагина? Изменение таксономических страниц для исключения элементов в таксономиях детей Ссылки на действия в классе, расположенные в подкаталоге плагина Перекрыть функцию, находящуюся внутри плагина Ограничить поиск латинскими символами Шаги, которые нужно предпринять, чтобы скрыть факт, что сайт использует WordPress? Почему не удалось проверить плагин NextGen? Скрыть метаданные по определенной категории Отображение нескольких настраиваемых типов сообщений в одном типе сообщений в разделе администратора Белый экран после обновления плагинов Показать изображение, если опубликовано сообщение WordPress на localhost по-прежнему указывает на живой сайт CSS / JS не работает в субдомене multi lang После перемещения моего сайта из поддомена dev, для root, все мои собственные метаданные исчезли Добавление массива из строки запроса в WP meta_query

Редактировать название пункта меню из страницы редактирования / публикации

После сохранения сообщения / страницы создается новый элемент меню (с тем же названием) в навигации, которую мы создали в nav-menus.php .

Если нам нужно изменить название пункта меню, нам нужно перейти на nav-menus.php и изменить его на что-то другое.

Возможно ли иметь какое-либо текстовое поле, например, в редакторе / странице, где мы можем написать заголовок пункта меню, который мы хотим для этой страницы / сообщения, без необходимости редактировать nav-menus.php каждый раз?

Это может сэкономить много времени для пользователей.

Вот полный и рабочий код! Благодаря @Howdy_McGee

 /** * Adds a box to the main column on the Page edit screens. */ function menu_item_title_changer_add_meta_box() { $screens = array( 'page' ); foreach ( $screens as $screen ) { add_meta_box( 'menu_item_title_changer', __( 'Menu item title changer', 'webic-admin' ), 'menu_item_title_changer_callback', $screen ); } } add_action( 'add_meta_boxes', 'menu_item_title_changer_add_meta_box' ); /** * Prints the box content. * * @param WP_Post $post The object for the current post/page. */ function menu_item_title_changer_callback( $post ) { // Add a nonce field so we can check for it later. wp_nonce_field( 'menu_item_title_changer_meta_box', 'menu_item_title_changer_meta_box_nonce' ); /* * Use get_post_meta() to retrieve an existing value * from the database and use the value for the form. */ $value = get_post_meta( $post->ID, '_menu_item_title_changer', true ); echo '<label for="menu_item_title_changer_field">'; _e( 'Description for this field', 'myplugin_textdomain' ); echo '</label> '; echo '<input type="text" id="menu_item_title_changer_field" name="menu_item_title_changer_field" value="' . esc_attr( $value ) . '" size="25" />'; } /** * When the post is saved, saves our custom data. * * @param int $post_id The ID of the post being saved. */ function menu_item_title_changer_save_meta_box_data( $post_id, $post ) { /* * We need to verify this came from our screen and with proper authorization, * because the save_post action can be triggered at other times. */ // Check if our nonce is set. if ( ! isset( $_POST['menu_item_title_changer_meta_box_nonce'] ) ) { return; } // Verify that the nonce is valid. if ( ! wp_verify_nonce( $_POST['menu_item_title_changer_meta_box_nonce'], 'menu_item_title_changer_meta_box' ) ) { return; } // If this is an autosave, our form has not been submitted, so we don't want to do anything. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } // Check the user's permissions. if ( isset( $_POST['post_type'] ) && 'page' == $_POST['post_type'] ) { if ( ! current_user_can( 'edit_page', $post_id ) ) { return; } } else { if ( ! current_user_can( 'edit_post', $post_id ) ) { return; } } /* OK, it's safe for us to save the data now. */ // Make sure that it is set. if ( ! isset( $_POST['menu_item_title_changer_field'] ) ) { return; } // here is the code here it is working bug my system stack after i click save "save" if( 'page' == $post->post_type ) { // Check Nonces $nav_item = new WP_Query( array( 'post_type' => 'nav_menu_item', // Nav Post Type 'posts_per_page' => 1, // We only expect 1 result, if any 'meta_key' => '_menu_item_object_id', // With our Meta Key 'meta_value' => $post->ID // And our Correct Page ) ); if( $nav_item->have_posts() ) { // Ensure something was found wp_update_post( array( // Update the `nav_menu_item` Post Title 'ID' => $nav_item->posts[0]->ID, 'post_title' => htmlspecialchars( sanitize_text_field( $_POST['menu_item_title_changer_field'] ) ) ) ); } // Update Page Meta } // Sanitize user input. $my_data = sanitize_text_field( $_POST['menu_item_title_changer_field'] ); // Update the meta field in the database. update_post_meta( $post_id, '_menu_item_title_changer', $my_data ); } add_action( 'save_post', 'menu_item_title_changer_save_meta_box_data', 10, 3 ); 

Всякий раз, когда вы добавляете новый элемент в WordPress Menu ( Appearance -> Menu ), он создает новый Post of Post Type nav_menu_item и получает сообщение meta под _menu_item_object_id с основным идентификатором сообщения.

Например, если я создаю страницу под названием «Главная», ей присваивается идентификатор сообщения 2 . Теперь, когда я перехожу в меню и добавляю страницу в меню, WordPress создает новое сообщение типа nav_menu_item типа nav_menu_item , назначает заголовок «Home», дает ему идентификатор в базе данных 3 и назначает post meta _menu_item_object_id = 2 . Если мы хотим изменить заголовок на «Домашняя страница» в меню, это изменит Post ID 3 на заголовок «Домашняя страница».

Если бы мы хотели изменить заголовок с помощью метабокса, нам нужно было бы найти Post Type nav_menu_item , у которого есть post_meta _menu_item_object_id с тем же идентификатором, что и наша текущая страница. Я предполагаю, что у вас уже есть настройка метабокса, проверяются типы сообщений и nonces.

 if( 'page' == $post->post_type ) { // Check Nonces $nav_item = new WP_Query( array( 'post_type' => 'nav_menu_item', // Nav Post Type 'posts_per_page' => 1, // We only expect 1 result, if any 'meta_key' => '_menu_item_object_id', // With our Meta Key 'meta_value' => $post->ID // And our Correct Page ) ); if( $nav_item->have_posts() ) { // Ensure something was found wp_update_post( array( // Update the `nav_menu_item` Post Title 'ID' => $nav_item->posts[0]->ID, 'post_title' => htmlspecialchars( sanitize_text_field( $_POST['_textbox_name'] ) ) ) ); } // Update Page Meta } 

В конце вышеприведенного кода вы также захотите обновить метаданные Post post до нового заголовка, чтобы вы могли повторно отобразить его в текстовом поле метабокса, что упростит обновление пользователем в будущем.


В качестве альтернативы, если вы хотите обновить текстовое поле метабокса всякий раз, когда пользователь добавляет новый элемент в меню, вы можете изменить процесс:

 if( 'nav_menu_item' == $post->post_type ) { // Check Nonces $added_id = get_post_meta( $post->ID, '_menu_item_object_id', true ); // This may or may not be a Page ID $type = get_post_field( 'post_type', $added_id ); if( 'page' == $type ) { // Update Page Metabox Textbox Here with `$post->post_title` } }