L'appel des classes php à partir d'autres fichiers
Je suis en train de travailler sur certains types de poste personnalisés. J'ai fini le premier et réalisé que le metabox code que j'ai été en utilisant pourraient être réutilisées par d'autres, d'avenir, de types de poste personnalisés (ainsi que des pages, messages, etc). Alors j'ai mis la classe dans son propre fichier php et de la functions.php dossier de mon thème enfant. Je n'ai jamais utilisé les classes avant, mais j'ai pensé que je pourrais appeler la classe, d'où que je voulais depuis que je fais pour les fonctions. au lieu de cela je l'ai appelé de mon post-types.php fichier et j'ai obtenu le message d'erreur suivant:
"Fatal error: Class 'My_meta_box' ne trouve pas dans D:\helga\xampp\htdocs\plagueround\wp-content\themes\plagueround_new2\functions\post-types.php sur la ligne 73"
Dans le functions.php de mon thème enfant, je ai inclus le fichier où ma classe vies:
define('CHILDTHEME_DIRECTORY', get_stylesheet_directory() . '/');
//Meta Box Class - makes meta boxes
require_once(CHILDTHEME_DIRECTORY . 'functions/meta_box_class.php');
voici ma classe
//My Meta Box CLASS
//from: http://www.deluxeblogtips.com/2010/05/howto-meta-box-wordpress.html
class My_meta_box {
protected $_meta_box;
//create meta box based on given data
function __construct($meta_box) {
$this->_meta_box = $meta_box;
add_action('admin_menu', array(&$this, 'add'));
add_action('save_post', array(&$this, 'save'));
}
///Add meta box for multiple post types
function add() {
foreach ($this->_meta_box['pages'] as $page) {
add_meta_box($this->_meta_box['id'], $this->_meta_box['title'], array(&$this, 'show'), $page, $this->_meta_box['context'], $this->_meta_box['priority']);
}
}
//Callback function to show fields in meta box
function show() {
global $post;
//Use nonce for verification
echo '<input type="hidden" name="mytheme_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';
echo '<table class="form-table">';
foreach ($this->_meta_box['fields'] as $field) {
//get current post meta data
$meta = get_post_meta($post->ID, $field['id'], true);
echo '<tr>',
'<th style="width:20%"><label for="', $field['id'], '">', $field['name'], '</label></th>',
'<td>';
switch ($field['type']) {
case 'text':
echo '<input type="text" name="', $field['id'], '" id="', $field['id'], '" value="', $meta ? $meta : $field['std'], '" size="30" style="width:97%" />',
'<br />', $field['desc'];
break;
case 'textarea':
echo '<textarea name="', $field['id'], '" id="', $field['id'], '" cols="60" rows="4" style="width:97%">', $meta ? $meta : $field['std'], '</textarea>',
'<br />', $field['desc'];
break;
case 'select':
echo '<select name="', $field['id'], '" id="', $field['id'], '">';
foreach ($field['options'] as $option) {
echo '<option', $meta == $option ? ' selected="selected"' : '', '>', $option, '</option>';
}
echo '</select>';
break;
case 'select2': //for when value and display text don't match
//$options array must be multidimensional with both the 'value' and the 'text' for each option
//for example = array( array(text=>text1,value=>value1),array(text=>text2,value=>value2))
//then in <option> value = $option['value'] and text = $option['text']
echo '<select name="', $field['id'], '" id="', $field['id'], '">';
foreach ($field['options'] as $option) {
echo '<option value="',$option['value'],'"', $meta == $option['value'] ? ' selected="selected"' : '', '>', $option['desc'], '</option>';
}
echo '</select>';
break;
case 'radio':
foreach ($field['options'] as $option) {
echo '<input type="radio" name="', $field['id'], '" value="', $option['value'], '"', $meta == $option['value'] ? ' checked="checked"' : '', ' />', $option['name'];
}
break;
case 'checkbox':
echo '<input type="checkbox" name="', $field['id'], '" id="', $field['id'], '"', $meta ? ' checked="checked"' : '', ' />';
break;
}
echo '<td>',
'</tr>';
}
echo '</table>';
}
//Save data from meta box
function save($post_id) {
//verify nonce
if (!wp_verify_nonce($_POST['mytheme_meta_box_nonce'], basename(__FILE__))) {
return $post_id;
}
//check autosave
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}
//check permissions
if ('page' == $_POST['post_type']) {
if (!current_user_can('edit_page', $post_id)) {
return $post_id;
}
} elseif (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
foreach ($this->_meta_box['fields'] as $field) {
$old = get_post_meta($post_id, $field['id'], true);
$new = $_POST[$field['id']];
if ($new && $new != $old) {
update_post_meta($post_id, $field['id'], $new);
} elseif ('' == $new && $old) {
delete_post_meta($post_id, $field['id'], $old);
}
}
}
}
ensuite dans mon post-types.php fichier où je suis la définition de certains méta boîtes pour un custom post type, j'ai:
$prefix = '_events_';
$post_id = $_GET['post'] ? $_GET['post'] : $_POST['post_ID'] ;
$events_meta_box = array(
'id' => 'wpt_events',
'title' => 'Events Options',
'pages' => array('events'), //multiple post types possible
'context' => 'side',
'priority' => 'low',
'fields' => array(
array(
'name' => 'Headline',
'desc' => 'Enter the heading you\'d like to appear before the video',
'id' => $prefix . 'heading1',
'type' => 'text',
'std' => ''
),
)
);
$my_box = new My_meta_box($events_meta_box);
Soi - comment dois-je faire référence classes à partir d'autres fichiers?
MODIFICATIONS/POURSUITE
simplement en déplaçant le require_once déclaration à la post-types.php (l'un essayant d'appel de la classe) semblait fonctionner. mais pour le fun j'ai essayé le chargement automatique de script
function __autoload($className)
{
require(CHILDTHEME_DIRECTORY .'functions/class_' . $className . '.php') ;
}
où j'ai renommé mon fichier de classe class_My_meta_box.php et My_meta_box est le nom de la classe
qui provoque les erreurs suivantes:
Avertissement: require(D:\helga\xampp\htdocs\plagueround/wp-content/themes/plagueround_new/functions/class_WP_User_Search.php) [function.exiger]: failed to open stream: No such file or directory in D:\helga\xampp\htdocs\plagueround\wp-content\themes\plagueround_new\functions.php sur la ligne 66
Erreur fatale: require() [function.exiger]: Failed opening required 'D:\helga\xampp\htdocs\plagueround/wp-content/themes/plagueround_new/functions/class_WP_User_Search.php' (include_path='.;D:\helga\xampp\php\PEAR') dans D:\helga\xampp\htdocs\plagueround\wp-content\themes\plagueround_new\functions.php sur la ligne 66
je ne comprend pas tout à fait ce qu'il dit, MAIS je pense que c'est en essayant de charger automatiquement certains de wordpress par défaut de la classe... et est à la recherche de mon répertoire où il est évident qu'elle n'existe pas.
- votre metabox.php n'est pas inclus. êtes-vous sûr que le require_once déclaration de chargement est correctement?
require
/require_once
provoquer une erreur fatale si le fichier n'existe pas. Une autre erreur fatale que Helga est arriver.- putain vous êtes tous tellement vite. merci! eh bien j'ai testé le require_once instruction w/ jquery alerte si j'étais/suis assez sûr que c'était de gagner correctement chargé. il semblait fonctionner quand j'ai déménagé le besoin énoncé post-types.php où je faisait référence à la classe
Vous devez vous connecter pour publier un commentaire.
En fait, il n'importe pas si le fichier contient une classe ou quelque chose d'autre. Pour PHP permettre l'exécution de code à partir d'autres fichiers, PHP doit savoir où le fichier est, donc, c'est votre
require
ouinclude
.Exemple:
Lors de l'utilisation de classes, il fait réellement sens pour utiliser une Convention de Nommage et l'utilisation d'un Autochargeur, donc PHP va essayer de comprendre la classe sur son propre, sans avoir à exiger ou à l'inclure.
Vous pouvez utiliser la constante
WP_PLUGIN_DIR
pour décrire le chemin.Suffit d'utiliser le chemin absolu:
or die
déclaration lors de l'utilisation derequire
, comme sirequire
d'échec de votre script se terminera avec une erreur critique.Il ressemble
meta_box_class.php
n'est pas inclus. Pour savoir quels fichiers ont été inclus en tout point, essayez:<?php
au début de meta_box_class.php? (Je suis d'embrayage à pailles ici 😉 )