2011-03-01 12 views
13

Czy masz jakiś sposób na zapisanie tylko postów w postach? Sposób, w jaki mój functions.php jest kodowany, polega na sczepianiu wielu niestandardowych pól do zwykłych postów i stron, które ich nie potrzebują/używają.Jaką akcję można zastosować w WordPressie, która uruchamia się po zapisaniu lub zaktualizowaniu niestandardowego wpisu?

+0

próbuje zakodować niestandardowych słupki podtrzymujące, każda z własnymi pól niestandardowych, ale oszczędność pola na save_post koliduje z każdym innym rodzajem postu w Wordpress. Czy istnieje zmienna dostępna z akcji save_form, która mówi, jaki typ wpisu jest zapisywany? Czy są zapisywane zdarzenia dotyczące niestandardowych postów? –

+0

Sprawdź moją odpowiedź. – Sandwich

Odpowiedz

14

Updated od 3.7.0 - rekwizyty @Baptiste dla przypomnienia

3.7.0 wprowadziła "save_post_{$post->post_type}" hak, który zostanie wywołany przez rodzaj postu. Pozwala to dodać akcję specyficzną dla niestandardowego typu wpisu (lub "strony" lub "postu" itp.). W ten sposób zaoszczędzisz jedną linię poniżej.

Zaakceptowana metoda polega na dodaniu akcji pod numer save_post_{post-type} (w powyższym przykładzie należy zastąpić wkręt w rodzaju postu na {post-type}). Istnieje szereg kontroli można/prawdopodobnie należy jeszcze zrobić w ciągu zwrotnego twojej akcji, w której dokument w poniższym przykładzie:

z the Codex:

/* Register a hook to fire only when the "my-cpt-slug" post type is saved */ 
add_action('save_post_my-cpt-slug', 'myplugin_save_postdata', 10, 3); 

/* When a specific post type's post is saved, saves our custom data 
* @param int  $post_ID Post ID. 
* @param WP_Post $post Post object. 
* @param bool $update Whether this is an existing post being updated or not. 
*/ 
function myplugin_save_postdata($post_id, $post, $update) { 
    // verify if this is an auto save routine. 
    // 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 (!wp_verify_nonce($_POST['myplugin_noncename'], plugin_basename(__FILE__))) 
     return; 


    // Check permissions 
    if ('page' == $post->post_type) 
    { 
    if (!current_user_can('edit_page', $post_id)) 
     return; 
    } 
    else 
    { 
    if (!current_user_can('edit_post', $post_id)) 
     return; 
    } 

    // OK, we're authenticated: we need to find and save the data 

    $mydata = $_POST['myplugin_new_field']; 

    // Do something with $mydata 
    // probably using add_post_meta(), update_post_meta(), or 
    // a custom table (see Further Reading section below) 

    return $mydata; 
} 

Jeśli rejestracji wielu niestandardowe typy post, a ty chciałbyś skonsolidować swoją funkcję save_post w jedną funkcję, a następnie podłączyć się do ogólnej akcji save_post. Pamiętaj jednak, aby przeprowadzić kontrolę typu postu w ramach funkcji, jeśli istnieją różnice w sposobie zapisywania danych przez te typy postów.

np: if ('my-cpt-1' == $post->post_type){ // handle my-cpt-1 specific stuff here ...

+0

Ile razy można dodać 'add_action ('save_post', 'myplugin_save_postdata');'? Czy powinieneś dodać nowy dla każdego nowego metabolusa (oczywiście zmieniając nonces i 'myplugin_save_postdata' na jakąkolwiek nazwę twojej funkcji, za każdym razem)? – Amanda

+3

@Amanda: Inne niż (nieznaczne) działanie, podejście, które sugerujesz, zadziała, i prawdopodobnie będzie łatwiejsze do przeanalizowania dla ludzi, ponieważ możesz skojarzyć operację "Zapisz" z tym samym blokiem kodu, w którym definiujesz metaboksu, zachować porządek i porządek. Alternatywnym podejściem jest zdefiniowanie pojedynczego wywołania zwrotnego funkcji "Zapisz" dla całego motywu lub wtyczki, może nawet hermetyzowane w obrębie własnej klasy lub co najmniej osobnego pliku, a następnie użycie instrukcji switch do zdefiniowania poszczególnych zapisów metabox. Kwestia stylu kodowania i osobistych preferencji. –

+0

takie podejście nie jest już konieczne od wersji 3.7, sprawdź odpowiedź pod spodem. – Baptiste

24

WordPress 3.7 wprowadzono nowy sposób obsługi to z hakiem save_post_{$post_type}.

Załóżmy, że Twój niestandardowy typ wpisu to "katalog członków". Teraz można uruchomić save_post na tego typu postu tylko za pomocą czegoś takiego:

function my_custom_save_post($post_id) { 

    // do stuff here 
} 
add_action('save_post_member-directory', 'my_custom_save_post'); 
+0

Awesome, gdzie to znalazłeś? Udało mi się to samemu zrozumieć eksperymentując, ale nie widziałem nic na ten temat w oficjalnej dokumentacji: http: //codex.wordpress.org/Plugin_API/Action_Reference/save_post Tylko zgadliście, aby to zrobić po obejrzeniu nowej akcji add_meta_boxes {post-type} (patrz: http://codex.wordpress.org/Plugin_API/Action_Reference/add_meta_boxes). – hallodom

+0

Śledziłem rozwój 3.7 i zauważyłem to. Zatwierdzenie, w którym zostało dodane, jest [tutaj] (https://core.trac.wordpress.org/changeset/25050). Nie sądzę, że został udokumentowany w Kodeksie gdziekolwiek. Przynajmniej nie był to ostatni raz, kiedy patrzyłem. – mindctrl

+0

Chociaż masz rację co do nowego haka akcji, ten przykład wprowadza w błąd, ponieważ brakuje ci wielu możliwości i sprawdzeń kontekstu, które naprawdę powinny zostać uwzględnione. Zobacz http://stackoverflow.com/a/6270232/467386 dla bardziej kompletnego rozwiązania. –

Powiązane problemy