Usar campo personalizado como título de post personalizado

10 nov 2011, 06:29:47
Vistas: 14.9K
Votos: 3

He configurado un tipo de post personalizado con una serie de campos personalizados usando la clase WPAlchemy. Estoy intentando tomar el valor de uno de los campos personalizados y usarlo como título del post. Hasta ahora, no he tenido éxito. He estado investigando y probé los siguientes dos bloques de código:

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);
}

Y también... (comentando temporalmente los campos nonce hasta que entienda cómo funcionan)

add_filter('wp_insert_post_data', 'change_title', 99, 2);
function change_title($data, $postarr)
{    
    // Si es nuestro formulario no ha sido enviado, no queremos hacer nada
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    // Verificar que venga de nuestra pantalla y con autorización adecuada porque save_post puede dispararse en otros momentos
   // if(!isset($_POST['my_nonce_field'])) return;

    // Si el nonce está configurado, verificarlo
   // if(isset($_POST['my_nonce_field']) && !wp_verify_nonce($_POST['my_nonce_field'], plugins_url(__FILE__))) return;

       // Combinar dirección con término
    $title = $_POST['listing_name'];
    $data['post_title'] = $title;

    return $data;
}

En ambos casos, los resultados son los mismos:

  1. Al guardar el nuevo post, recarga la página, dice que funcionó, pero todos los campos personalizados están vacíos. (Sin ninguno de los códigos anteriores, el post personalizado funciona bien y los campos se guardan correctamente).

  2. Al ver el índice del tipo de post personalizado, los posts no aparecen.

¿Alguna idea?

ACTUALIZACIÓN

Para aclarar, estoy usando un post personalizado sin soporte para título. Sin embargo, estoy intentando poblar el campo de título usando el valor del campo personalizado.

0
Todas las respuestas a la pregunta 3
3

Entonces, cada vez que guardas una publicación, quieres reemplazar el valor del título que acaba de guardarse con otro valor de un campo personalizado...

Parece que simplemente deberías poner lo que quieras que sea el título en el campo de título real.

PERO supongo que esto es con fines de presentación: deseas que ese tipo de publicación personalizada muestre un título diferente en el frontend basado en el valor de un campo personalizado. Los filtros serían una forma fácil de lograrlo.

the_title, la etiqueta de plantilla común, es un envoltorio muy delgado alrededor de get_the_title, que contiene un filtro llamado the_title. Recibe dos argumentos: el título real y el ID de la publicación. Engánchate a eso y cambia el título basado en tu campo personalizado.

<?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;
}

Algunas cosas sobre tu código para tener en cuenta:

Las acciones no reciben argumentos arbitrariamente. Las funciones enganchadas a init por ejemplo, no reciben ningún argumento. Cuando se llama a do_action, el primer argumento es un nombre de hook. Los argumentos subsiguientes son los que se pasan a las funciones enganchadas si lo deseas (especificados por el cuarto argumento opcional de add_action).

La llamada do_action( 'init' ); está en wp-settings.php. Echa un vistazo, sin argumentos.

Entonces esto:

<?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);
}

No va a funcionar como esperas. Además, las llamadas a add_action dentro de la función, pueden estar por su cuenta fuera de la función... Esto funciona bien:

add_action('save_post', 'custom_post_type_title', 100);
function custom_post_type_title( $post_id ) {
    // hacer cosas
}

Solo necesitas hacer cosas en save_post, no en eso y publish_post

Siempre trato de evitar ir directamente a $wpdb si puedo, porque muchas veces hay APIs más convenientes. Lo que estabas intentando hacer es actualizar una publicación. Entonces usa wp_update_post. En tu caso, esa no es una opción válida (como dice el codex, puede causar un bucle infinito).

Esto fue un poco extenso, lo siento. ¡Espero que haya aclarado algunas cosas sobre el sistema de hooks de WordPress!

Haz que estos sean tus mejores amigos:

10 nov 2011 07:40:53
Comentarios

Christopher, ¡gracias por los pensamientos detallados! Los revisaré y los asimilaré más a fondo. Para aclarar, en realidad estoy intentando crear un tipo de publicación personalizada sin usar el campo de título y luego hacer que aparezca un título (compuesto por un campo personalizado), tanto en el front end como en el backend (en la lista de publicaciones personalizadas). ¿Eso lo aclara?

Jonathan Wold Jonathan Wold
10 nov 2011 19:21:34

El filtro que te mostré funcionará para eso. Si quieres eliminar el campo de título por completo, hay un argumento en el arreglo $args de register_post_type llamado post_type_supports, configúralo así 'post_type_supports' => array( 'content' ), y no habrá más título en la pantalla de edición.

chrisguitarguy chrisguitarguy
10 nov 2011 21:47:01

¡Eso funcionó! Entonces, estoy usando un filtro para lograr el efecto deseado. Si intentara recuperar el valor, digamos a través de WPDB, del campo post_title, obtendría el valor de "auto draft" (borrador automático), ¿correcto? La parte "purista" de mí quiere arreglar eso, aunque entiendo que el "filtro" funciona. ¿Alguna idea? ¡MUCHAS GRACIAS por la ayuda!

Jonathan Wold Jonathan Wold
11 nov 2011 04:05:35
0

Gracias, tu filtro funcionó perfectamente.

Para tu información:

Agregué una verificación para detectar si está en el Admin y así evitar cambiar el entry-title por mi "longtitle" personalizado (el valor predeterminado es menu-item-title) mientras se edita una página.


function pcdg_filter_title( $title, $post_id )
{
    if(!is_admin()) // Verifica si NO está en el área de administración
    {
        if( $new_title = get_post_meta( $post_id, 'longtitle', true ) ) // Obtiene el meta 'longtitle' si existe
        {
            return $new_title; // Devuelve el título largo personalizado
        }
    }
    return $title; // Devuelve el título original en admin o si no hay longtitle
}
add_filter( 'the_title','pcdg_filter_title',10,2 ); // Añade el filtro al hook the_title
25 mar 2015 13:08:08
0

Esto es genial, ¿cómo podría agregar varios campos personalizados si quisiera que fuera, por ejemplo, para un agente inmobiliario:

ubicación • ocupación • precio

como título filtrado en lugar de mostrar solo el nombre de un campo personalizado.

¡Gracias!

29 ago 2023 02:01:34