it-swarm-eu.dev

Jak lze uložit metadata pouze pro konkrétní typ vlastního příspěvku?

Snažím se nastavit vlastní typ příspěvku následovně tento návod . Nicméně jsem trochu zmatený, jak/kde implementovat update_post_meta(). Tento návod navrhuje tento vzor:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

Což funguje, ale má nešťastný efekt přidání metadat ke každému příspěvku, ať už patří k tomuto vlastnímu typu nebo ne.

Uvedl jsem to výše v functions.php a hádám, že by to mohlo být součástí problému. Hádám, že musím omezit akci „save_post“ tak, aby se spouštěla ​​pouze pro příspěvky mého vlastního typu.

15
Bobby Jack
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

To by mělo fungovat. Stačí nahradit 'your_post_type' názvem typu příspěvku. Také málo známá skutečnost: háček 'save_post' předá ID příspěvku jako argument.

UPRAVIT

Aktualizoval jsem funkci, aby odrážel Janův komentář. Díky Jan!

16
John P Bloch

Chcete-li zpracovat více typů příspěvků, doporučuji základní přepínač:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

Případy jsou v podstatě stejné jako if($post->post_type) == 'post_type_1') {}. Ale nevyžadují více bloků if-else. Blok default v přepínači zpracovává případy, kdy typ příspěvku není ve vaší vlastní sadě.

4
EAMann

@ John P Bloch a @ EAMann již dali skvělé odpovědi, takže moje je navíc:

  1. Zvážit předpony meta_keys podtržítkem. Skryje je tak ze seznamu vlastních polí zobrazených na obrazovce úpravy příspěvků, tj.

    function save_my_metadata ($ post_id, $ post = false) {
     if ($ post-> post_type == 'your_post_type') 
     update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata' ]); 
    } 
    
    Samozřejmě to znamená, že budete potřebovat vlastní metabox, abyste mohli pole také upravovat. Zde je obrazovka úprav pro kontext:



  2. Další věc, kterou byste mohli udělat, je přidat svůj vlastní hák, aby se zjednodušily ukládání konkrétních typů příspěvků, tj. Aby váš háček mohl být "save_{$post_type}_post"; pro typ příspěvku movie by to bylo save_movie_post. Zde je to, co byste měli přidat do souboru functions.php motivu nebo někde v pluginu:

     add_action ('save_post', 'save_custom_post_type_posts', 10,2); 
     function save_custom_post_type_posts ($ post_id, $ post = false) {
     do_action ("uložit _ {$ post- > post_type} _post "); 
    } 
    
    Tímto způsobem můžete svůj původní kód přepsat takto (včetně podtržítka z bodu 1 výše):

     add_action ('save_my_postype_post', 'save_my_postype_metadata', 10,2); 
     function save_my_postype_metadata ($ post_id, $ post) {
     update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata']); 
    }
4
MikeSchinkel

Osobně dávám přednost následnému vzoru pro přidávání vlastních meta handlerů do typů příspěvků. S níže uvedeným můžete přidat meta podporu do typu příspěvku pouhým přidáním klávesy support ('subtitle' v příkladu níže) do pole support pro typ příspěvku voláním add_post_type_support ('my_post_type', 'subtitle');

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

Doufejme, že něco takového bude brzy přidáno do jádra.

1
prettyboymp

I cant dostat to do práce - nevíte, co Im dělá špatně - ale Im se snaží použít post_updated háku namísto save_post - jak chci, aby tyto hodnoty byly vloženy po příspěvek byl aktualizován, takže mohu načíst hodnoty z jiných vlastních polí .

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');
0
jrutter

Před aktualizací zkontrolujte, zda je aktuální příspěvek vašeho typu příspěvku. To by zajistilo, že jej neuložíte pro všechny příspěvky.

Měli byste zkontrolovat také vstupní (chybí v příkladu) a vedle toho mějte na paměti, že akci můžete přidat pouze tehdy, když je aktivní tento typ příspěvku. Pokud tomu tak je, nemusíte později kontrolovat tento typ příspěvku.

Získání typu příspěvků: get_post_type() nebo $post->post_type;

0
hakre