Tell me more ×
WordPress Answers is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I'm not entirely sure this is Wordpress' fault, but I figure I'd ask anyway and see if anyone else has experienced any problems like this before.

I'm trying to save an array to a wp_options table row. The data is coming from a custom metabox and is being saved when the save_post hook is triggered. I assumed this should do the trick:

update_option("myOptionName", $myArray);

I started getting 4(?!) of each value I saved. For instance:

$myArray = array("option1");
update_option("myOptionName", $myArray);
get_option("myOptionName"); 
// array([0]=>"option1", [1]=>"option1", [2]=>"option1", [3]=>"option1");

Needless to say, this behavior is extremely annoying. It works perfectly well with strings, but never arrays. I've tried to get around this by trying json_encode to store it as a string-y entity, but even that isn't working. The problem could very well be the legacy code I've inherited by taking on this project, but I see nothing pointing to save_post.

Has anyone ever seen a situation like this before?

EDIT: As requested ... the save function:

# SAVE BRICK DATA
function brick_update() {

// Verify if this is an auto save routine.
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
    return;
}

// Check permissions
if ( !current_user_can( 'publish_posts' ) ) { // Check for capabilities
    wp_die( 'Sorry, you do not have the capabilities access to this page. :(' );
}

if (!wp_verify_nonce($_REQUEST['brickupdate'], 'brickupdate')) {
    return;
}

$newView = array();
$currentView = get_option('ci_guidesbrick_posts');

if (!is_array($currentView)) {
    $currentView = (array)$currentView;
}

for (var i = 0, i < count($currentView), i++) {
    $newView[i] = $currentView[i];
}

$newView[] = $_REQUEST['postID'];

update_option('ci_guidesbrick_posts', $newView );   

}
share|improve this question

3 Answers

Like MZAweb said it's (probably) the auto save.
You should edit your code that when the hooks triggers it checks for auto save:

add_action('save_post', 'my_save_post', 10, 2);
function my_save_post($post_id, $post) {
    // stop on autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ){
        return;
    }
    // do your magic
}
share|improve this answer
I have it in there. Autosave doesn't trigger this. It happens only when I get it to submit and it adds exactly 3 more of the current item being saved to the array. For example, first save results in: array([0]=>"option1", [1]=>"option1", [2]=>"option1", [3]=>"option1"); On save two: array([0]=>"option1", [1]=>"option1", [2]=>"option1", [3]=>"option1", [4]=>"option1", [5]=>"option1", [6]=>"option1", [7]=>"option1"); – Akamaozu Aug 24 '12 at 13:33
It appears that save_post action is triggered multiple times in Wordpress, according to wordpress.org/support/topic/save_post-called-repeatedly. I don't know how true that is, but it really explains the level of weirdness I'm experiencing ... – Akamaozu Aug 24 '12 at 16:03
1  
you could prevent it with named array keys, it won't add them then – janw Aug 25 '12 at 7:02

As you recreate the whole array each time from reading it, I would just erase the option before creating it again :

$newView[] = $_REQUEST['postID'];
delete_option( 'ci_guidesbrick_posts' );
update_option('ci_guidesbrick_posts', $newView ); 
share|improve this answer

save_post is called multiple times while you edit a post (autosave). That's a common gotcha, but it'd be cool if you can post your function's code to see whats going on.

share|improve this answer
Edited my original comment to include it. – Akamaozu Aug 24 '12 at 12:34

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.