web-dev-qa-db-fra.com

Comment réparer Warning: call_user_func_array ()?

J'ai modifié mon thème metabox.php pour l'adapter à mes besoins, et j'ai eu cet eror

Avertissement de citation de bloc: call_user_func_array () s'attend à ce que le paramètre 1 soit un rappel valide, la fonction 'mytheme_add_box' est introuvable ou un nom de fonction non valide dans E:\xampp\htdocs\wordpress\wp-includes\plugin.php à la ligne 406 Blockquote

Comment puis-je résoudre ce problème?

Ceci est mon ancien code metabox

<?php
$prefix = 'wtf_';

$meta_box = array(
    'id' => 'propertybox',
    'title' => 'Property listing details',
    'page' => 'listings',
    'context' => 'normal',
    'priority' => 'high',
    'fields' => array(
            array(
            'name' => 'Propert ID number',
            'desc' => 'Enter a property ID number, if any ',
            'id' => $prefix . 'pid',
            'type' => 'text',
            'std' => ''
        ),


        array(
            'name' => 'Bath',
            'desc' => 'Number of bathrooms.',
            'id' => $prefix . 'bath',
            'type' => 'text',
            'std' => ''
        ),

        array(
            'name' => 'An',
            'desc' => 'Anul constructiei',
            'id' => $prefix . 'an',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Etaj',
            'desc' => 'Etajul',
            'id' => $prefix . 'etaj',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Balcone',
            'desc' => 'Numar balcoane',
            'id' => $prefix . 'balcon',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Parcare',
            'desc' => 'Numar locuri de parcare',
            'id' => $prefix . 'parcare',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Suprafata totala',
            'desc' => 'Suprafata totala a terenului (Casa/vila)',
            'id' => $prefix . 'suprafatatotala',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Front stradal',
            'desc' => 'Suprafata front stradal',
            'id' => $prefix . 'front',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Suprafata curte libera ',
            'desc' => 'Suprafata curte libera ',
            'id' => $prefix . 'suprafatacurte',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Amprenta casei ',
            'desc' => 'Suprafata amprentei  ',
            'id' => $prefix . 'amprenta',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Regim inaltime',
            'desc' => 'Regim inaltime  ',
            'id' => $prefix . 'inaltime',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Certificat urbanism ',
            'desc' => 'certificat urbanism',
            'id' => $prefix . 'certificat',
            'type' => 'text',
            'std' => ''
        ),      

        array(
            'name' => 'Asking price',
            'desc' => 'Enter the actual asking price ',
            'id' => $prefix . 'price',
            'type' => 'text',
            'std' => ''
        )


    ),

);


add_action('admin_menu', 'mytheme_add_box');

// Add meta box
function mytheme_add_box() {
    global $meta_box;

    add_meta_box($meta_box['id'], $meta_box['title'], 'mytheme_show_box', $meta_box['page'], $meta_box['context'], $meta_box['priority']);
}

