Intereting Posts
Добавить действие для создания нового сообщения после пожара wp_insert_post? Подумайте, что он создает бесконечную петлю Отсечение выдержки с первым предложением Пользовательские соглашения / реестр имен, для ссылок в социальных сетях Недопустимый крюк admin_post Переадресация цикла (только для сетевого администратора сети) Исправить описание веб-сайта в результатах поиска Google Как перенести (или подключить) пользовательскую базу от WordPress к любой другой CMS (например, MediaWiki, Sphinx-doc и т. Д.)? Запрос терминов в цикле Изменение размера шрифта в пределах короткого кода Как изменить запрос sql для wp_get_archive () Пользователь мета не сохраняет должным образом Связанные записи в подкатегории с надписями Как добавить продукт в woocommerce с php-кодом Может ли хостинг повлиять на работу плагина? Почему One Click Update не работает на локальном хосте, используя FTP с 777 правами на файлы сайта?

UserMeta изменяет значение метаданных для идентификатора сообщения

Я создаю проприетарную систему управления знаниями (LMS) и пытаюсь добавить простую функцию закладок, которая сохраняет $post->ID для последней страницы, посещенной в моем «курсовом» CPT (пользовательский тип сообщения). Похоже, что это должно быть просто вопросом сохранения идентификатора почты для текущей страницы как пользовательского значения метаданных для пользователя, но в обязательном порядке функция update_user_meta() сохраняет идентификатор сообщения для сообщения, которое находится на том же уровне в иерархии, которая была создана для этого «курса» CPT.

Вот код:

 function nb_course_post_actions(){ global $current_user, $post; echo "I'm about to give up! Post type is: {$post->post_type}."; if( $post->post_type === 'course' ){ $sid = $current_user->ID; $bookmark_id = $post->ID; print( $bookmark_id ); if( update_user_meta( $sid, 'course_bookmarks', $bookmark_id ) === FALSE ){ echo "Failed to update metadata"; } else { echo "Metadata was updated: "; if ( get_user_meta($sid, 'course_bookmarks', true ) !== $bookmark_id ) wp_die('An error occurred'); } } } add_action( 'wp_footer', 'nb_course_post_actions' ); 

Итак, вот что должно произойти: пользователь, зарегистрированный в системе, посещает страницу в рамках курса CPT, при каждой загрузке новой страницы добавляется дополнительное действие записи текущего идентификатора сообщения в метаданные пользователя, так что когда пользователь уходит и возвращается позже на более поздний срок, они могут щелкнуть ссылку, которая приведет их к странице, на которой они были в последний раз в рамках «курса» CPT.

Проблема в том, что update_user_meta() неизбежно записывает неверный post_id, и функция переходит к функции wp_die() каждый раз. Что более странно, так это то, что, похоже, какой-то интеллект должен сохранять идентификатор, относящийся к исходному сообщению, например, брата одного и того же CPT, вложенного на том же уровне иерархически, когда нет другой отправляемой информации или никакой другой информации что должно мешать данным метаданным. Meta_key "Course_bookmark" не существует нигде в коде. Насколько мне известно, функция update_user_meta() даже не знает, что он сохраняет идентификатор POST, поскольку единственное, что он получает, – это ЧИСЛОЕ значение. Это могло бы спасти чей-то возраст или почтовый индекс для всего, что должен знать код, это всего лишь числовое значение без каких-либо других ссылок на тот факт, что это идентификатор сообщения.

Он не должен знать, что это идентификатор сообщения, и он не должен знать, что он имеет какое-либо отношение к другим post_ids, которые являются одним и тем же CPT, одним и тем же иерархическим уровнем, и это опубликованный идентификатор, а не ревизия ,

Моя первоначальная функция была намного более сложной, и я переместил этот код во всем своем плагине, только понимаю, что проблема действительно update_user_meta() функцией update_user_meta() wordpress, а не с той положением, в которой я его называю или что-то еще в этом отношении. Идентификатор права отправляется в функцию, но записывается неправильный идентификатор (я проверил записанное значение в PHPMyAdmin) и вернулся. Но почему?

ОБНОВИТЬ:

Если вы будете следовать комментариям к этому сообщению и предложениям Pieter, вот где я получил:

