Dynamique nom de la fonction en php
Je voudrais simplifier la création de "Custom Post Types" dans WordPress comme il est fastidieux de passer par le même script et changer toutes les custom post type nom instances manuellement.
C'est assez simple à réaliser en créant une variable contenant le CPT nom et l'utiliser partout où elle est nécessaire. De cette façon, Tout ce que j'ai à faire est de déclarer la variable dans le début du script et que cela devrait prendre soin du reste.
Le seul problème est que, pour le faire fonctionner, j'ai aussi besoin de préfixer le CPT nom en face de chaque fonction dans le script, et il semble que l'utilisation d'une variable dans une fonction, le nom n'est pas facile, ni même recommandé dans PHP.
Alors, comment pourrais-je résoudre ce problème?
Voici un exemple ci-dessous pour faire clair:
$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');
C'est presque bien et peut être standardisée, si seulement je pouvais dynamiquement renommer la fonction, afin de ne pas avoir à écrire le mot "news" en face d'elle, mais utiliser le "$prefix" à la place.
Cela aurait pu être sympa, mais juste ne fonctionne pas:
$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');
Ayant pour nom manuellement la fonction un peu de la défaite de l'objectif d'origine de ma tentative (en particulier lorsque le script intègre des dizaines de fonctions comme celle-ci).
Quelle serait la meilleure façon de le faire?
PS: j'ai googlé et "stackoverflowed" beaucoup de choses à ce sujet mais n'ai pas trouvé de solution qui correspondent à mes besoins et ne génère pas d'WordPress message d'erreur.
Merci.
OriginalL'auteur Baylock | 2013-02-21
Vous devez vous connecter pour publier un commentaire.
Assez Simple, voici un semblable ciselée sous forme d'un projet:
Si je comprends bien, vous voulez avoir un certain nombre de fonctions, telles que "news_something" et "blog_something" etc. Puis appeler de manière dynamique le besoin d'un. Le code que j'ai fourni doit être invoquée dans init() et sélectionnez la fonction à appeler. Si ce que vous voulez est d'avoir la même fonction qui est appelée à partir de plusieurs endroits, je crois que vous avez besoin pour créer les fonctions et les faire appeler la même fonction, car ils ont besoin d'être inscrit en PHP.
Je vous remercie pour votre aide hexbot. J'ai édité mon message ci-dessus pour avoir une meilleure compréhension de mon propos avec un exemple de travail.
OriginalL'auteur Nick Andriopoulos
C'est un vieux thread mais simplement l'utilisation d'une fonction anonyme:
Il n'est pas nécessaire de déclarer autant de fonctions.
Il y a un problème avec cela, si les gens ont été l'appel à d'autres fonctions du module directement. Non pas que vous devriez faire, mais il peut arriver.
OriginalL'auteur David Vielhuber
Modifier (2017-04): les fonctions Anonymes (correctement mis en œuvre) sont la voie à suivre, voir la réponse de David Vielhuber.
Cette réponse est mal avisée, comme l'est toute approche qui implique de code comme une chaîne de caractères, parce que cette invite (entre autres choses) la concaténation.
Je ne sais pas si c'est conseillé d'utiliser, ou si cela vous aide, mais php vous permet de créer des "anonymes" fonctions :
Je suis en supposant que add_action juste les appels quelle que soit la fonction que vous avez passé.
http://php.net/manual/en/function.create-function.php
Remarque: create_function ne sera pas de retour d'une fonction avec le nom que vous voulez, mais le contenu de la fonction sera sous votre contrôle, et le vrai nom de la fonction n'est pas important.
Il ne fonctionne pas. Au moins pas dans WordPress. Il genereates une erreur sur une autre page (erreur Fatale: Appel d'une fonction membre add_rewrite_tag() sur un non-objet dans /home/www/xxx/web/admin/wp-includes/rewrite.php). D'ailleurs, je ne crois pas que c'est la façon d'aller de l' "add_action" qui déclenche la fonction a besoin d'une chaîne de caractères.
Thats la chose, genetareFunction retourne une chaîne de caractères, il n'auront pas le nom que vous attendez: au lieu de $prefix."_customblabla" ce sera quelque chose comme "lamda_5", mais ce nom ne sera enregistré sur une variable comme une chaîne de caractères et peut être transmise à add_action (valable de rappel, et wordpress add_action api dit qu'il accepte valide de rappel). Essayez d'ajouter un die("je suis mort ici") dans la chaîne de code pour voir si wordpress est là (ou un error_log("bla"))
Le vote car il n'est plus recommandé. Le create_function sera obsolète depuis PHP 7.2. Utiliser la fonction anonyme la place. Le seul inconvénient est que vous ne pouvez pas supprimer l'action une fois accroché avec une fonction anonyme. À partir de PHP docs, "sur la base de cette fonction est fortement déconseillée."
mise à jour de la réponse, vous avez absolument raison de down vote
OriginalL'auteur cernunnos
Je pense que vous pouvez utiliser
runkit_function_add
http://php.net/manual/pl/function.runkit-function-add.php
Une autre méthode consiste à utiliser
eval()
OriginalL'auteur ryczypior
Ce post est vieux, mais PHP 7 mai résoudre cette question.
Essayer:
Je pense que cela devrait fonctionner pour WordPress.
OriginalL'auteur Terry Lin