it-swarm.asia

كيف يمكنني حفظ البيانات التعريفية لنوع منشور مخصص معين فقط؟

أحاول إعداد نوع منشور مخصص يتبع هذا البرنامج التعليمي . ومع ذلك ، فأنا مرتبك بعض الشيء حول كيفية/مكان تنفيذ update_post_meta(). يقترح البرنامج التعليمي هذا النمط:

add_action('save_post', 'save_my_metadata');

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

ما الذي ينجح ، لكن له تأثير مؤسف لإضافة البيانات التعريفية إلى كل منشور ، سواء كان ينتمي إلى هذا النوع المخصص أم لا.

لقد وضعت ما ورد أعلاه في functions.php وأظن أن ذلك قد يكون جزءًا من المشكلة. أظن أنني بحاجة إلى تقييد إجراء "save_post" بحيث يتم تشغيله فقط لمشاركات من النوع المخصص الخاص بي.

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

التي يجب أن تعمل. ما عليك سوى استبدال "your_post_type" باسم نوع المنشور. أيضًا ، حقيقة غير معروفة: تمرير الخطّ "save_post" معرف المنشور كوسيطة.

تصحيح

لقد قمت بتحديث الوظيفة لتعكس تعليق يناير. شكرا جان!

16
John P Bloch

إذا كنت تريد التعامل مع أنواع منشورات متعددة ، أوصي ببيان تبديل أساسي:

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

الحالات هي في الأساس مثل if($post->post_type) == 'post_type_1') {} لكن لا تتطلب كتل متعددة إذا. تعالج الكتلة default الموجودة في المحول الحالات التي لا يكون فيها نوع المنشور في مجموعتك المخصصة.

4
EAMann

John P Bloch وEAMann قد أعطيا بالفعل إجابات رائعة لذلك أنا بالإضافة:

  1. يعتبر بادئة meta_keys الخاص بك مع الشرطة السفلية. يؤدي القيام بذلك إلى إخفاءهم من قائمة الحقول المخصصة المعروضة على شاشة تعديل النشر ، أي.

    function save_my_metadata ($ post_id ، $ post = false) {
     إذا ($ post-> post_type == 'your_post_type') 
     update_post_meta ($ post_id ، '_my_metadata' ، $ _POST ['my_metadata' ])؛ 
    } 
    
    من الواضح أن هذا يعني أنك ستحتاج إلى قاعدة تعريف مخصصة لتكون قادرًا على تحرير الحقول أيضًا. فيما يلي شاشة تعديل للسياق:



  2. شيء آخر يمكنك القيام به هو إضافة الخطاف الخاص بك لجعل حفظ أنواع منشورات محددة أسهل ، على سبيل المثال ، الخطاف الخاص بك يمكن أن يكون "save_{$post_type}_post" ؛ بالنسبة لنوع منشور movie ، سيكون save_movie_post. إليك ما يتعين عليك إضافته إلى ملف functions.php الخاص بموضوعك أو في مكون إضافي في مكان ما:

     add_action ('save_post' ، 'save_custom_post_type_posts' ، 10،2) ؛ 
     function save_custom_post_type_posts ($ post_id ، $ post = false) {
     do_action ("save _ {$ post- > post_type} _POST ")؛ [. .____]} [. .____]
    مع ذلك ، يمكنك إعادة كتابة الكود الأصلي مثل ذلك (بما في ذلك خدعة الشرطة السفلية من رقم 1 أعلاه):

     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

أنا شخصياً أفضل اتباع النموذج أدناه لإضافة معالجات التعريف المخصصة لنشر الأنواع. باستخدام ما يلي ، يمكنك إضافة دعم التعريف إلى نوع المنشور عن طريق إضافة مفتاح الدعم (العنوان الفرعي "في المثال أدناه) إلى صفيف الدعم لنوع المنشور عن طريق الاتصال بـ add_post_type_support ('my_post_type' ، 'العنوان الفرعي') ؛

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

نأمل أن يتم إضافة شيء مثل هذا قريباً إلى القلب.

1
prettyboymp

لا يمكنني الحصول على هذا العمل - لست متأكدًا مما أفعله Im - لكنني أحاول استخدام ربط post_updated بدلاً من save_post - حيث أريد إدراج هذه القيم بعد تحديث المنشور حتى أتمكن من استرداد القيم من الحقول المخصصة الأخرى .

 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

قبل التحديث ، تحقق مما إذا كان المنشور الحالي من نوع المنشور أم لا. سيضمن ذلك عدم حفظه لجميع المشاركات.

يجب عليك التحقق من الإدخال أيضًا (مفقود في المثال الخاص بك) وبجانب ذلك ، ضع في اعتبارك أنك قد تضيف الإجراء فقط عندما يكون نوع المنشور نشطًا. إذا كان هذا هو الحال ، فلست بحاجة إلى التحقق من هذا النوع اللاحق في وقت لاحق.

الحصول على نوع المشاركات: get_post_type() أو $post->post_type;

0
hakre