Calling php classes from other files

19,552

Solution 1

Actually, it doesnt matter if the file contains a class or something else. For PHP being able to execute code from other files, PHP has to know where the file is, so it's your regular require or include.

Example:

// foo.class.php
class Foo {}

// main.php
require_once '/path/to/foo.class.php';
$foo = new Foo;

When using classes, it actually makes sense to use a Naming Convention and use an Autoloader, so PHP will try to include the class on it's own, without you having to require or include it.

Solution 2

You can use the constant WP_PLUGIN_DIR to describe the path.

// Foo.class.php
class Foo {}

// main.php
require_once WP_PLUGIN_DIR.'/Foo.class.php';
$foo = new Foo;
Share:
19,552
helgatheviking
Author by

helgatheviking

WordPress and WooCommerce developer. I like writing plugins, making guacamole, having adventures and saving the day. If I've saved your day, please consider making a donation to the USA Team Handball Women's National Team. We're travelling to Argentina in June and I'm accepting WooCommerce gigs in exchange for donations. Please do no contact me via email to ask me to look at your question here. If you need urgent help then you might be able to hire me.

Updated on June 05, 2022

Comments

  • helgatheviking
    helgatheviking almost 2 years

    I am working on some custom post types. I finished the first one and realized that the metabox code I was using could be re-used by other, future, custom post types (as well as pages, posts, etc). So I put the class in its own php file and included it from the functions.php file of my child theme. I've never used classes before, but I thought I could then call that class from wherever I wanted since that is what I do for functions. instead I called it from my post-types.php file and got the following error:

    "Fatal error: Class 'My_meta_box' not found in D:\helga\xampp\htdocs\plagueround\wp-content\themes\plagueround_new2\functions\post-types.php on line 73"

    In the functions.php of my child theme I've included the file where my class lives:

    define('CHILDTHEME_DIRECTORY', get_stylesheet_directory() . '/');
    // Meta Box Class - makes meta boxes
    require_once(CHILDTHEME_DIRECTORY . 'functions/meta_box_class.php');
    

    here's my class

    //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);
                }
            }
        }
    }
    

    then in my post-types.php file where i am defining some meta boxes for a custom post type i have:

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

    So- how do I reference classes from other files?

    EDITS/CONTINUATION

    simply moving the require_once statement to the post-types.php (the one trying to call the class) seemed to work. but for the heck of it i tried the autoload script

    function __autoload($className)
    {
            require(CHILDTHEME_DIRECTORY .'functions/class_' . $className . '.php')  ;
    }
    

    where I renamed my class file to class_My_meta_box.php and My_meta_box is the class name

    which results in the following errors: Warning: require(D:\helga\xampp\htdocs\plagueround/wp-content/themes/plagueround_new/functions/class_WP_User_Search.php) [function.require]: failed to open stream: No such file or directory in D:\helga\xampp\htdocs\plagueround\wp-content\themes\plagueround_new\functions.php on line 66

    Fatal error: require() [function.require]: 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') in D:\helga\xampp\htdocs\plagueround\wp-content\themes\plagueround_new\functions.php on line 66

    i don't totally understand what it says, BUT i think it is trying to autoload some default wordpress class... and is looking in my directory where it obviously doesn't exist.