web-dev-qa-db-fra.com

Crochet pour générer un sitemap dynamique avec le plugin "All in One SEO Pack"

Outre les URL de publications, de pages et de catégories, le sitemap de mon site doit inclure les URL de différentes pages affichant des données provenant d'une source externe autre que la base de données WP (API Rails).

Y a-t-il un crochet auquel je peux ajouter un filtre afin qu'une fois la génération de plan Sitemap dynamique effectuée, je puisse ensuite ajouter ces autres URL au plan Sitemap.

PS: J'ai eu une suggestion d'utiliser aiosp_sitemap_post_filter , mais il n'y a pas de document sur son fonctionnement.

Merci

UPDATE

avec aiosp_sitemap_post_filter , vous pouvez uniquement ajouter d’autres publications au sitemap et aucun contenu personnalisé.

1
Pietro

Ceci est la solution de Peter Baylies (Auteur du plugin)

add_filter( 'option_aioseop_options', 'itdge_sitemap_addl_pages' );

function itdge_sitemap_addl_pages( $option ) {
    if (   !empty( $option )
        && !empty( $option['modules'] )
        && !empty( $option['modules']['aiosp_sitemap_options'])
      ) {
        $my_sitemap_entries = Array(
        '/test1' => Array( 'prio' => '0.1', 'freq' => 'daily', 'mod' => '2014-04-01' ),
        '/test2' => Array( 'prio' => '0.3', 'freq' => 'weekly', 'mod' => '2014-03-02' )
        );
        if ( empty( $option['modules']['aiosp_sitemap_options']['aiosp_sitemap_addl_pages'] ) ) {
            $option['modules']['aiosp_sitemap_options']['aiosp_sitemap_addl_pages'] = Array();
        }
        foreach( $my_sitemap_entries as $k => $v ) {
            $option['modules']['aiosp_sitemap_options']['aiosp_sitemap_addl_pages'][$k] = $v;
        }
    }
    return $option;
}
2
Pietro

Ce n'est pas une solution à ma question mais cela m'aide à résoudre mon problème dans Wordpress et je souhaite le partager.

Je crée un sitemap séparé à l'aide de XMLWriter. Voici le code.

Crochet Wordpress:

add_action('parse_request', 'my_custom_url_handler');

function my_custom_url_handler() {
    $c = new EventsSitemapBuilder();
    if( $_SERVER["REQUEST_URI"] == '/website/events-sitemap.xml') {
        header("Content-type: text/xml");
        $c = new EventsSitemapBuilder();
        $c->build();
    }
    exit;
}

EventsSitemapBuilder ():

class EventsSitemapBuilder {

        private $api_client;
        private $sitemap_data;
        private $sm_xml_writer;


        public function __construct() {
            $this->api_client = new ALApiClient();
            $this->sitemap_data = $this->api_client->sitemap_data();
            $this->sm_xml_writer = new XMLWriter();
        }


        public function build() {
            //events.id, it_texts.slug AS it_slug, en_texts.slug AS en_slug, events.updated_at
            //$this->sm_xml_writer->openUri( home_url( "events-sitemap" ) );
            $this->sm_xml_writer->openUri( "php://output" );
            $this->sm_xml_writer->startDocument('1.0', 'UTF-8');
            $this->sm_xml_writer->startElement('urlset');
            $this->sm_xml_writer->writeAttribute('xmlns', "http://www.sitemaps.org/schemas/sitemap/0.9");

            array_map( array( $this, 'sitemap_event_entry' ), $this->sitemap_data );

            $this->sm_xml_writer->endElement();
            $this->sm_xml_writer->endDocument();
            $this->sm_xml_writer->flush();
        }


        private function sitemap_event_entry( $data ) {
            $this->sm_xml_writer->startElement('url');
            $this->sm_xml_writer->writeElement('lastmod', $data['date']);
            $this->sm_xml_writer->writeElement('changefreq', 'weekly');
            $this->sm_xml_writer->writeElement('priority', 0.6);
            $event_url = home_url( 'events/' . $data['id']  );
            $this->sm_xml_writer->writeElement('loc', $data['url'] );
            $this->sm_xml_writer->endElement();
        }
    }
1
Pietro

De plus, il s'avère que le hook option_aioseop_options se déclenche à tout chargement de page (et même à plusieurs reprises). J'ai ajouté quelques lignes de code à la solution de Pietro pour vérifier si sitemap.xml est demandé:

add_filter( 'option_aioseop_options', 'itdge_sitemap_addl_pages' );

function itdge_sitemap_addl_pages( $option ) {
    $uri = $_SERVER['REQUEST_URI'];
    $uriSegments = explode('/', $uri);
    if ($uriSegments[ count($uriSegments) - 1 ] != 'sitemap.xml') return $option;


    if (   !empty( $option )
        && !empty( $option['modules'] )
        && !empty( $option['modules']['aiosp_sitemap_options'])
    ) {
    ...
}
0
Vishnja