Чи варто довіряти пост глобалам?


21

@toscho залишив коментар до цієї відповіді, який змусив мене задуматися. Скільки нам слід довіряти світовій сфері, особливо стосовно пост глобалів $post?

І що? Глобальну змінну можна замінити всім перед запуском чеку. У цьому суть глобальних змінних: глобальний доступ.

$postнаприклад, це, безумовно, один із глобалів, який в основному модифікується або в межах самої теми, або за допомогою плагінів. Тим не менш, це також глобальний, який найчастіше використовується в інших додатках в рамках заданого шаблону, наприклад, для налаштування пов’язаних публікацій.

З відповідей (та коментування) на декілька публікацій із специфічними проблемами, спричиненими використанням користувацьких запитів , насправді виділяється, що більшість проблем виникає через те, що користувацькі запити не скидаються (користувацькі запити змінюють глобальні точки, встановлені основним запитом).

З цього видно, що $postце не є надійним. Будь-який погано написаний фрагмент коду, який використовує спеціальний запит, може змінити $postглобальний, що, в свою чергу, щось порушить (наприклад, пов'язані повідомлення).

Лише кілька розробників WordPress насправді достатньо обізнані у внутрішніх роботах ядра і знають, чого слід уникати, а чого ні. Більша кількість користувачів не має уявлення про те, як працює ядро ​​WordPress.

Вони просто завантажують тему і встановлюють плагіни, щоб зробити те, що потрібно, або навіть просто скопіювати код з підручника. Скажімо, вони встановлюють погано написаний плагін, який розбиває пов'язані публікації на їхній одній публікації, як вони дізнаються, що це спричинило? Чи зможуть вони розібратися в цьому самі або вони стануть сотою особою, яка пише електронний лист автору теми про цю проблему або розміщує запитання на цьому веб-сайті?

Моє запитання: Як можна захиститись від таких проблем, спричинених іншим імпортованим кодом, коли глобальний подібний $postтакий ненадійний? Чи варто ми використовувати глобальний, як $postвзагалі? Які альтернативи?

Просто поділюсь своєю думкою тут, перш ніж зробити висновок: я подумав (і в деяких темах і плагінах теж), використовуючи wp_reset_postdata()або wp_reset_query()перед тим, як використовувати $post, щоб переконатися, що глобальна система перезавантажується до основних запитів $post. Але чому я повинен надувати свій код у своїй темі, оскільки хтось ще не правильно кодував свій плагін? І якщо хтось правильно скинув свій власний запит, ця операція буде запущена вдруге, що не годиться.

Другий метод, про який я думав, - це використання, $wp_queryа потім використання його методів, щось подібне $wp_query->post.

Будь-які думки з цього приводу будуть вдячні.


Скидання публікації просто копіює var в інший, ви можете зателефонувати, що це мільйон разів у своєму коді, і не побачити жодного результативного результату, тому я не знаю, що в цьому не добре.
Міло

Відповіді:


16

Є сумна правда: ви ніколи не можете бути впевнені, що якийсь код не порушить ваш код, і ви нічого не можете зробити, щоб цього не допустити. Особливо в WordPress, де все глобально.

Однак, так, глобальний $post- це одна з найбільш використовуваних глобальних змін, тому використання спеціального догляду за ним може бути хорошою ідеєю.

У своєму коді я рідко отримую прямий доступ до глобального $post.

Коли я в одиночному конкурсі, я використовую get_queried_object()і, як правило, перевіряю, чи $postдійсний WP_Postпримірник:

$post = get_queried_object();

if ( ! $post instanceof \WP_Post ) {
   die( 'What the f**k?!' );
}

Я це перевіряю і в рідкісних випадках, до яких я отримую доступ $postбезпосередньо.

Вважайте, що get_queried_object()повертає несподіване значення, якщо використовується якийсь код query_posts, але ей, якщо хтось використовує код, на який покладається query_posts, він заслуговує на це, якщо його сайт зламається :)

Більше того, якщо я очікую певних умов, я перевіряю їх, наприклад, конкретні типи постів або конкретний статус.

Якщо мені потрібно більше перевірок і в інших місцях, я створюю функцію для їх виконання:

function get_global_post() {
    global $post;
    if ( 
        ! $post instanceof \WP_Post
        || ! $post->post_type === 'mycpt'
        || ! in_array( $post->post_status, array( 'publish', 'private' ), true ) 
    ) {
        return false;
    }
    return $post;
}

$mypost = get_global_post();

if ( ! $mypost ) {
      die( 'What the f**k?!' );
}

Коли ви знаходитесь у спеціальному запиті, під час циклу виклик the_post()скидає об'єкт публікації, тому він повинен бути добре. Тоді моя відповідальність за дзвінок wp_reset_postdata()після користувацького запиту, і я це, звичайно, роблю :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.