Чи є гачки, що змінюють логіку 404?


27

Якщо у вашій темі визначено сторінку 404, Wordpress відобразить сторінку 404, якщо "тег" визначений у $ wp_query-> query_vars, і немає жодних публікацій, що відповідають цьому тегу.

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

Я вже гуглив, читав код, читав кодекс і тюкав тут, і не міг зрозуміти, де Wordpress запускає цю 404, і як я можу її перекрити. (У мене є відчуття, що це може мати щось спільне з status_header () у function.php, але незрозуміло, як і коли мені потрібно підключитися).

Будь-яка допомога / ідеї / просвітлення цінується.

Дякую,

~ Патч

Відповіді:


29

Після трохи більшого розміщення коду та Googling я знайшов відповідь. Він міститься в цій темі (див. Публікацію Otto42), але для запису додавання наступного у ваш плагін замінить обробку 404 для вказаних вами умов:

add_filter('template_redirect', 'my_404_override' );
function my_404_override() {
    global $wp_query;

    if (<some condition is met>) {
        status_header( 200 );
        $wp_query->is_404=false;
    }
}

Зауважте, що вам потрібно встановити "is_404" на false, перш ніж PHP виводить заголовки, ось чому підключення його до логіки template_redirect є хорошою ідеєю.

~ Патч


5

Мені потрібно було зробити те ж саме для користувальницького проекту, де завжди було 200 сторінок, і я знайшов, що ви також можете просто додати це у верхній частині файлу шаблону (вище get_header ();)

global $wp_query;
status_header( 200 );
$wp_query->is_404=false;

1
Чудово! Це працювало для мене. Я робив свій сценарій, і він генерував 404. Я спробував сценарії runnig з wp-> main, але це не було вірним рішенням. Це працювало для мене:// configuration require('./wp-load.php'); // init WP (inits objects, language and stuff). wp(); // fix title (this is not 404) $wp_query->is_404 = false; // doesn't fix the actual 404 status status_header( 200 ); // but this does :-)
Nux

1

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

Codex Створення помилки 404 Сторінка


Що я шукаю - це спосіб змінити обставини, за яких ця 404 сторінка спрацьовує. Зараз, якщо Wordpress не може знайти жодних публікацій, що відповідають тегу, у вікні запитів з'являється сторінка 404. Я хотів би вказати якийсь додатковий код, який гарантує, що сторінка 404 з’являється лише в тому випадку, якщо Wordpress не може знайти жодних публікацій, а мій плагін не може знайти додаткової інформації для відображення.
Патч

Призначення 404 полягає в тому, щоб відвідувач знав, що посилання неправильне, а ви маєте його ввійти та виправити (якщо потрібно). Ви не хочете ні сказати відвідувачу, що він використовує розірване посилання, ні самі про це знайте. Відображення інформації на 404 працює просто чудово, викрадення її не є вимогою, то чому б це турбувати? Просто намагаюся зрозуміти вашу логіку та / або технічні характеристики.
Рарст

1
Що я шукав - це спосіб змінити визначення того, які сторінки "неправильні". Сайт, який я будую, має компонент блогу, але це ще не все. Я використовую теги Wordpress як для відображення публікацій Wordpress, так і для отримання додаткового вмісту через плагін. Я хочу повернути код статусу 200, якщо або: а) є повідомлення або б) мій плагін може знайти матеріали для відображення, що відповідають тегу. Таким чином, потрібно переробити логіку. Незважаючи на те, дякую, що знайшли час, щоб написати відповідь - вибачте, що моя проблема була досить дивною, щоб мені потрібна більш відповідна відповідь :-)
Патч
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.