Использование save_post для замены заголовка поста

16

Я использую пользовательские посты, и в них мне не нужен заголовок.

Это приводит к тому, что Wordpress устанавливает заголовки моих сообщений на «Авто черновик».

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

Как мне сделать это, используя save_post или каким-либо другим способом?

Цахи Левент-Леви
источник
Пожалуйста, измените ваш вопрос, чтобы включить ваш register_post_type()звонок.
Чип Беннет
Чего именно вы пытаетесь достичь? Вам вообще не нужен заголовок сообщения для вашего CPT или вы хотите, чтобы он устанавливался из значения настраиваемого поля?
Рутвик Гангурде
1
Я не хочу этого вообще, но в списке постов я не могу удалить его, так как я больше не смогу редактировать посты. Это означает, что мне нужен способ разместить «фальшивый» заголовок.
Цахи Левент-Леви
1
Итак, что вы действительно хотите сделать, это изменить экран управления сообщениями, чтобы выводить различные столбцы для вашего пользовательского типа сообщений? Если это так, это может быть более полезным вопросом. :)
Чип Беннет
Это только часть. Кто-то задает подобные вопросы «воздействия», потому что он ищет ответ, чтобы помочь ему инициировать многие аспекты проекта. Поиск, создание шаблонов и т. Д.
e4rthdog

Ответы:

16

Этот самый простой способ - редактировать данные в той точке, в которую они вставлены, а не обновлять их впоследствии, используя wp_insert_post_dataвместо save_post. Это работает при создании нового сообщения или обновлении существующего сообщения без изменений. Это также избегает опасности создания бесконечного цикла, вызывая update_postвнутри save_post.

add_filter( 'wp_insert_post_data' , 'modify_post_title' , '99', 1 ); // Grabs the inserted post data so you can modify it.

function modify_post_title( $data )
{
  if($data['post_type'] == 'rating' && isset($_POST['rating_date'])) { // If the actual field name of the rating date is different, you'll have to update this.
    $date = date('l, d.m.Y', strtotime($_POST['rating_date']));
    $title = 'TV ratings for ' . $date;
    $data['post_title'] =  $title ; //Updates the post title to your new title.
  }
  return $data; // Returns the modified data.
}
SinisterBeard
источник
10

У меня была точно такая же потребность, поэтому я написал эту функцию - которая работает. Измените его в соответствии с вашими потребностями. Надеюсь это поможет.

// set daily rating title
function set_rating_title ($post_id) {
    if ( $post_id == null || empty($_POST) )
        return;

    if ( !isset( $_POST['post_type'] ) || $_POST['post_type']!='rating' )  
        return; 

    if ( wp_is_post_revision( $post_id ) )
        $post_id = wp_is_post_revision( $post_id );

    global $post;  
    if ( empty( $post ) )
        $post = get_post($post_id);

    if ($_POST['rating_date']!='') {
        global $wpdb;
        $date = date('l, d.m.Y', strtotime($_POST['rating_date']));
        $title = 'TV ratings for ' . $date;
        $where = array( 'ID' => $post_id );
        $wpdb->update( $wpdb->posts, array( 'post_title' => $title ), $where );
    }
}
add_action('save_post', 'set_rating_title', 12 );
Биранит Горен
источник
2

Попробуйте фильтр default_title :

add_filter( 'default_title', 'my_default_title', 10, 2 );

function my_default_title( $post_title, $post ){

  $custom_post_type = 'my_awesome_cpt';

  // do it only on your custom post type(s)
  if( $post->post_type !== $custom_post_type )
    return $post_title;

  // create your preferred title here
  $post_title = $custom_post_type . date( 'Y-m-d :: H:i:s', time() );

  return $post_title;
}
Ralf912
источник
1
Это решение не позволяет создавать заголовок "вычисляется из других полей в моем сообщении" - по запросу. Хорошо, если вы можете создать автоматический заголовок для всех сообщений такого рода. Но если вам нужно зависеть от какой-то динамической переменной, это не поможет.
Биранит Горен
1
@Biranit Goren Что означает «вычислено из других полей в моем сообщении»? В каком поле вы пропустили объект поста $post? Пожалуйста, прочитайте первоначальный вопрос и комментарии ниже. Автоматически сгенерированный заголовок сообщения не запрашивается. Необходим только поддельный заголовок сообщения (замена WordPress "Auto Draft").
Ralf912
2

Вот решение, которое использует статическую переменную для предотвращения бесконечного цикла. Это позволяет вам безопасно вызывать wp_update_post()внутри функции, к которой подключен save_post.

function km_set_title_on_save( $post_id ) {

    // Set this variable to false initially.
    static $updated = false;

    // If title has already been set once, bail.
    if ( $updated ) {
        return;
    }

    // Since we're updating this post's title, set this
    // variable to true to ensure it doesn't happen again.
    $updated = true;

    $date           = get_post_meta( $post_id, 'rating_date', true );
    $date_formatted = date( 'l, d.m.Y', strtotime( $date ) );

    // Update the post's title.
    wp_update_post( [
        'ID'         => $post_id,
        'post_title' => 'TV ratings for ' . $date_formatted,
    ] );
}
add_action( 'save_post', 'km_set_title_on_save' );

Примечание. Чтобы ограничить эту функцию определенным типом записей , используйте хеш save_post _ {$ post-> post_type} вместо save_post.

Келлен Мейс
источник