Ошибка в строке 1 в столбце 1: документ с пустым заголовком (‘Content-Type: text / xml; charset = UTF-8’);

#wordpress #plugins #header #php-7

#wordpress #Плагины #заголовок #php-7

Вопрос:

Здравствуйте, у меня эта ошибка в моем плагине WordPress, и проблема заключается в заголовке кода строки (‘Content-Type: text / xml; charset = UTF-8’);

 public function listPostByCategory(){
    $misc = 'categories';
    $this->buildSitemap( $misc );
    $this->buildSitemapHeader();

    // get all the categories from the database
    $this->categories = get_categories();
            
    // loop through the categries
    foreach($this->categories as $category) {
        
        // setup the cateogory ID
        $cat_id= $category->term_id;

        // Make a header for the cateogry
        //echo '<h2>' . $category->name . '</h2>';

        // create a custom wordpress 
        $args = array(
            'cat' =>  $cat_id
        );
        
        // The Query
        $the_query = new WP_Query( $args );
        
        // The Loop
        if ( $the_query->have_posts() ) {
            //echo '<ul>';
                while ( $the_query->have_posts() ) {
                    $the_query->the_post();
                    // echo '<li>' . the_permalink() . '</li>';
                    // echo '<hr/>';
                    $this->url = the_permalink();
                    $this->addLink( $this->url );
                }
            //echo '</ul>';
        }    
        /* Restore original Post Data */
        wp_reset_postdata();
    }

    $this->buildFooterSitemap();
}
  

Функции для создания XML-файла

 private function buildSitemap( $arg )
{
    header('Content-Type: text/xml; charset=UTF-8');

    $filename = '/sitemap-'.$arg.'.xml';
    
    $this->styleSheet = $this->plugin_path . 'xml-sitemap.xls';

    $this->date = wp_date( 'F d, Y h:i:s a' );

    $this->fileSitemap = get_stylesheet_directory() . $filename;

}

private function buildSitemapHeader()
{
    $this->handler = fopen( $this->fileSitemap, "w " );
    fwrite($this->handler, '<?xml version="1.0" encoding="UTF-8"?>'. "n");
    fwrite($this->handler, '<?xml-stylesheet type="text/xsl" href="' . esc_url( $this->styleSheet ) . '"?>'. "n");
    fwrite($this->handler, '<!-- generated-on="'. $this->date .'" -->'. "n");
    fwrite($this->handler, '<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'. "n");
}

//private function add($url, $mod, $chfreq, $prio)
private function addLink( $url )
{
    fwrite($this->handler, "t". '<url>' ."n");
    fwrite($this->handler, "tt". '<loc>'.$url.'</loc>' ."n");
    fwrite($this->handler, "t". '</url>'. "n");
}

private function buildFooterSitemap(){
    fwrite($this->handler, '</urlset>');
    fclose($this->handler);
}
  

Если я прокомментирую заголовок (‘Content-Type: text / xml; charset = UTF-8’); на function buildSitemap ошибка не появляется, но все ссылки отображаются на странице администратора WordPress. Где моя ошибка?

Если я перейду в $this-> addLink( $this-> url); простая строка, ошибки не появляются, и ссылка не записывается в панели администратора. Я не понимаю, почему the_permalink() вызывает ошибку

Комментарии:

1. Что говорит ошибка? Заголовки уже отправлены?

2. как я уже писал, ошибка такова: ошибка в строке 1 в столбце 1: документ пуст. Если я прокомментирую заголовок (‘Content-Type: text / xml; charset = UTF-8’); ошибка не появляется

3. Вы проверяете, существует ли файл при вызове $this->handler = fopen( $this->fileSitemap, "w " ); , поскольку fileSitemap вызов ищет его в theme каталоге

4. в частности, ошибка появляется только тогда, когда я вызываю $this-> addLink( $this-> url ); на WP_Query, и я не понимаю, почему… эта функция создает тело xml …

5. Теперь я вижу, get_the_permalink() не использовать the_permalink() , the_permalink() повторяет ссылку, а не возвращает ее, поэтому $this->url всегда имеет значение null

Ответ №1:

the_permalink() повторяет значение. Поэтому он никогда не присваивается вашей $this->url переменной.

Вам нужно будет использовать get_the_permalink() , чтобы присвоить его переменной в качестве значения этой функции returns .

Ответ №2:

Добавьте ниже строку: заголовок (‘Content-type: текст / обычный; кодировка = UTF-8’);

Вы можете увидеть динамическую карту сайта WordPress, https://github.com/shantun7792/sitemaps/blob/master/sitemap.php

Комментарии:

1. Привет, спасибо за ваше предложение. Я нахожу решение с помощью @Josh Bonnick