Вопрос или проблема
Я хочу создать объект и установить ID для этого объекта.
Что-то вроде
$p = new Product(87);
У меня есть этот код в плагине, и я хочу получить ID пользовательского поста, который отображается:
function getPostId(){
global $wp_query;
global $pid;
$pid = $wp_query->post->ID;
echo 'pid=' . $pid; //возвращает 87
}
add_action('wp_head','getPostId');
//Я хочу получить $pid здесь.
echo 'pid=' . $pid; //возвращает null
Теперь я хочу сделать:
$p = new Product($pid);
$p->setABigTomatoOnYourHead();
Я не могу просто использовать get_the_ID()
, global $post
и т.д., потому что это недоступно.
По сути, я просто получаю ID из пользовательского поста, который просматривается. В моем плагине я затем хочу создать новый объект на основе этого ID.
ОБНОВЛЕНИЕ
“здесь” находится в том же файле, где создаются классы в основном файле плагина:
что-то вроде
class Product {
}
$x = new Product($id); //здесь
У меня есть этот код в плагине, и я хочу получить ID пользовательского поста, который показывается:
…
“здесь” находится в том же файле, где создаются классы в основном файле плагина:
class Product { } $x = new Product($id); //здесь
Вы не можете это сделать. “Пользовательский пост, который показывается” не показывается на вашей странице плагина, и ваш action не сработает вообще на бэкенде. Вам нужно создать объект внутри wp_head
hook или какого-либо другого front-end hook — что-то вроде:
function getPostId(){
global $wp_query;
global $x; // плохое имя переменной
$x = new Product($wp_query->post->ID);
}
add_action('wp_head','getPostId');
Очень возможно, что вы могли бы переписать класс, чтобы избежать всего этого global
беспорядка.
Если вам нужен ID страницы на бэкенде, вам нужно будет найти другой способ идентификации страницы. Вы просто не можете подключиться к действию, которое не срабатывает, чтобы найти ID страницы, которая не загружается.
Вы также можете вставить это в ссылку WordPress внутри этого сборщика ID.
https://www.basrh.com/id-grabber
Мне часто нужны ID постов для удаления или исключения страниц в WordPress. Я написал скрипт на Python для этого и добавил его на свой сайт для легкого доступа:
https://www.basrh.com/id-grabber
Ответ или решение
Вопрос, с которым вы столкнулись, связан с получением идентификатора (ID) поста в WordPress и дальнейшим использованием этого идентификатора для создания объекта внутри плагина. Это достаточно распространенная задача при работе с WordPress, особенно в случае работы с пользовательскими записями и расширениями функционала через плагины. Позволю себе предложить решение этой задачи, используя три аспекта: теория, пример и применение (TEA).
Теория
В WordPress идентификатор поста используется для однозначного определения каждой записи в базе данных. Для получения ID текущего поста у вас может возникнуть необходимость обращаться к глобальному объекту $wp_query
или использовать встроенные функции WordPress, такие как get_the_ID()
. Однако важно понимать, что контекст, в котором выполняется ваш код, играет решающую роль в доступности тех или иных данных.
Если вы работаете внутри темы или шаблона, тогда функция get_the_ID()
может быть доступна, но если вы пытаетесь выполнить код через плагин, вы должны убедиться, что ваш код выполняется в правильном контексте, т.е. на фронтенде, когда загружается страница.
Пример
Рассмотрим пример с использованием хука wp_head
, который вызывается, когда WordPress загружает заголовок страницы. Ваша существующая реализация пытается использовать глобальные переменные, однако это приводит к тому, что ID не всегда доступен там, где он необходим.
Вот как можно облегчить задачу:
add_action('wp_head', 'createProductObject');
function createProductObject() {
global $wp_query;
if (isset($wp_query->post)) {
$post_id = $wp_query->post->ID;
$product = new Product($post_id);
$product->setABigTomatoOnYourHead();
// Сохраните объект в глобальную переменную или выполните другие действия
} else {
// Обработка случая, когда пост не найден
}
}
Этот пример демонстрирует создание объекта Product
с использованием ID текущей записи, полученного через глобальный объект $wp_query
. В процессе вы также можете выполнить другие действия с этим объектом.
Применение
При разработке плагинов для WordPress важно понимать, что различия между фронтенд и бэкенд часто требуют использования различных хуков и обработчиков событий. Если вам необходимо работать с данными на уровне бэкенда — например, при сохранении данных через панель администратора, — вам потребуется использовать другие хуки, такие как save_post
или admin_init
.
Кроме того, следует избегать чрезмерного использования глобальных переменных, поскольку это может привести к трудновыявляемым ошибкам и усложнить понимание кода. Лучшей практикой является создание функций или методов класса, которые инкапсулируют вашу логику и делают код более модульным и читабельным.
Если вам необходимо передать данные между различными частями вашего плагина или между различными хуками, рассмотрите возможность использования объектов или передачи данных через безопасные механизмы, такие как использование функций API WordPress: get_option
и update_option
для хранения настроек, или собственные таблицы в базе данных для более сложных данных.
Заключение
Решение задачи получения ID поста и создания объекта внутри плагина WordPress требует понимания структуры и архитектуры самого WordPress. Благодаря использованию правильных хуков и структур, вы можете добиться не только надежного выполнения кода, но и его хорошей читаемости и поддерживаемости. Надеюсь, предложенное решение позволит вам успешно реализовать необходимую функциональность в вашем плагине.