php

2013-02-21 62 views
7

में डायनामिक फ़ंक्शन नाम मैं वर्डप्रेस में "कस्टम पोस्ट प्रकार" के निर्माण को सरल बनाना चाहता हूं क्योंकि यह एक ही स्क्रिप्ट के माध्यम से जाने के लिए कठिन है और सभी कस्टम पोस्ट प्रकार नामों को मैन्युअल रूप से ओवरराइड बदलता है।php

सीपीटी नाम युक्त चर बनाने और इसे हर जगह इसका उपयोग करने के द्वारा हासिल करना काफी आसान है। इस तरह, मुझे बस इतना करना है कि स्क्रिप्ट की शुरुआत में चर घोषित करें और बाकी की देखभाल करनी चाहिए।

एकमात्र मुद्दा यह है कि, इसे काम करने के लिए, मुझे स्क्रिप्ट के अंदर प्रत्येक फ़ंक्शन के सामने सीपीटी नाम को उपसर्ग करने की भी आवश्यकता है और ऐसा लगता है कि फ़ंक्शन नाम में एक चर का उपयोग करना आसान नहीं है या PHP में भी अनुशंसित नहीं है ।

तो मैं इसे कैसे हल कर सकता हूं?

यहाँ नीचे एक उदाहरण बनाने के लिए है यह स्पष्ट:

$prefix = 'news'; 

