web-dev-qa-db-fra.com

Générer une sortie personnalisée pour la page/URL dans un plugin

Dans mon plugin, je veux pouvoir attraper un slug - dites 'testpath', comme dans www.mysite.com/testpath et restituez ce que je veux de mon plugin dans le page.

Dans WP Admin, je pourrais créer une page appelée 'testpath' et y insérer un shortcode (disons, [testpath]), qui est ensuite implémenté par le plugin, mais je ne veux pas que l'utilisateur du plugin à créer cette page et à saisir le shortcode - tout devrait être géré par le plugin.

Je peux aussi créer un post par programmation lors de l’activation du plugin, puis l’intercepter dans le plugin, comme

function create_custom_page($page_name) {
  $pages = get_pages();     
  foreach ($pages as $page) { 
    if ($page->post_name == $page_name) return;
  }
  wp_insert_post ([
  'post_type' =>'page',        
  'post_name' => $page_name,
  'post_status' => 'publish',
  ]);
}

Et alors:

add_filter( 'page_template', 'add_test_template' );
function add_test_template( $page_template ) {
  if ( is_page( 'testpath' ) ) {
    $page_template = __DIR__.'/testpath.html';
  }
  return $page_template;
}

Cela fonctionne comme je veux - mais cela semble très compliqué. Je pense que quelque chose avec l'API Rewrite ou des actions appropriées pourraient être une meilleure façon de faire. Existe-t-il des approches standard (ou intelligentes) à cet égard?

1
ChrisNY
<?php
/*
Plugin Name: Custom output
Description: A module to test the custom output. To test: http://your_wordpress_site.com/customop_uri_path
Version: 1.0
Author: Danilo Silva
Author URI: http://danilocgsilva.me
*/

// Write a new permalink entry on code activation
register_activation_hook( __FILE__, 'customop_activation' );
function customop_activation() {
        customop_custom_output();
        flush_rewrite_rules(); // Update the permalink entries in the database, so the permalink structure needn't be redone every page load
}

// If the plugin is deactivated, clean the permalink structure
register_deactivation_hook( __FILE__, 'customop_deactivation' );
function customop_deactivation() {
        flush_rewrite_rules();
}


// And now, the code that do the magic!!!
// This code create a new permalink entry
add_action( 'init', 'customop_custom_output' );
function customop_custom_output() {
        add_rewrite_tag( '%customop_uri_path%', '([^/]+)' );
        add_permastruct( 'customop_uri_path', '/%customop_uri_path%' );
}

// The following controls the output content
add_action( 'template_redirect', 'customop_display' );
function customop_display() {
        if ($query_var = get_query_var('customop_uri_path')) {
                header("Content-Type: text/plain");
                echo 'This is my custom content!!!!';
                exit; // Don't forget the exit. If so, WordPress will continue executing the template rendering and will not fing anything, throwing the 'not found page' 
        }
}

Créez un plugin avec ce code exact. Activer le plugin et tester la frappe dans le navigateur http://your_wordpress_site.com/customop_uri_path .

Les fonctions de registres traitent de la structure permalien, et sont exécutées juste dans l'activation du plugin ou la désactivation du plugin (pour nettoyer les entrées de permaliens, au cas où le plugin ne serait plus utilisé).

La vraie magie est faite par le code suivant. Il existe deux fonctions: l’une utilisée lors de l’activation du plug-in pour créer une nouvelle règle de réécriture et ajouter une entrée de lien permanent, et l’autre permettant de construire l’affichage en sortie. La fonction get_query_var recherche les arguments URI si votre chemin URI personnalisé a été créé précédemment. Si c'est le cas, il exécute le code pour écrire votre sortie personnalisée. N'OUBLIEZ PAS LA SORTIE FINALE, sinon elle tombera dans la page de contenu non trouvé.

Analyse toutes les occurrences de 'customop_uri_path' dans le code pour personnaliser votre propre adresse uri de votre sortie personnalisée. Honnêtement, je ne comprenais toujours pas ce qui se passait dans les arguments add_rewrite_tag et add_permastruct. Donc, remplacez simplement par votre propre chemin uri.

Assurez-vous également que votre module de réécriture Apache fonctionne correctement et que votre installation WordPress est configurée pour utiliser les permaliens, sinon vous ne verrez pas le module fonctionner.

5
danilocgsilva