// Callback function to show fields in meta box
function mytheme_show_box() {
    global $meta_box, $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 ($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 class="theEditor" 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>',
                '<br />', $field['desc'];
                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>';
}

add_action('save_post', 'mytheme_save_data');

// Save data from meta box
function mytheme_save_data($post_id) {
    global $meta_box;

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

?>

Et c'est mon nouveau code

<?php
$prefix = 'wtf_';

$property_fields = array(
         array(
            'name' => 'Propert ID number',
            'desc' => 'Enter a property ID number, if any ',
            'id'   =>   $prefix.'pid',
            'type' => 'text',
            'std'   => ''
         ),
         array(
            'name' => 'Bath',
            'desc' => 'Number of bathrooms.',
            'id'   => $prefix.'bath',
            'type' => 'text',
            'std'  => ''
         ),      
         array(
             'name' => 'An',
             'desc' => 'Anul constructiei',
             'id'   => $prefix.'an',
             'type' => 'text',
             'std'  => ''
         ));

$mansion_fields = array(    

    array(
        'name' => 'Etaj',
        'desc' => 'Etajul',
        'id' => $prefix . 'etaj',
        'type' => 'text',
        'std' => ''
    ),      

    array(
        'name' => 'Balcone',
        'desc' => 'Numar balcoane',
        'id' => $prefix . 'balcon',
        'type' => 'text',
        'std' => ''
    ),      

    array(
        'name' => 'Parcare',
        'desc' => 'Numar locuri de parcare',
        'id' => $prefix . 'parcare',
        'type' => 'text',
        'std' => ''
    ),      

    array(
        'name' => 'Suprafata totala',
        'desc' => 'Suprafata totala a terenului (Casa/vila)',
        'id' => $prefix . 'suprafatatotala',
        'type' => 'text',
        'std' => ''
    ),      

    array(
        'name' => 'Front stradal',
        'desc' => 'Suprafata front stradal',
        'id' => $prefix . 'front',
        'type' => 'text',
        'std' => ''
    ),      

    array(
        'name' => 'Suprafata curte libera ',
        'desc' => 'Suprafata curte libera ',
        'id' => $prefix . 'suprafatacurte',
        'type' => 'text',
        'std' => ''
    ),      

    array(
        'name' => 'Amprenta casei ',
        'desc' => 'Suprafata amprentei  ',
        'id' => $prefix . 'amprenta',
        'type' => 'text',
        'std' => ''
    ),        

    array(
        'name' => 'Regim inaltime',
        'desc' => 'Regim inaltime  ',
        'id' => $prefix . 'inaltime',
        'type' => 'text',
        'std' => ''
    ),      

    array(
        'name' => 'Certificat urbanism ',
        'desc' => 'certificat urbanism',
        'id' => $prefix . 'certificat',
        'type' => 'text',
        'std' => ''
    ),      

    array(
        'name' => 'Asking price',
        'desc' => 'Enter the actual asking price ',
        'id' => $prefix . 'price',
        'type' => 'text',
        'std' => ''
    ));

add_action( 'add_meta_boxes', 'my_meta_boxes' );
function my_meta_boxes(){
    //Don't forget to change "post" with post_type where you want to add the metaboxes
    add_meta_box("propertybox", "Property Options", "propertybox", "listings", "normal", "high");
    add_meta_box("mansionbox", "Mansion Options", "mansionbox", "listings", "normal", "high");
 }

function propertybox(){
    global $prefix;
    global $property_fields;
   //Put here the fields you want display inside the "Property options" box.
    build_fieds($property_fields);
}

function mansionbox(){
    global $prefix;
    global $mansion_fields;

    build_fieds($mansion_fields);
}

function build_fieds($fields){
     global $post;

     echo '<table class="form-table">';

foreach ($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 class="theEditor" 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>',
        '<br />', $field['desc'];
            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>';
}

add_action('save_post', 'mytheme_save_data');

// Save data from meta box
function mytheme_save_data($post_id) {

    global $mansion_fields;
    global $property_fields;

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

    foreach ($mansion_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);
       }
     }
}
?>
1
Bogdan Bătrânu

Je ne suis pas sûr que cela aidera, mais après avoir traité exactement le même message d'erreur au cours des 2 derniers jours, j'ai finalement compris ce qui se passait. Il s'agissait simplement d'essayer d'appeler la fonction avant que le système ne sache qu'elle existait.

Dans mon cas, j'avais écrit la fonction dans un répertoire distinct - non accessible publiquement - et tenté d'appeler cette fonction dans mon fichier functions.php avant même d'inclure le fichier qui contenait la fonction.

Dans mon fichier custom_funcs.php se trouvait cette fonction:

function my_custom_funk($url, $path = '', $plugin = '') {
    $Host = get_this_cust_url( $url );
    $url = str_replace( parse_url( WP_PLUGIN_URL, PHP_URL_Host ), $Host, $url );
    return $url;
}

À l'intérieur de mon fichier functions.php, je faisais ceci:

// get the funk
add_filter( 'plugins_url', 'my_custom_funk' );

// Load Custom Functions
include( '/my/non-public/path/custom_funcs.php' );

Une fois que j'ai changé leur ordre à cette ...

// Load Custom Functions
include( '/my/non-public/path/custom_funcs.php' );

// get the funk
add_filter( 'plugins_url', 'my_custom_funk' );

... l'erreur s'est complètement arrêtée.

J'espère que cela aidera et sauvera quelqu'un deux jours de débogage.

Enfin, les messages lire ici sont ce qui me conduit à faire le changement.

3
DaveyJake