2015-11-13 6 views
1

У меня есть интересная задача. Я написал пользовательский обработчик 404 для wordpress и извлек URL. Чем после некоторой логики у меня есть идентификатор сообщения Wordpress, который мне нужно отображать вместо страницы 404.Как отображать сообщение Wordpress вместо страницы 404?

Как я могу отобразить страницу сообщения Wordpress вместо страницы 404? Единственное, что я могу думать, это сделать

echo wp_remote_fopen(....<post permalink>...); 

Но есть ли альтернативный способ сделать это? Спасибо

ответ

0

Я не смог сделать это, переписав 404.php шаблона. А также я думаю, что это будет очень шаблонным. Вместо этого мне удалось отобразить сообщение, используя действие template_redirect. Код функции плагина выглядит следующим образом:

function func_404_redirect($query){ 
     global $wp_query; 
     $post = get_post(2); 
     $wp_query->queried_object = $post; 
     $wp_query->is_single = true; 
     $wp_query->is_404 = false; 
     $wp_query->queried_object_id = $post->ID; 
     $wp_query->post_count = 1; 
     $wp_query->current_post=-1; 
     $wp_query->posts = array($post); 
    } 
    add_filter('template_redirect','func_404_redirect'); 
0

Вместо обработчика 404 вы можете создать страницу 404.php в теме (или ребенке), см. reference - оттуда вы можете делать все, что вам нравится: загружать список сообщений, загружать одно сообщение, и т. д.

+0

Звучит как хорошая идея, я постараюсь это в течение нескольких часов. – 1099511627776

+0

Нет, я не смог сделать это в 404.php шаблона. Вместо этого мне удалось сделать это througn template_redirect action – 1099511627776

+0

В шаблоне я использовал 404.php для загрузки пользовательского сообщения (из идентификатора), и он работал очень хорошо. – Mat

1

код я использую в моей теме:

<?php 
global $my_theme; 
$content_id = $my_theme->option(OPT_GENERAL, '404_page_id', TRUE); 
$my_theme->prepare($content_id, '404'); 
get_header(); 
?> 
<!-- [BEGIN 404] --> 
<div class="row"> 
    <?php 
     get_sidebar('left'); 
    ?> 
    <div id="primary" class="content-area <?php echo $class; ?>"> 
     <main id="main" class="site-main" role="main"> 
      <section class="error-404 not-found"> 
       <?php 
       // Load the content from the selected page 
        $content_loaded = FALSE; 
        if($content_id > 0) 
        { 
         $query = new WP_Query(array('page_id' => $content_id)); 
         while($query->have_posts()) 
         { 
          $query->the_post(); 
          get_template_part('content', 'page'); 
          $content_loaded = TRUE; 
         } 
         wp_reset_postdata(); 
        } 
       // Fallback content 
        if(!$content_loaded) 
        { 
       ?> 
       <header class="page-header"> 
        <h4 class="page-title well text-center"><?php _e('Page not found', 'my_theme'); ?></h4> 
       </header> 
       <div class="page-content alert alert-danger text-center"> 
        <p><?php _e('It looks like nothing was found at this location', 'my_theme'); ?></p> 
       </div> 
       <?php 
        } 
       ?> 
      </section> 
     </main> 
    </div> 
    <?php get_sidebar('right'); ?> 
</div> 
<?php get_footer(); ?> 
<!-- [END 404] --> 
+0

Согласен, это может быть способ сделать то, что я хочу. Теперь вы можете посмотреть мой ответ и сказать, можно ли его использовать? – 1099511627776

+0

IMO 404.php - правильный выбор. Использование этого фильтра может быть в порядке, но из ссылки фильтра [template_redirect] (https://codex.wordpress.org/Plugin_API/Action_Reference/template_redirect) он должен использоваться для перенаправления на другую страницу в некоторых условиях, а не для фильтрации почтовый запрос – Mat

Смежные вопросы