function news_custom_type_init() 
{ 
    global $prefix; 

    register_post_type($prefix, array(
    'labels' => array(
      'name' => $prefix, 
      'singular_label' => $prefix, 
      'add_new' => 'Add', 
      ... 
     )); 

     register_taxonomy_for_object_type('category', $prefix); 
} 
add_action('init', $prefix.'_custom_type_init'); 

यह लगभग ठीक है और अगर केवल मैं गतिशील क्रम में समारोह का नाम बदलने सकता है में शब्द "समाचार" लिखने के लिए नहीं मानकीकृत किया जा सकता है इसके सामने लेकिन इसके बजाय "$ उपसर्ग" का उपयोग करें।

यह अच्छा हो सकता था लेकिन सिर्फ काम नहीं करता:

$prefix = 'news'; 

$functionName= $prefix."_custom_type_init"; 

function $functionName() 
{ 
    global $prefix; 

    register_post_type($prefix, array(
    'labels' => array(
      'name' => $prefix, 
      'singular_label' => $prefix, 
      'add_new' => 'Add', 
      ... 
     )); 

     register_taxonomy_for_object_type('category', $prefix); 
} 
add_action('init', $prefix.'_custom_type_init'); 

नाम करने के लिए होने मैन्युअल समारोह थोड़े मेरे प्रयास (विशेष रूप से जब स्क्रिप्ट इस तरह के कार्यों के दर्जनों एम्बेड) का मूल उद्देश्य को हराने ।

ऐसा करने का सबसे अच्छा तरीका क्या होगा?

पीएस: मैंने इसके बारे में बहुत कुछ किया और "stackoverflowed" लेकिन मुझे कोई ज़रूरत नहीं है जो मेरी ज़रूरतों को पूरा करता है और वर्डप्रेस त्रुटि संदेश उत्पन्न नहीं करता है।

धन्यवाद।

$function = $prefix . '_custom_type_init'; 
if(function_exists($function)) { 
    $function(); 
} 

उत्तर

5

काफी सरल है, यहाँ एक ऐसी ही Snipped एक परियोजना के रूप में है।

यह उत्तर बीमार सलाह है, जैसा कि कोई दृष्टिकोण है जिसमें कोड को स्ट्रिंग के रूप में शामिल किया गया है, क्योंकि यह आमंत्रण (अन्य चीजों के साथ) को सम्मिलित करता है।


इम यकीन नहीं करता है, तो इसका इस्तेमाल करने की सलाह दी जाती है, या यदि यह आप में मदद करता है, लेकिन php आप बनाना "गुमनाम" कार्यों की अनुमति देता है:

function generateFunction ($prefix) { 
    $funcname = create_function(
     '/* comma separated args here */', 
     '/* insert code as string here, using $prefix as you please */' 
    ); 
    return $funcname; 
} 

$func= generateFunction ("news_custom_type_init"); 
$func(); // runs generated function 

मैं यह सोचते हैं हूँ ADD_ACTION बस जो भी आप फ़ंक्शन को कॉल बीतने के।

http://php.net/manual/en/function.create-function.php

नोट: create_function नाम आप चाहते हैं के साथ एक समारोह वापस आ जाएगी नहीं है, लेकिन समारोह की सामग्री को अपने नियंत्रण में हो जाएगा, और समारोह के असली नाम महत्वपूर्ण नहीं है।

+0

उपयोग करने के लिए मुझे यकीन है कि मैं अपने आप को स्पष्ट कर दिया है नहीं कर रहा हूँ (या शायद मैंने नहीं किया अपने बिंदु को समझें)। आपकी स्क्रिप्ट यह देखने के लिए जांचती है कि फ़ंक्शन पहले से मौजूद है या नहीं, इसके लिए फ़ंक्शन को मैन्युअल रूप से पहले स्थान पर बनाया जाना चाहिए था, है ना? मैं गतिशील रूप से एक मौजूदा फ़ंक्शन को "कॉल" करने की कोशिश नहीं कर रहा हूं, जो मैं करने की कोशिश कर रहा हूं वह उस कार्य को गतिशील रूप से "बनाना" है। इसे सरल बनाने के लिए, मेरी लिपि में, मैं बस कहीं से भी "समाचार" शब्द मिटाना चाहता हूं लेकिन पहले निर्देश से और स्क्रिप्ट को काम करने के लिए प्राप्त करना चाहता हूं। अगर मैं तुम्हें नहीं मिला, तो मुझे खेद है। – Baylock

+0

यदि मैं सही ढंग से समझता हूं, तो आप "news_something" और "blog_something" जैसे कई फ़ंक्शन चाहते हैं। फिर आवश्यकतानुसार गतिशील रूप से कॉल करें। मैंने जो कोड प्रदान किया है उसे init() में बुलाया जाना चाहिए और कॉल करने के लिए फ़ंक्शन का चयन करना चाहिए। यदि आप चाहते हैं कि एक ही फ़ंक्शन को कई स्थानों से बुलाया जाए, तो मेरा मानना ​​है कि आपको फ़ंक्शंस बनाने और उन्हें एक ही फ़ंक्शन कॉल करने की आवश्यकता है, क्योंकि उन्हें PHP में पंजीकृत होने की आवश्यकता है। – hexblot

+0

आपकी मदद हेक्सबॉट के लिए धन्यवाद। मैंने अपने संदेश को एक गैर-कामकाजी उदाहरण के साथ अपने उद्देश्य की बेहतर समझ के लिए ऊपर संपादित किया। – Baylock

1

संपादित करें (2017-04): बेनामी कार्य (ठीक तरह से लागू), जाना डेविड Vielhuber द्वारा जवाब देखने के लिए जिस तरह से कर रहे हैं

+0

धन्यवाद cernunnos, मैं इसे आजमाने जा रहा हूं। मैं यहां केवल भाषा द्वारा ही सीमित नहीं हूं, मैं वर्डप्रेस यांत्रिकी द्वारा भी सीमित हूं। उम्मीद है कि यह काम करेगा। मैं तुम्हारे पास वापस मिलने आऊँगा। – Baylock

+0

यह काम नहीं करता है। कम से कम वर्डप्रेस में नहीं। यह किसी अन्य कोर पेज पर एक त्रुटि उत्पन्न करता है (घातक त्रुटि: किसी गैर-ऑब्जेक्ट पर /home/www/xxx/web/admin/wp-includes/rewrite.php) में किसी सदस्य फ़ंक्शन add_rewrite_tag() पर कॉल करें। इसके अलावा, मुझे विश्वास नहीं है कि यह "add_action" के रूप में जाने का तरीका है जो फ़ंक्शन को ट्रिगर करता है, एक स्ट्रिंग की आवश्यकता होती है। – Baylock

+1

बात करता है, जेनेटरेक्शन एक स्ट्रिंग देता है, उसके पास आपके पास अपेक्षित नाम नहीं है: $ prefix के बजाय। "_ Customblabla" यह "lamda_5" जैसा होगा, लेकिन वह नाम स्ट्रिंग के रूप में एक चर पर सहेजा जाएगा और हो सकता है add_action (इसके वैध कॉलबैक, और वर्डप्रेस एड_एक्शन एपीआई को पास किया गया है यह कहता है कि यह वैध कॉलबैक स्वीकार करता है)। कोड स्ट्रिंग में एक मरने ("मैं यहां मर गया") जोड़ने का प्रयास करें ताकि यह देखने के लिए कि वर्डप्रेस वास्तव में वहां जाता है (या एक त्रुटि_लॉग ("ब्लै")) – cernunnos

3

यह एक पुरानी धागा है, लेकिन बस गुमनाम कार्यों का उपयोग:

add_action('init', function() use($args) { 
    //... 
}); 

फिर इतने सारे कार्यों की घोषणा करने की कोई जरूरत नहीं है।

+0

वोट करने के लिए बिल्कुल सही हैं जब आप एक लूप में मानचित्र का उपयोग करके एकाधिक पोस्ट प्रकार बना रहे हैं तो एक शक्तिशाली तकनीक। यह आमतौर पर एक अच्छा विचार है यदि पोस्ट प्रकार कुछ कार्यक्षमता साझा करते हैं लेकिन डेटा पदानुक्रम से भिन्न होते हैं और माता-पिता आदि के रूप में एक दूसरे के साथ नहीं जोड़ा जाना चाहिए – sampoh

+0

यदि लोग अन्य मॉड्यूल के कार्यों को सीधे कॉल कर रहे हैं तो इसमें कोई समस्या है। ऐसा नहीं है कि आपको ऐसा करना चाहिए लेकिन ऐसा हो सकता है। – jgmjgm