Utilizarea câmpului personalizat ca titlu pentru postare personalizată

10 nov. 2011, 06:29:47
Vizualizări: 14.9K
Voturi: 3

Am creat un tip de postare personalizată cu o serie de câmpuri personalizate folosind clasa WPAlchemy. Încerc să iau valoarea unuia dintre câmpurile personalizate și să o folosesc ca titlu al postării. Până acum, însă, nu am avut succes. Am căutat și am încercat următoarele două blocuri de cod:

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

Și... (comentând temporar câmpurile nonce până înțeleg cum funcționează)

add_filter('wp_insert_post_data', 'change_title', 99, 2);
function change_title($data, $postarr)
{    
    // Dacă formularul nostru nu a fost trimis, nu dorim să facem nimic
    if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;

    // Verifică dacă acțiunea vine de la ecranul nostru și cu autorizația corespunzătoare, deoarece save_post poate fi declanșat în alte momente
   // if(!isset($_POST['my_nonce_field'])) return;

    // Dacă nonce este setat, verifică-l
   // if(isset($_POST['my_nonce_field']) && !wp_verify_nonce($_POST['my_nonce_field'], plugins_url(__FILE__))) return;

       // Combină adresa cu termenul
    $title = $_POST['listing_name'];
    $data['post_title'] = $title;

    return $data;
}

În ambele cazuri, rezultatele sunt aceleași:

  1. La salvarea noii postări, se reîncarcă pagina, afișează că a funcționat, dar toate câmpurile personalizate sunt goale. (Fără niciunul dintre codurile de mai sus, postarea personalizată funcționează corespunzător și câmpurile sunt salvate).

  2. La vizualizarea indexului tipului de postare personalizată, postările nu sunt afișate.

Idei?

ACTUALIZARE

Pentru clarificare, folosesc o postare personalizată fără suport pentru titlu. Încerc totuși să completez câmpul titlu folosind valoarea din câmpul personalizat.

0
Toate răspunsurile la întrebare 3
3

Deci, de fiecare dată când salvezi un articol, vrei să înlocuiești valoarea titlului tocmai salvat cu o altă valoare dintr-un câmp personalizat...

Pare că ar trebui să introduci pur și simplu ceea ce dorești să fie titlul în câmpul de titlu propriu-zis.

DAR presupun că asta este pentru scopuri de prezentare: vrei ca acel tip de postare personalizată să afișeze un titlu diferit pe frontend, bazat pe valoarea unui câmp personalizat. Filtrele ar fi o modalitate ușoară de a realiza acest lucru.

the_title, tag-ul de șablon comun, este un înveliș foarte subțire în jurul funcției get_the_title, care conține un filtru numit the_title. Primește două argumente: titlul actual și ID-ul postării. Conectează-te la acel filtru și schimbă titlul pe baza câmpului tău personalizat.

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

Câteva lucruri despre codul tău de reținut:

Acțiunile nu primesc argumente în mod arbitrar. Funcțiile conectate la init, de exemplu, nu primesc niciun argument. Când este apelat do_action, primul argument este numele cârligului. Argumentele ulterioare sunt cele care sunt transmise funcțiilor conectate, dacă dorești (specificate prin al patrulea argument opțional al add_action).

Apelul do_action( 'init' ); se află în wp-settings.php. Aruncă o privire, fără argumente.

Deci asta:

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

Nu va funcționa așa cum te aștepți. Mai mult, apelurile add_action din interiorul funcției pot fi pur și simplu în afara funcției... Acest lucru funcționează bine:

add_action('save_post', 'custom_post_type_title', 100);
function custom_post_type_title( $post_id ) {
    // faci ceva
}

Este nevoie doar să faci ceva la save_post, nu la acesta și la publish_post.

Întotdeauna încerc să evit să merg direct la $wpdb dacă pot, pentru că de multe ori există API-uri mai convenabile. Ceea ce încercai să faci este să actualizezi o postare. Deci folosește wp_update_post. În cazul tău, aceasta nu este o opțiune validă (așa cum menționează codex-ul, poate cauza o buclă infinită).

A fost cam lungă explicația, îmi cer scuze. Sper că a clarificat câteva lucruri despre sistemul de cârlige WordPress!

Fă din acestea cei mai buni prieteni ai tăi:

10 nov. 2011 07:40:53
Comentarii

Christopher, mulțumesc pentru gândurile detaliate! Le voi parcurge și le voi asimila mai amănunțit. Pentru a clarifica, totuși, încerc să realizez un tip de postare personalizată fără a utiliza câmpul de titlu și apoi să afișez un titlu (compus dintr-un câmp personalizat), atât pe frontend, cât și în backend (în lista de postări personalizate). Asta clarifică?

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

Filtrul pe care ți l-am arătat va funcționa pentru asta. Dacă vrei să elimini complet câmpul de titlu, există un argument în array-ul $args pentru register_post_type numit post_type_supports, setează-l astfel: 'post_type_supports' => array( 'content' ), și nu va mai exista titlu pe ecranul de editare.

chrisguitarguy chrisguitarguy
10 nov. 2011 21:47:01

A funcționat! Deci, folosesc un filtru pentru a obține efectul dorit. Dacă aș încerca să preiau valoarea, să zicem prin WPDB, a câmpului post_title, aș obține valoarea "auto draft" - corect? "Puristul" din mine vrea să rezolve asta, deși înțeleg că "filtrul" funcționează. Ce părere ai? MULȚUMESC pentru ajutor!

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

Mulțumesc, filtrul tău a funcționat perfect.

Pentru informație:

Am adăugat o verificare pentru a detecta dacă suntem în Admin, pentru a preveni modificarea titlului "entry-title" în "longtitle" personalizat (implicit = menu-item-title) în timpul editării unei pagini.

function pcdg_filter_title( $title, $post_id )
{
    if(!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 );
25 mar. 2015 13:08:08
0

Este minunat, cum aș putea de exemplu să adaug mai multe câmpuri personalizate pentru acest caz, dacă aș dori să fie pentru un agent imobiliar:

locație • ocupare • preț

ca titlu filtrat în loc să afișez doar numele unui singur câmp personalizat.

Mulțumesc!

29 aug. 2023 02:01:34