Intereting Posts
Как переопределить всю тематическую разбивку по страницам на сайте? Приложение 404 сообщение переднего конца с несколькими изображениями для загрузки? Добавить действие, которое будет срабатывать при обновлении опубликованного сообщения Это плохая реализация wp_enqueue_script для условного использования? the_excerpt (), get_the_excerpt () и the_content (), все убивающие "Loop" Добавить различные пользовательские маркеры для разных типов сообщений в API карт Google Рабочий плагин нарушает правила API-интерфейс WordPress REST – разрешает вывод контента из выделенного мобильного приложения Пользователь не может войти Cinema, вы можете скачать фильмы, которые играют актеры в Объявляя var, помещая его в запрос и используя вывод запроса? Обновления плагинов WP Удалить сообщение из нового меню в верхней строке Добавить атрибут категории в специальный короткий код

Использование настраиваемого поля в качестве настраиваемого заголовка сообщения

Я настроил настраиваемый тип сообщений с помощью ряда настраиваемых полей, используя класс WPAlchemy. Я пытаюсь принять значение одного из настраиваемых полей и использовать это как заголовок сообщения. Пока, однако, я не имел успеха. Я просматривал, и я пробовал следующие два разных блока кода:

function custom_post_type_title ( $post_id ) { global $wpdb; if ( get_post_type( $post_id ) == 'listing' ) { $title = get_post_meta($post_id, 'listing_name', true); $where = array( 'ID' => $post_id ); $wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where ); } } add_action('init', 'listing_save_post'); function listing_save_post( $post_id ) { if ( ! defined( 'DOING_AUTOSAVE' ) && ! DOING_AUTOSAVE ) return; add_action('save_post', 'custom_post_type_title', 100); add_action('publish_post', 'custom_post_type_title', 100); } 

И .. (временно комментируя поля nonce, пока не выясню, как они работают)

 add_filter('wp_insert_post_data', 'change_title', 99, 2); function change_title($data, $postarr) { // If it is our form has not been submitted, so we dont want to do anything if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; // Verify this came from the our screen and with proper authorization because save_post can be triggered at other times // if(!isset($_POST['my_nonce_field'])) return; // If nonce is set, verify it // if(isset($_POST['my_nonce_field']) && !wp_verify_nonce($_POST['my_nonce_field'], plugins_url(__FILE__))) return; // Combine address with term $title = $_POST['listing_name']; $data['post_title'] = $title; return $data; } 

В обоих случаях результаты те же:

  1. При сохранении нового сообщения он перезагружает страницу, говорит, что она работает, и все пользовательские поля пустые. (Без запуска кода, пользовательский пост работает нормально и поля сохраняются).

  2. При просмотре индекса пользовательского типа сообщений сообщений там нет.

Есть идеи?

ОБНОВИТЬ

Чтобы уточнить, я использую персонализированный пост без поддержки названия. Тем не менее, я пытаюсь заполнить поле заголовка, используя значение в настраиваемом поле.

Таким образом, каждый раз, когда вы сохраняете сообщение, вы хотите заменить значение заголовка, которое только что было сохранено с другим значением из настраиваемого поля …

Похоже, вы должны просто поставить все, что бы название было в фактическом поле заголовка.

НО Я предполагаю, что это предназначено для презентационных целей: вы хотите, чтобы пользовательский тип сообщения отображал другой заголовок на передней панели на основе значения настраиваемого поля. Фильтры были бы легким способом выполнить это.

the_title , общий тег шаблона, очень тонкая оболочка вокруг get_the_title , которая содержит фильтр с именем the_title . Он получает два аргумента: фактический заголовок и идентификатор сообщения. Подключитесь к этому и измените заголовок на основе своего настраиваемого поля.

 <?php add_filter( 'the_title', 'wpse33385_filter_title', 10, 2 ); function wpse33385_filter_title( $title, $post_id ) { if( $new_title = get_post_meta( $post_id, 'custom_field_name', true ) ) { return $new_title; } return $title; } 

Несколько вещей о вашем коде, чтобы иметь в виду:

Действия не произвольно принимают аргументы. Например, функции, подключенные к init , не получают переданных им аргументов. когда do_action , первым аргументом является имя крючка. Последующие аргументы – это то, что передается в функции, если вы хотите (задано четвертым аргументом опции add_action ).

do_action( 'init' ); вызов находится в wp-settings.php. Взгляните , никаких аргументов.

Итак, это:

 <?php add_action('init', 'listing_save_post'); function listing_save_post( $post_id ) { if ( ! defined( 'DOING_AUTOSAVE' ) && ! DOING_AUTOSAVE ) return; add_action('save_post', 'custom_post_type_title', 100); add_action('publish_post', 'custom_post_type_title', 100); } 

Не будет работать так, как вы ожидаете. Более того, вызовы add_action внутри функции могут просто быть самим собой вне функции … Это отлично работает:

 add_action('save_post', 'custom_post_type_title', 100); function custom_post_type_title( $post_id ) { // do stuff } 

Нужно только делать вещи на save_post , а не на том и publish_post

Я всегда стараюсь избегать прямого перехода к $wpdb если могу, потому что во многих случаях есть более удобные API. То, что вы пытались сделать, – это обновить сообщение. Поэтому используйте wp_update_post . В вашем случае это не действительный вариант (поскольку состояние codex, это может вызвать бесконечный цикл).

Это извинилось, извините. Надеюсь, он прояснил некоторые вещи о системе крючков WordPress!

Сделайте их своими лучшими друзьями:

Спасибо, ваш фильтр работал.

FYI

Я добавил чек, чтобы увидеть, есть ли в Admin, чтобы предотвратить изменение заголовка записи на мой пользовательский «longtitle» (default = menu-item-title) при редактировании страницы.

 function pcdg_filter_title ($ title, $ post_id)
 {
     если (! is_admin ())
     {
         if ($ new_title = get_post_meta ($ post_id, longtitle, true))
         {
             return $ new_title;
         }
     }
     return $ title;
 }
 add_filter ('the_title', 'pcdg_filter_title', 10,2);