1

I insert this and it works fine:

add_post_meta( get_the_ID(), 'robots', 'TEXT', true );

After adding that, I check the database and everything is fine, the result is TEXT.

But if I insert this:

add_post_meta( get_the_ID(), 'robots', 'a:2:{i:0;s:7:"noindex";i:1;s:8:"nofollow";}', true );

The result is:

s:43:"a:2:{i:0;s:7:"noindex";i:1;s:8:"nofollow";}";

And I need the result to be exactly the same as I have added it:

a:2:{i:0;s:7:"noindex";i:1;s:8:"nofollow";}

I need not to automatically add that s:43:" and the "; at the end.

Can anybody help me please?

3
  • 1
    I have solved it using unserialize(). Example: add_post_meta( get_the_ID(), 'robots', unserialize('a:2:{i:0;s:7:"noindex";i:1;s:8:"nofollow";}'), true );
    – Carlos B
    Commented Jan 26, 2021 at 0:15
  • Does my revised answer answer your question? If so, I'd appreciate if you can mark my answer as "correct" - that way, it'll be clear to others that the question has an accepted solution. Or maybe, just +1 (upvote) my answer? :)
    – Sally CJ
    Commented Jan 27, 2021 at 3:35
  • 1
    Sorry @SallyCJ I don't have much experience in stackexchange, but I have already marked your answer as correct :) Best regards.
    – Carlos B
    Commented Jan 27, 2021 at 16:45

1 Answer 1

1

Why the content is not being respected

And it's not just add_post_meta(), but any functions like add_term_meta() and add_user_meta() that uses add_metadata().

And the reason why the value gets serialized again is because add_metadata() will automatically serialize the meta value using maybe_serialize() which (unfortunately) will serialize the value even if it's already serialized.

How to tackle the issue

In your case, if possible, pass an array instead of the serialized value/string:

// A non-scalar value will be automatically serialized by maybe_serialize().
$value = array( 'noindex', 'nofollow' );

add_post_meta( get_the_ID(), 'robots', $value, true );

However, if you retrieved/received the value from somewhere and you need to retain its exact format when saving, then — as you've already figured it out — you'll need to unserialize the value before passing it to add_post_meta() to prevent the double serialization.

But in WordPress, instead of using the native unserialize() function in PHP, I suggest you to use maybe_unserialize() instead:

$value = 'a:2:{i:0;s:7:"noindex";i:1;s:8:"nofollow";}';

// Unserialize the value and pass it to add_post_meta().
add_post_meta( get_the_ID(), 'robots', maybe_unserialize( $value ), true );

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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