Массив ID всех записей вордпресс

S
На сайте с 28.01.2016
Offline
44
929

Была прекрасная тема, которая единственная во всем нете объясняла как получить ID всех опубликованных записей в Вордпрересс. Пользовался этой функцией успешно /ru/forum/418293

Но теперь не все хостинги поддерживают устаревший mysql_query()

Как это сделать не нашел. Во откопал такую вот функцию. Но она выводит все ID (и черновики и корзину.)

function _post_id( $cat_or_tag_id='0'){

global $wpdb;

$all_posts = $wpdb->get_col( $wpdb->prepare( "SELECT object_id FROM $wpdb->term_relationships WHERE term_order = %d", $cat_or_tag_id ) );

return $all_posts;
}

Пробовал переписать под wp_posts заменив данные - дает пустой массив.

S
На сайте с 25.11.2008
Offline
124
#1

А что мешает вам в прежнем решении использовать вместо mysql, например, mysqli?

Т.е вместо

mysql_connect(‘localhost’, $user, $password)

использовать

mysqli_connect(‘localhost’, $user, $password, $dbname)

Бесплатные виджеты для сайта (https://pfka.ru). Технический анализ сайта ( https://linkonavt.ru/services/sitetechnologies ).
SeVlad
На сайте с 03.11.2008
Offline
1609
#2
seovisor:
Как это сделать не нашел.

https://codex.wordpress.org/Class_Reference/WP_Query - офиц. ман

http://wp-kama.ru/function/wp_query - вольный перевод по русски.

seovisor:
Но теперь не все хостинги поддерживают устаревший mysql_query()

Не трогай базу! Никогда не трогай базу руками.

Делаю хорошие сайты хорошим людям. Предпочтение коммерческим направлениям. Связь со мной через http://wp.me/P3YHjQ-3.
AGRESSOR
На сайте с 04.07.2010
Offline
79
#3
aparatov:
Почему? Я новичок просто

sql инъекции, уязвимость

а выше описанные функции делают защиту от них

вот функция возращает все id постов


function wp_all_ids() {
$post_ids = array();
$posts = get_posts( array( 'post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish' ) );

foreach( $posts as $post ) {
setup_postdata( $post );
array_push( $post_ids, get_the_ID() );
}
wp_reset_postdata();

return $post_ids;
}

'post_type' => 'post', // тип поста

'posts_per_page' => -1, // количество записей, -1 - все

'post_status' => 'publish'// только опубликовыные посты

S
На сайте с 28.01.2016
Offline
44
#4
AGRESSOR:
sql инъекции, уязвимость
а выше описанные функции делают защиту от них

вот функция возращает все id постов


function wp_all_ids() {
$post_ids = array();
$posts = get_posts( array( 'post_type' => 'post', 'posts_per_page' => -1, 'post_status' => 'publish' ) );

foreach( $posts as $post ) {
setup_postdata( $post );
array_push( $post_ids, get_the_ID() );
}
wp_reset_postdata();

return $post_ids;
}


'post_type' => 'post', // тип поста
'posts_per_page' => -1, // количество записей, -1 - все
'post_status' => 'publish'// только опубликовыные посты

При большом количестве постов не хватает оперативки. В посте есть отличная функция которая выводит в массиве даже сто тысяч id. Но она не учитывает publish поста.

---------- Добавлено 14.05.2018 в 21:37 ----------

Если переписать функцию в начале темы под таблицу с записями то она перестает работать. Возвращает пустой массив.

function _post_id( $cat_or_tag_id='publish'){ 

global $wpdb;

$all_posts = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->wp_posts WHERE post_status = %d", $cat_or_tag_id ) );

return $all_posts;
}


---------- Добавлено 14.05.2018 в 21:43 ----------

Бинго! Все заработало!!! Оказывается не надо писать wp_ перед названием таблицы)

Вот работающий варинат - возвращает массив с id всех опубликованных записей (и страниц)


