2013-02-21 14 views
7

Ich mag würde die Schaffung von „Custom Beitrag Typen“ in Wordpress vereinfachen, da es mühsam ist durch das gleiche Skript zu gehen und all benutzerdefinierte Post Typnamen Instanzen manuell ändern, immer und immer wieder.Dynamische Funktionsname in PHP

Es ist ziemlich einfach zu erreichen, indem Sie eine Variable erstellen, die den CPT-Namen enthält, und sie überall dort verwenden, wo sie benötigt wird. Auf diese Weise muss ich nur die Variable am Anfang des Skripts deklarieren, und das sollte sich um den Rest kümmern.

Das einzige Problem ist, dass, um es funktionieren zu lassen, ich auch den CPT-Namen vor jeder Funktion im Skript voranstellen muss und es scheint, dass die Verwendung einer Variablen in einem Funktionsnamen nicht einfach oder sogar in PHP empfohlen wird .

Also, wie könnte ich das lösen? Hier

ist ein Beispiel unten deutlich zu machen:

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

Das ist fast in Ordnung und kann standardisiert werden, wenn ich nur könnte dynamisch die Funktion, um umbenennen nicht das Wort „news“ schreiben zu müssen in davor aber verwenden Sie stattdessen das "$ Präfix".

Dieses schön gewesen, hätte aber einfach nicht funktioniert:

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

manuell die Funktion irgendwie den ursprünglichen Zweck meines Versuch vereiteln (vor allem, wenn das Skript wie diese Dutzende von Funktionen bettet) zu nennen Having .

Was wäre der beste Weg, dies zu tun?

PS: Ich googeln und „stackoverflowed“ viel darüber, aber fand keine funktionierende Lösung, die meine Bedürfnisse passen und nicht eine Wordpress-Fehlermeldung.

Vielen Dank.

Antwort

5

Einfach genug, hier ist eine ähnliche snipped ein Projekt bilden:

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

zu verwenden, ist mir nicht sicher, nutzen könnte bin ich mir klar gemacht (oder vielleicht habe ich nicht verstehe deinen Standpunkt). Ihr Skript prüft, ob die Funktion bereits existiert und deshalb sollte die Funktion von Anfang an manuell erstellt worden sein, oder? Ich versuche nicht, eine existierende Funktion dynamisch zu "rufen", sondern genau diese Funktion dynamisch zu "erstellen". Um es einfach zu machen, möchte ich in meinem obigen Skript nur das Wort "Nachrichten" von überall löschen, außer von der ersten Anweisung und das Skript zum Laufen bringen. Wenn ich dich nicht verstanden habe, tut es mir leid. – Baylock

+0

Wenn ich richtig verstehe, möchten Sie eine Reihe von Funktionen haben, wie "news_something" und "blog_something" usw. Rufen Sie dann dynamisch den benötigten an. Der von mir bereitgestellte Code sollte in init() aufgerufen werden und die aufzurufende Funktion auswählen. Wenn Sie möchten, dass die gleiche Funktion von mehreren Standorten aufgerufen wird, müssen Sie die Funktionen erstellen und sie die gleiche Funktion aufrufen, da sie in PHP registriert werden müssen. – hexblot

+0

Vielen Dank für Ihre Hilfe Hexbot. Ich habe meine obige Nachricht bearbeitet, um mein Ziel mit einem nicht funktionierenden Beispiel besser zu verstehen. – Baylock

1

Edit (2017-04): Anonyme Funktionen (richtig implementiert) ist der Weg zu gehen, siehe Antwort von David Vielhuber.

Diese Antwort ist schlecht beraten, wie jeder Ansatz, der Code als String enthält, weil dies (unter anderem) Verkettung einlädt.


Ich bin nicht sicher, ob es ist ratsam, zu verwenden, oder, wenn es hilft Ihnen, aber PHP ermöglicht es Ihnen, „anonymous“ Funktionen zu erstellen:

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 

Ich gehe davon aus add_action nur Anrufe unabhängig von Funktion, die Sie bestanden.

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

Hinweis: create_function nicht eine Funktion mit dem Namen zurückkehren Sie wollen, aber der Inhalt der Funktion unter Ihrer Kontrolle, und der Name der Funktion ist nicht wichtig.

+0

Danke cernunnos, ich werde das versuchen. Ich bin hier nicht nur durch die Sprache eingeschränkt, sondern auch durch die WordPress-Mechanik. Hoffe, es wird funktionieren. Ich melde mich bei dir. – Baylock

+0

Es funktioniert nicht. Zumindest nicht in WordPress. Es erzeugt einen Fehler auf einer anderen Kernseite (Schwerwiegender Fehler: Aufruf einer Memberfunktion add_rewrite_tag() auf einem Nichtobjekt in /home/www/xxx/web/admin/wp-includes/rewrite.php). Außerdem glaube ich nicht, dass es der Weg ist zu gehen, da die "add_action", die die Funktion auslöst, eine Zeichenfolge benötigt. – Baylock

+1

Das ist die Sache, gentareFunction gibt eine Zeichenkette zurück, hat nicht den Namen, den Sie erwarten: anstelle von $ prefix. "_ Customblabla" wird etwas wie "lamda_5" sein, aber dieser Name wird in einer Variablen als Zeichenkette gespeichert übergeben an add_action (es ist ein gültiger Callback, und Wordpress add_action api sagt, dass es einen gültigen Callback akzeptiert). Versuchen Sie einen Würfel ("ich starb hier") in der Code-Zeichenfolge, um zu sehen, ob Wordpress tatsächlich dort ankommt (oder ein Fehlerprotokoll ("bla")) – cernunnos

3

Dies ist ein alter Thread, sondern einfach verwendet anonyme Funktionen:

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

Dann gibt es keine Notwendigkeit, so viele Funktionen zu erklären.

+0

Eine leistungsfähige Technik, wenn Sie mehrere Post-Typen mit einer Karte in einer Schleife erstellen. Dies ist im Allgemeinen eine gute Idee, wenn Post-Typen einige Funktionen teilen, sich aber von der Datenhierarchie unterscheiden und nicht als Eltern etc. miteinander verbunden werden sollen. – sampoh

+0

Es gibt ein Problem damit, wenn Leute andere Modulfunktionen direkt aufgerufen haben. Nicht, dass du das tun solltest, aber es kann passieren. – jgmjgm