Использование сериализованного запроса в Wordpress с Ajax - PullRequest
0 голосов
/ 08 октября 2019

У меня есть сериализованный запрос в Wordpress, который выглядит следующим образом:

"a:66:{s:9:"post_type";s:11:"exhibitions";s:8:"meta_key";s:14:"event_date_end";s:7:"orderby";s:14:"meta_value_num";s:5:"order";s:4:"DESC";s:14:"posts_per_page";i:1;s:10:"meta_query";a:1:{i:0;a:3:{s:3:"key";s:14:"event_date_end";s:7:"compare";s:1:"<";s:5:"value";s:8:"20191008";}}s:5:"error";s:0:"";s:1:"m";s:0:"";s:1:"p";i:0;s:11:"post_parent";s:0:"";s:7:"subpost";s:0:"";s:10:"subpost_id";s:0:"";s:10:"attachment";s:0:"";s:13:"attachment_id";i:0;s:4:"name";s:0:"";s:6:"static";s:0:"";s:8:"pagename";s:0:"";s:7:"page_id";i:0;s:6:"second";s:0:"";s:6:"minute";s:0:"";s:4:"hour";s:0:"";s:3:"day";i:0;s:8:"monthnum";i:0;s:4:"year";i:0;s:1:"w";i:0;s:13:"category_name";s:0:"";s:3:"tag";s:0:"";s:3:"cat";s:0:"";s:6:"tag_id";s:0:"";s:6:"author";s:0:"";s:11:"author_name";s:0:"";s:4:"feed";s:0:"";s:2:"tb";s:0:"";s:5:"paged";i:0;s:10:"meta_value";s:0:"";s:7:"preview";s:0:"";s:1:"s";s:0:"";s:8:"sentence";s:0:"";s:5:"title";s:0:"";s:6:"fields";s:0:"";s:10:"menu_order";s:0:"";s:5:"embed";s:0:"";s:12:"category__in";a:0:{}s:16:"category__not_in";a:0:{}s:13:"category__and";a:0:{}s:8:"post__in";a:0:{}s:12:"post__not_in";a:0:{}s:13:"post_name__in";a:0:{}s:7:"tag__in";a:0:{}s:11:"tag__not_in";a:0:{}s:8:"tag__and";a:0:{}s:12:"tag_slug__in";a:0:{}s:13:"tag_slug__and";a:0:{}s:15:"post_parent__in";a:0:{}s:19:"post_parent__not_in";a:0:{}s:10:"author__in";a:0:{}s:14:"author__not_in";a:0:{}s:19:"ignore_sticky_posts";b:0;s:16:"suppress_filters";b:0;s:13:"cache_results";b:1;s:22:"update_post_term_cache";b:1;s:19:"lazy_load_term_meta";b:1;s:22:"update_post_meta_cache";b:1;s:8:"nopaging";b:0;s:17:"comments_per_page";s:2:"50";s:13:"no_found_rows";b:0;}"

Запрос был сериализован и назначен переменной JS в теге сценария со следующим:

var postsExhibitions = '<?php echo serialize( $query->query_vars ) ?>';

Затем строка передается через AJAX в действие в functions.php, и сейчас я пытаюсь использовать json_decode() в строке, но ничего не возвращается. Я пытаюсь сделать следующее:

$data = $_POST['query']; <----------- This is the serialized string
$data = stripslashes($data);
$return = json_decode($data, true);

Если я повторяю переменную $data, она показывает строку, как указано выше в этом посте. Но как только я пытаюсь вывести переменную $return, т. Е. После того, как строка была декодирована, она ничего не возвращает.

Есть ли какие-либо шаги, которые я здесь пропускаю в "десериализации" строки?

1 Ответ

1 голос
/ 08 октября 2019

Вместо json_decode вы ищете функцию unserialize.

ЗАМЕЧАНИЕ ПО БЕЗОПАСНОСТИ: Если эта страница общедоступна (за пределами области администрирования WP), то добавление сериализованного запроса в JSставит проблему безопасности. Если страница, содержащая переменную postsExhibitions, является общедоступной, любой пользователь сможет изменить запрос и запросить приложение WP в рамках инфраструктуры WP Query.

Это стоит тогосохраняя фактический запрос в вашем внутреннем коде, и вместо этого ajax-вызов javascript должен отправлять только некоторые значения параметров запроса. В этом случае кажется, что требуется только event_date_end.

В любом случае ниже приведен рабочий пример, который отвечает на ваш вопрос.

$query_unserialized_str = 'a:66:{s:9:"post_type";s:11:"exhibitions";s:8:"meta_key";s:14:"event_date_end";s:7:"orderby";s:14:"meta_value_num";s:5:"order";s:4:"DESC";s:14:"posts_per_page";i:1;s:10:"meta_query";a:1:{i:0;a:3:{s:3:"key";s:14:"event_date_end";s:7:"compare";s:1:"<";s:5:"value";s:8:"20191008";}}s:5:"error";s:0:"";s:1:"m";s:0:"";s:1:"p";i:0;s:11:"post_parent";s:0:"";s:7:"subpost";s:0:"";s:10:"subpost_id";s:0:"";s:10:"attachment";s:0:"";s:13:"attachment_id";i:0;s:4:"name";s:0:"";s:6:"static";s:0:"";s:8:"pagename";s:0:"";s:7:"page_id";i:0;s:6:"second";s:0:"";s:6:"minute";s:0:"";s:4:"hour";s:0:"";s:3:"day";i:0;s:8:"monthnum";i:0;s:4:"year";i:0;s:1:"w";i:0;s:13:"category_name";s:0:"";s:3:"tag";s:0:"";s:3:"cat";s:0:"";s:6:"tag_id";s:0:"";s:6:"author";s:0:"";s:11:"author_name";s:0:"";s:4:"feed";s:0:"";s:2:"tb";s:0:"";s:5:"paged";i:0;s:10:"meta_value";s:0:"";s:7:"preview";s:0:"";s:1:"s";s:0:"";s:8:"sentence";s:0:"";s:5:"title";s:0:"";s:6:"fields";s:0:"";s:10:"menu_order";s:0:"";s:5:"embed";s:0:"";s:12:"category__in";a:0:{}s:16:"category__not_in";a:0:{}s:13:"category__and";a:0:{}s:8:"post__in";a:0:{}s:12:"post__not_in";a:0:{}s:13:"post_name__in";a:0:{}s:7:"tag__in";a:0:{}s:11:"tag__not_in";a:0:{}s:8:"tag__and";a:0:{}s:12:"tag_slug__in";a:0:{}s:13:"tag_slug__and";a:0:{}s:15:"post_parent__in";a:0:{}s:19:"post_parent__not_in";a:0:{}s:10:"author__in";a:0:{}s:14:"author__not_in";a:0:{}s:19:"ignore_sticky_posts";b:0;s:16:"suppress_filters";b:0;s:13:"cache_results";b:1;s:22:"update_post_term_cache";b:1;s:19:"lazy_load_term_meta";b:1;s:22:"update_post_meta_cache";b:1;s:8:"nopaging";b:0;s:17:"comments_per_page";s:2:"50";s:13:"no_found_rows";b:0;}';

$query_serialized_obj = unserialize( $query_unserialized_str );

print_r( $query_serialized_obj );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...