function _post_id( $cat_or_tag_id='publish'){
global $wpdb;
$all_posts = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_status = %d", $cat_or_tag_id ) );
return $all_posts;
}
AGRESSOR
На сайте с 04.07.2010
Offline
79
#5

Ну откуда мне знать какое количество ты там выводишь? :)

Я думал там небольшое количество тебе надо то моя функция справился бы на ура.

Я вообще через wp-api делал бы большой вывод данных.

Тебе выше написали не трогай прямые обращение к бд, но видимо тебя не переубедить, дело твое, набьешь шишки, поймешь :)

SeVlad
На сайте с 03.11.2008
Offline
1609
#6
aparatov:
Почему? Я новичок просто

Прежде всего потому, что в базе много зависимостей, временных данных и хранение в сериализованных массивах. См https://codex.wordpress.org/Database%20Description

Кроме того - структура базы и данных может поменяться при обновлении. Такое уже было неск раз в истории ВП. Соответственно, всё может поломаться.

При чтении (как в данном случае) ты конечно не повредишь базу, но легко можно получить неверные результаты. А вот когда так изменяют данные, и тем боле добавляют — это очень опасно.

Поэтому нужно просто привыкать использовать функции/апи.

(Ок, пароль можно изменить руками. А вот логин или домен уже нет. Логин вообще менять нельзя).

«Руками» — значит прямыми SQL запросами в БД или непосредственно в РМА или аналогах.

seovisor:
При большом количестве постов не хватает оперативки.

Может времени? get_posts не быстрая функция.

Кстати, а какова цель получения всех ИД? Зачем и где потом должно использоваться?

seovisor:
Оказывается не надо писать wp_ перед названием таблицы)
Вот работающий варинат - возвращает массив с id всех опубликованных записей (и страниц)

Ну хорошо, что тут хоть специальный класс использовал . Это более безопасно, но без особой нужды и его не стоит трогать. Во всяком случае до хорошего понимания ВП.

А это, кстати, хороший пример/объяснение почему нельзя использовать прямые SQL-запросы - ты нарвался на префикс таблиц. А он не должен участвовать в запросах/коде, тк его можно изменить и при установке ВП и даже после (хотя это не стоит делать на рабочем сайте).

AGRESSOR:
Тебе выше написали не трогай прямые обращение к бд,

Ну справедливости ради, в данном случае (использование wpdb) более-менее нормально. Хуже было бы если бы голым SQL полез.

seovisor, если хочешь понять ВП и что делает код см. как надо делать: увидел функцию (как напр get_posts, что показал AGRESSOR ) — идешь в кодексновый, пока не полный) или на https://wp-kama.ru/functions и ищешь там функцию, изучаешь. Функции имеют логически и интуитивно понятные названия, так что поиск нужной тоже не составляет труда. Ну а так, если что надо сделать — лучше переспросить на форуме, подскажем как лучше/правильнее/безопаснее решить задачу.

S
На сайте с 28.01.2016
Offline
44
#7
SeVlad:

Кроме того - структура базы и данных может поменяться при обновлении. Такое уже было неск раз в истории ВП. Соответственно, всё может поломаться.

При чтении (как в данном случае) ты конечно не повредишь базу, но легко можно получить неверные результаты. А вот когда так изменяют данные, и тем боле добавляют — это очень опасно.
Поэтому нужно просто привыкать использовать функции/апи.

В данный момент все работает. И хорошо. Поломается - буду обновлять) В общем я так и начинал осваивать базы txt = > csv => SQLite => MySQL Постепенно понимал преимущества каждого варианта 🤪

SeVlad:

Кстати, а какова цель получения всех ИД? Зачем и где потом должно использоваться?

У меня по ним самописный плагин карту сайта создает/обновляет. Стандартные плагины тормозят все неимоверно.

SeVlad:

Ну хорошо, что тут хоть специальный класс использовал . Это более безопасно, но без особой нужды и его не стоит трогать. Во всяком случае до хорошего понимания ВП.

Ну хоть что-то правильно сделал ☝

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий