क्या पोस्ट बनाते समय डिफ़ॉल्ट कस्टम फ़ील्ड सेट करने का कोई तरीका है?


11

जब मैं "एड न्यू" पर क्लिक करने के बाद नया पोस्ट बना रहा होता हूं , जब पोस्ट एडिटर दिखाता है, बजाय ड्रॉपडाउन का उपयोग करने के लिए और उपयोग करने के लिए एक कस्टम फ़ील्ड चुनें, तो मैं पहले से ही कुछ डिफ़ॉल्ट कस्टम फ़ील्ड इनपुट लेना चाहता हूं खुला अंत।

इसके बजाय:

यहाँ छवि विवरण दर्ज करें

मुझे कुछ पसंद है:

यहाँ छवि विवरण दर्ज करें

मुझे पता है कि इसके लिए प्लगइन्स (CPT, अधिक फ़ील्ड्स, आदि) हैं, लेकिन मैं इसे मूल फ़ंक्शन के साथ करने का एक सरल तरीका चाहूंगा।

मैंने कुछ इस तरह की कोशिश की (मैं एक कस्टम पोस्ट प्रकार 'उत्पाद का उपयोग कर रहा हूं):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

लेकिन वह काम नहीं करता है। मुझे लगता है कि हुक शायद गलत है (क्योंकि edit_postएक अपडेट के बाद आता है), लेकिन मुझे "नई पोस्ट" के लिए कोई हुक नहीं दिखता है (ठीक wp व्यवस्थापक में "नई पोस्ट" पर उपयोगकर्ता क्लिक के बाद)। क्या वहाँ कोई ?

या हो सकता है कि पूरा विचार गलत हो और कोई दूसरा तरीका हो?

जवाबों:


9

एक्शन हुक save_postको सेव कहा जाता है, लेकिन मुझे नहीं पता कि आप इस समय मेटाडेटा जोड़ सकते हैं या नहीं। लेकिन कार्रवाई हुक के साथ पोस्ट को सहेजने के बाद अपना मेटा डेटा बनाना / अपडेट करना संभव होना चाहिए updated_post_meta

संपादित करें

पोस्ट निर्माण स्क्रीन पर कुछ मेटा फ़ील्ड (कस्टम फ़ील्ड) का चयन करने के लिए, आपको इन मेटा मानों को पहले खाली मान के साथ जोड़ना होगा।

यदि आप फ़ाइल में post_custom_meta_box()फ़ंक्शन (जो उपयोग किए गए मेटाबोक्स के लिए कॉलबैक है postcustom) wp-admin/includes/meta-boxes.phpको देखते हैं, तो आप देख सकते हैं कि फ़ंक्शन list_meta()पूर्व-चयनित मेटा फ़ील्ड बनाने के लिए उपयोग कर रहा है।

अब कार्यक्रम प्रवाह पर एक नज़र डालते हैं जब तक कि यह मेटाबोक्स प्रदर्शित नहीं होता है (हम एक क्रिया / फ़िल्टर हुक की तलाश कर रहे हैं जो हम यहां उपयोग कर सकते हैं):

  1. वर्डप्रेस फ़ाइल लोड करता है post-new.php
  2. यह फ़ाइल डेटाबेस 39में फ़ंक्शन के साथ लाइन में एक डिफ़ॉल्ट पोस्ट उत्पन्न करती है get_default_post_to_edit()। यह अच्छा है। मूल रूप से पोस्ट पहले से ही डेटाबेस में एक ऑटो-ड्राफ्ट के रूप में है। दुर्भाग्य से इन आंकड़ों को बदलने या कुछ नया जोड़ने के लिए इस समय कोई हुक नहीं है।
  3. अगले चरण के रूप में, फ़ाइल edit-form-advaned.phpशामिल है। यह फ़ाइल छेद व्यवस्थापक पृष्ठ उत्पन्न करेगी और इसमें supportsपोस्ट प्रकार के पैरामीटर के आधार पर सभी आवश्यक मेटाबॉक्स शामिल हैं ।
  4. लाइन 136पर कस्टम फ़ील्ड मेटाबोक्स postcustomशामिल है और उपरोक्त फ़ंक्शन को कहा जाता है। फिर से, कोई कार्रवाई हुक जो हम उपयोग कर सकते हैं।

निष्कर्ष

मुझे लगता है कि jQuery का उपयोग करने या postcustomमेटाबोक्स को अधिभार करने का एकमात्र तरीका आप list_meta()फ़ंक्शन चलाने से पहले मेटा मान जोड़ सकते हैं ।

उदाहरण के लिए

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}

