Добрый день. Есть код: PHP: function orders_count() { global $count_ter; $in_process_orders = get_posts('post_type=order&status=in_process&numberposts=-1'); // Выводит число 1, именно столько записей со статусом in_process $count_ter = count($in_process_orders); echo $count_ter; } add_action('admin_footer_text', 'orders_count'); orders_count(); global $count_ter; echo $count_ter; // Почему выводит число 7 - общее количество записей типа order? Вопрос в комментарии к коду. Прошу помочь знатоков.
Да, я уже осознал, что global это плохо. var_dump() показывет: int(7) Но для меня это ничего не значит Помогите разобраться. Я правильно понял, что Код (Text): echo $count_ter; плохо в связке с Код (Text): global $count_ter; Объясните пожалуйста.
global не хорош сам по себе. А тут ты не учитываешь особенность php. global вне функции не имеет никакого смысла, странно, что интерпретатор не матерится Переменная в php создаётся в момент присвоения ей значения То, что ты объявил в функции переменную как глобальную, говорит php искать её в глобальном контенте. Если бы ты попробовал её использовать, php послал бы тебя подальше. Но то, что ты присваиваешь ей значение, как раз её создаёт в глобальном контексте Когда ты её потом пишешь global вне функции, ты её не создаёшь, как видимо думаешь, а ещё раз просишь искать её в глобальном контенте. И, видимо, php думает: "Хм, она у меня и так вроде глобальная, ну хрен с тобой". Т.е. строчка просто ничего не делает. Ну и переменная уже существует, у неё есть значение, см. 3. Работа с переменными в PHP отличается от работы с переменными в других языках, где все переменные отдельно объявляются, отдельно используются
каунт фалс за единичку считает, так что надо иначе написать PHP: function orders_count() { $in_process_orders = get_posts('post_type=order&status=in_process&numberposts=-1'); if (empty($in_process_orders)){ return 0; } $count_ter = count($in_process_orders); return $count_ter; } echo orders_count();
но не считает NULL Модиф... : PHP: function orders_count() { return count ( get_posts( 'post_type=order&status=in_process&numberposts=-1' ) ?: NULL ); }
ты ж не знаешь, что он возвращает. Твой код может работать неверно. А мой код работает в любом случае.
Спасибо,но все равно echo orders_count(); выводит общее количество записей, а не со статусом in_process
а я и не пытался сделать именно это я просто причесал твой ужас и теперь им можно пользоваться теперь можно копать глубже и узнать, что же вообще, когда, как и зачем возвращает get_posts() и почему она принимает такой причудливый аргумент. Лезь в неё и покажи её код.
Есть ли еще вариант как решить проблему? Вот есть код: PHP: function orders_count() { $in_process_orders = get_posts('post_type=order&status=in_process&numberposts=-1'); if (empty($in_process_orders)){ return 0; } $count_ter = count($in_process_orders); return $count_ter; } echo orders_count(); Почему то переменная в функции подсчет производит верно, проверено через echo Однако вне функции, эта же переменная считается по общему количеству записей. Мне просто нужно создать условие: if ($count_ter == 0){ // некий код } else { // некий код } А вот не могу, так как значение переменной меняется
Почему ? развернуто: Код (Text): if ( !empty ( $a = get_posts( ... ) ) ) { return count ( $a ); } return count ( NULL );
Вообще, это из wordpress. Есть стандартный способ подсчитать: Код (Text): $published_posts = wp_count_posts('new_post_type')->publish; Однако у меня, нестандартные статусы записей Как ни пробовал не работает.
пробуй.. PHP: $r = orders_count(); if ( $r ){ echo "{$r} - гуд"; } else { echo "{$r} - не гуд"; } и почитай инфу как работают функции в пхп
Переменная в функции подсчет и вывод производит верно, проверено через echo. Выводит 1. Однако вне функции, эта же переменная считается по общему количеству записей. Выводит 7
нет и это разные два кода. они не однозначны и ведут себя по-разному в разных ситуация. Более того, твой вариант не даёт предсказуемого однозначного поведения, если не держать в голове при рефакторинге get_posts() особенностей приведения типов в условиях, которых находят вне этой функции. Это сложно. Это ненужная сложность. --- Добавлено --- этого не может быть =) показывай свой код вместе с дебагом и его результатами на этих шагах.
Так у тебя же проверка выходных данных проходит через empty , не определяя ее тип, дальше в случае фалсе ( тоесть там что то есть ) идет на счет count, так ? так! Я же предоставил код в виде "нейтрона" ?: == ( 1 ? 1 : 0 ) 0 == count ( NULL ) И в итоге до сих пор я не могу понять почему "печаль беда", почему твой код правильнее ?
Вам нужно не помочь, вам нужно книжку по программированию какую нибудь взять да почитать. Я просто в изумлении, такое ощущение что пошла деградация мозгов у людей. Я уже не в первый раз, за последние время, вижу подобные темы, где люди спрашивают вопросы по программированию, не понимая что такое программирование вообще. Полный аутизм садится писать код программы не понимая что такое переменные.
Имеет имеет. В семерке не тестил, но в пятерке была такая фича, что если переменная какая-то объявлена в подключаемом файле, то подключающий не увидит ее, если через global не объявит. Ну или мне так казалось...
@MouseZver да, точно, у тебя правильный код, прости, там же обычное сравнение, а меня что-то сглючило.
привет всем)) я тут новый человек)) просто сразу увидел этот пост) захотелось написать немного оффтопа)) есть такой движок simplemachines - там все построено на передаче данных из функции в функцию с помощью global переменных.. движок сам по себе неплохой) мне нравится) так что и такое решение имеет право на жизнь ИМХО)) хотя да - мне больше нравится когда в функцию что то передается и она что то возвращает)