По какой-то причине кажется, что эта ошибка, по-видимому, напрямую связана с <link rel='next' href='path\to\next\post\' /> который WordPress генерирует в разделе <head> html. Я предполагаю, что это размещено там, чтобы помочь с SEO. Я не запускаю плагины, связанные с SEO, на этом конкретном сайте, но в моем коде есть что-то (маловероятно, поскольку я не настолько изощрен) или темой, которую я использую (Pinnacle by Kadence Themes – замечательная тема , кстати), который берет эту информацию и заставляет следующую страницу запускаться с помощью команды $_GET соответствии с сетевым монитором моего браузера. В качестве промежуточного решения я следую предложению, представленному в этом сообщении Hamergil, и добавил этот блок кода к моему плагину LMS:

 add_filter( 'index_rel_link', 'disable_stuff' ); add_filter( 'parent_post_rel_link', 'disable_stuff' ); add_filter( 'start_post_rel_link', 'disable_stuff' ); add_filter( 'previous_post_rel_link', 'disable_stuff' ); add_filter( 'next_post_rel_link', 'disable_stuff' ); function disable_stuff( $data ) { return false; } 

Не уверен, что это лучший способ приблизиться к этому или нет, поэтому я все еще оставляю это открытым, как без ответа.

Я считаю, что ваша проблема связана с получением правильного объекта post на вашей отдельной странице. Из того, что я могу обнаружить из вашего вопроса, является то, что $post не содержит объект post, который вы ожидаете.

Вы должны помнить, что $post – один из тех самых дрянных глобалов, которые WordPress использует для хранения текущего объекта post внутри. Внутри цикла $post обычно достаточно надежный, но вне цикла это совершенно другая игра с мячом. Проблема в том, что $post может быть изменен любым кодом на вашей странице, даже в основном цикле. Любые запросы, использующие setup_postdata( $post ) или the_post() устанавливают $post global текущей записи в цикле, поэтому $post в любой момент может быть чем-то другим в зависимости от того, где вы находитесь на странице.

Забывая использовать что-то простое, например wp_reset_postdata() после того, как пользовательский цикл запроса оставит значение $post последнему сообщению в пользовательском запросе, а не текущему объекту страницы. Кажется, проблема, с которой вы сталкиваетесь, что-то задало глобальный $post чем-то другим, чем текущий объект страницы.

Есть способы получить более надежный объект текущей страницы. Вы можете посмотреть мой пост здесь и прочитать по этому вопросу. Поскольку такие функции, как query_posts также разбивают основной объект запроса, я в последнее время начал использовать значения из $GLOBALS['wp_the_query'] который является самым надежным способом получения правильных данных.

Еще одна проблема заключается в том, что вы используете это при каждой загрузке страницы. Просто проверить тип сообщения недостаточно. Помните, вы используете $post global, который может содержать любой объект post. Если этот конкретный почтовый объект имеет правильный тип сообщения, ваш код будет выполняться вне зависимости от того, на какой странице вы сейчас находитесь, поэтому мы должны проверить, есть ли мы на единственной странице страницы желаемого типа сообщения

Позволяет переписать вашу функцию (с опущенной версией ), чтобы быть более надежной: ( ПРИМЕЧАНИЕ . Код не проверен и требует PHP 5.4+, также вы всегда можете использовать его, используя файлы cookie для хранения данных на стороне клиента, хотя это менее надежный метод)

ВЕРСИЯ 1

Если вам нужен полный объект post, это будет версия для использования

 /** * We can use the template_redirect hook here aswell. Change back to * wp_footer if this suits you better */ add_action( 'template_redirect', 'nb_course_post_actions' ); function nb_course_post_actions(){ global $current_user; // Make sure we are on a singular course post type page, if not, bail if ( !is_singular( 'course' ) return; // Make sure we have a logged in user if ( !is_user_logged_in() ) return; // Great, we are on a single course post page and user is logged in, lets continue $post = sanitize_post( $GLOBALS['wp_the_query']->get_queried_object() ); $sid = $current_user->ID; $bookmark_id = $post->ID; // Update the usermeta update_user_meta( $sid, 'course_bookmarks', $bookmark_id ); } 

ВЕРСИЯ 2

Если вам нужен только идентификатор сообщения, и ничего больше

 /** * We can use the template_redirect hook here aswell. Change back to * wp_footer if this suits you better */ add_action( 'template_redirect', 'nb_course_post_actions' ); function nb_course_post_actions(){ global $current_user; // Make sure we are on a singular course post type page, if not, bail if ( !is_singular( 'course' ) return; // Make sure we have a logged in user if ( !is_user_logged_in() ) return; // Great, we are on a single course post page and user is logged in, lets continue $sid = $current_user->ID; $bookmark_id = filter_var( $GLOBALS['wp_the_query']->get_queried_object_id(), FILTER_VALIDATE_INT ); // Update the usermeta update_user_meta( $sid, 'course_bookmarks', $bookmark_id ); }