web-dev-qa-db-fra.com

Utilisation d'un champ personnalisé comme titre de publication personnalisée

J'ai configuré un type d'article personnalisé avec une série de champs personnalisés à l'aide de la classe WPAlchemy. J'essaie de prendre la valeur d'un des champs personnalisés et de l'utiliser comme titre de publication. Jusqu'ici, cependant, je n'ai eu aucun succès. J'ai parcouru le site et essayé les deux différents blocs de code suivants:

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

Et .. (commentant temporairement les champs de nonce jusqu'à ce que je sache comment ils fonctionnent)

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

Dans les deux cas, les résultats sont les mêmes:

  1. Lors de la sauvegarde du nouveau message, il recharge la page, dit que cela a fonctionné et que tous les champs personnalisés sont vides. (Si aucun des jeux de codes ne s'exécute, la publication personnalisée fonctionne parfaitement et les champs sont enregistrés).

  2. Lors de l'affichage de l'index de type d'article personnalisé, les articles ne sont pas là.

Des idées?

METTRE À JOUR

Pour clarifier, j'utilise un message personnalisé without le support de titre. J'essaie néanmoins de renseigner le champ de titre en utilisant la valeur du champ personnalisé.

3
Jonathan Wold

Ainsi, chaque fois que vous enregistrez un article, vous souhaitez remplacer la valeur d'un titre qui vient d'être enregistré par une autre valeur provenant d'un champ personnalisé ...

On dirait que vous devriez simplement mettre ce que vous voulez comme titre dans le champ de titre réel.

MAIS je suppose que c'est à des fins de présentation: vous voulez que ce type d'article personnalisé affiche un titre différent sur le front-end en fonction de la valeur d'un champ personnalisé. Les filtres seraient un moyen facile d'y parvenir.

the_title, la balise de modèle commune, est un très fin wrapper autour de get_the_title, qui contient un filtre appelé the_title. Il reçoit deux arguments: le titre actuel et l'identifiant de la publication. Accédez à cela et changez le titre en fonction de votre champ personnalisé.

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

Quelques points à garder à l’esprit sur votre code:

Les actions ne reçoivent pas d'arguments de manière arbitraire. Les fonctions rattachées à init, par exemple, ne reçoivent aucun argument. Lorsque do_action est appelé, le premier argument est un nom de hook. Les arguments suivants sont ceux qui sont passés aux fonctions accrochées si vous le souhaitez (spécifié par le quatrième, argument de l’option add_action).

l'appel do_action( 'init' ); est dans wp-settings.php. Jetez un oeil , pas d'arguments.

Donc ça:

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

Ne va pas fonctionner comme vous le souhaitez. De plus, les appels add_action à l'intérieur de la fonction peuvent simplement être autonomes à l'extérieur de la fonction ... Cela fonctionne très bien:

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

Seulement besoin de faire des choses sur save_post, pas sur cela et publish_post

J'essaie toujours d'éviter si possible d'aller directement à $wpdb, car il existe souvent des API plus pratiques. Ce que vous essayiez de faire est de mettre à jour un message. Donc, utilisez wp_update_post . Dans votre cas, ce n'est pas une option valide (comme l'indique le codex, cela peut provoquer une boucle infinie).

C'était un peu long, désolé. Espérons que cela clarifie certaines choses concernant le système de crochets WordPress!

Faites-en vos meilleurs amis:

3
chrisguitarguy

Merci votre filtre a fonctionné un régal.

FYI

J'ai ajouté une vérification pour voir si dans Admin empêcher de changer le titre d'entrée en mon "longtitle" personnalisé (défaut = menu-item-title) lors de l'édition d'une page.

 fonction pcdg_filter_title ($ title, $ post_id) 
 {
 if (! is_admin ()) 
 {
 if ($ new_title = get_post_meta ( $ post_id, 'longtitle', true)) 
 {
 return $ nouveau_title; 
} 
} 
 return $ title; 
} 
 add_filter ('the_title', 'pcdg_filter_title', 10,2); 
0
PC Doctor Go