बात यह है कि मैं अभी के लिए बचत पर कुछ भी जोड़ने की कोशिश नहीं कर रहा हूं, मैं कुछ कस्टम फ़ील्ड इनपुट पहले से ही खोलने की कोशिश कर रहा हूं जब उपयोगकर्ता संपादन पृष्ठ पर (स्क्रीन के साथ अपडेट देखें)
mike23

आह। अब मैं आपकी समस्या को समझता हूं। मैंने अपना उत्तर संपादित कर दिया है।
रॉफ्लोक्स

3

यह कस्टम फ़ील्ड समर्थन जोड़ने के लिए उचित विधि है (पोस्ट संपादित करते समय आपको खाली फ़ील्ड नहीं मिलती है)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');

1

आपको save_post कार्रवाई का उपयोग करना चाहिए और पोस्ट प्रकार की जांच करके अपने ऑपरेशन को अलग करना चाहिए क्योंकि यह सभी पोस्ट प्रकारों पर चलता है। स्पष्ट रूप से कुछ और तर्क हैं जो आपको इसमें काम करने के लिए बनाने होंगे। आपको संभवतः एक पोस्ट मेटा फ़ील्ड सेट करना चाहिए जो यह जाँचता है कि क्या आपने एक बार चूक निर्धारित की है ताकि आपके उपयोगकर्ता निराश न हों यदि वे पोस्ट मेटा फ़ील्ड खाली छोड़ना चाहते हैं।

यदि आप चाहते हैं कि डिफॉल्ट अशक्त हो (जैसा कि आपके कोड उदाहरण में देखा गया है), तो एक फ़ंक्शन न बनाएं क्योंकि यह बस ओवरहेड और पोस्ट मेटा फ़ील्ड जोड़ता है जो डिफ़ॉल्ट रूप से मानों से आबाद नहीं होते हैं।

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');

1

मैं WP साइट पर प्रत्येक कस्टम पोस्ट के लिए एक अद्वितीय मेटा विवरण देख रहा हूँ, जिसका मैं विकास कर रहा हूँ। इसलिए मैं भी एक डिफ़ॉल्ट कस्टम फ़ील्ड की तलाश कर रहा था और यहाँ उतरा।

मुझे पता है कि यह एक बहुत पुरानी पोस्ट है, लेकिन मुझे लगा कि मैं mariokostelac.com पर पाया गया सरल उत्तर पोस्ट करूँगा

kg मेरा नाम स्थान है, आप जो चाहें उसे फंक्शन का नाम दे सकते हैं। मैं हुक के लिए नया हूँ और WP सामान्य रूप से अनुरूपण कर रहा हूं, लेकिन मेरा मानना ​​है कि wp_insert_post वह हुक है जिसे आप खोज रहे हैं।

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}

FYI करें: वहाँ है get_post_type()। साथ ही, ढीली तुलना करते समय, आपको योडा शैली की स्थिति सिंटैक्स का उपयोग करना चाहिए।
kaiser

@ka तुम योको शैली के साथ क्या मतलब है? इसके अलावा क्यों get_post_type($post_id) बेहतर है $_GET['post_type']?
अजीज

1
तुलना से पहले मूल्य का उपयोग करें 'page' === $_GET['post_type']:। वरना, जब आप एक भी भूल जाते हैं =कि आप एक स्थिति है जहाँ आप में जा सकते हैं आवंटित बजाय दो मानों की तुलना के एक मूल्य। और वह आपके डेटाबेस में कचरा के रूप में समाप्त हो जाएगा। तुम भी === सुरक्षित तुलना प्रकार का उपयोग करना चाहते हो सकता है (मूल्य है page? और प्रकार का मूल्य है string?)
kaiser

1
@ कासियर मैं देखता हूं - तो अंतिम कोड कुछ इस तरह है 'page' === get_post_type($post_id) :?
अजीज

-1

अगर किसी को पोस्ट प्रकार से कस्टम फ़ील्ड लेने की आवश्यकता होती है तो मैं जिस तरह से मैंने किया था उसके नीचे कोड छोड़ देता हूं और मेरे लिए ठीक काम करता हूं :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action ('wp_insert_post', 'awh_field_type');

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.