2010-11-03 5 views
0

J'ai hérité d'un plugin Wordpress qui rend les champs personnalisés disponibles lors de la modification des pages et/ou des messages. Il ajoute un contenu légèrement différent pour les pages que pour les publications. Le plugin détermine la page ou après ce qui suit:Déterminer si je suis en train d'éditer une page ou un post dans Wordpress

if(preg_match('|post.php|i', $_SERVER['SCRIPT_NAME']) || preg_match('|post-new.php|i', $_SERVER['SCRIPT_NAME'])) { 
     add_meta_box('qaws_' . $cg ,$group, 'qaws_admin_meta', 'post', 'advanced', 'core'); 
    } elseif(preg_match('|page.php|i', $_SERVER['SCRIPT_NAME']) || preg_match('|page-new.php|i', $_SERVER['SCRIPT_NAME'])) { 
     add_meta_box('qaws_' . $cg ,$group, 'qaws_admin_meta', 'page', 'advanced', 'core'); 
    } 

Cela a bien fonctionné dans les anciennes versions de Wordpress, car ils ont utilisé post.php dans l'URL lors de l'édition et les messages page.php lors de l'édition des pages. Maintenant, cependant, Wordpress ne le fait pas. Les messages et les pages sont édités avec une URL qui ressemble à: post.php?post=4&action=edit, le seul identifiant possible dans l'URL est le numéro de poste. Alors comment identifier si je suis en train de modifier une page ou un post? Y at-il une fonction Wordpress qui peut facilement me dire cela? Est-ce la seule option pour saisir le numéro de poste et en quelque sorte le vérifier pour voir ce que c'est?

Comment aborderiez-vous cela?


EDIT: Voici ce que je faisais ... plutôt que de faire le preg_match je récupérai l'id global $, utilisé get_all_page_ids() pour obtenir une liste de toutes les pages et correspondait à l'ID $ à les identifiants dans le tableau get_all. S'il y a une correspondance, faites la page add_meta_box, sinon faites le post.

J'ai également déplacé la vérification d'une boucle dans laquelle il a enregistré un groupe à l'heure pour rendre la page. Maintenant, je mets un drapeau juste au début et dans la boucle les rends ces méta_boxes juste vérifient pour voir si ce drapeau est isset.

Répondre

2

Il serait préférable d'utiliser get_post_type ($ id)

http://codex.wordpress.org/Function_Reference/get_post_type

+0

Merci pour la réponse. C'est une bonne réponse! Le seul problème avec ceci est si je crée une nouvelle page ou poste, alors je n'ai pas une page ou un id de publication pour tester contre. Cependant, je gère déjà cela avec: preg_match ('| post_type = page | i', $ _SERVER ['QUERY_STRING']) afin que je puisse utiliser la fonction que vous suggérez avec ce match preg et que je sois toujours prêt à partir. Merci! – Lothar

3

Est-ce que la fonction is_page() est disponible pour votre plugin?

Voir ici: http://codex.wordpress.org/Conditional_Tags

+0

pas dans la zone d'édition admin. 'is_page()' ne fonctionne que lorsque la page elle-même est affichée. J'affiche seulement la zone d'édition et charge les données de cette page dedans. – Lothar

+0

Je crois que is_page est disponible du côté admin, mais nécessite l'argument '$ page' -' is_page (post_id_from_url) '. Saisissez simplement l'identifiant de l'URL. – Gavin

+0

J'ai ajouté ma solution à la question, si vous êtes curieux. – Lothar

0

Voici ce que j'utilise:

if(strstr($_SERVER['REQUEST_URI'], 'wp-admin/post-new.php') || strstr($_SERVER['REQUEST_URI'], 'wp-admin/post.php')) { 
    //I'm editing a post, page or custom post type 
}else{ 
    //I'm doing none of the above. 
} 

Bonne chance!

1

vous pouvez essayer d'utiliser la fonction get_current_screen(), pour vérifier si vous modifiez du poste ou page, il vous suffit de définir une condition

$screen = get_current_screen(); 
if($screen->post_type == 'page'){ 
//do something for page screens only 
}elseif($screen->post_type == 'post'){ 
//do something for post screens only. 
} 

Faites-moi savoir si cela fonctionne pour vous.

1

dans le fichier/wp-admin/includes/screen.php ligne 530 @see set_current_screen()

global $typenow 
$typenow = $this->post_type; 

Voici ce que j'utilise:

if ($typenow == 'post') { 
//do something for post screens only. 
} 

ou

if ($typenow == 'page') { 
//do something for page screens only. 
} 
Questions connexes