web-dev-qa-db-fra.com

Ajouter le point final de réécriture à la page de l'auteur + pagination

Je souhaite ajouter un nouveau point de terminaison à la page de l'auteur, afin que l'URL ressemble à ceci:

http://example.com/writer/username/articles

Jusqu'à présent, j'ai:

  • Changé la base de l'auteur
  • Ajout d'une règle de réécriture
  • Configurez le query_vars
  • Ajout du point final
  • Utilisé template_redirect pour utiliser mon template

Résultat: 404 page non trouvée (même après avoir vidé les règles de réécriture). Je ne peux pas comprendre où est le problème. De plus, j'aimerais ajouter une pagination au point final. Ci-dessous mon code:

Changé la base de l'auteur:

function foo_change_author_base() {
    global $wp_rewrite;
    $wp_rewrite->author_base = 'writer';
}
add_filter( 'init', 'foo_change_author_base', 0 );

Ajout d'une règle de réécriture:

function foo_rewrite_rule()
{
    add_rewrite_rule( 'writer/([^/]+)/articles(/(.*))?/?$', 'index.php?author_name=$matches[1]&articles=$matches[3]', 'top' );
}
add_action( 'init', 'foo_rewrite_rule' );

Setup query_vars:

function foo_add_vars($vars) {
    $vars[] = 'articles';   
    return $vars;
}
add_filter('query_vars', 'foo_add_vars');

Ajout du terminal:

function foo_add_endpoint() {
    global $wp_rewrite;
    add_rewrite_endpoint( 'articles', EP_AUTHORS | EP_PAGES );
}
add_action( 'init', 'foo_add_endpoint');

Et ajouté mon modèle:

function foo_rewrite_template()
{
    global $wp_query;

    if ( array_key_exists( 'articles', $wp_query->query_vars ) ) {
        include (get_template_directory_uri() . '/articles.php');
        exit;
    }
}
add_action( 'template_redirect', 'foo_rewrite_template' );
3
chowwy

Votre code devrait fonctionner. La ligne:

include (get_template_directory_uri() . '/articles.php');

Il faut que allow_url_include = 1 dans la configuration du serveur, car vous essayez d'inclure un fichier via http. Pouvez-vous vérifier cela?

Vous devez également savoir que template_redirect doit être utilisé pour une redirection réelle. Une include() peut avoir des effets indésirables ici. Je pense que ce que vous voulez vraiment, c'est template_include:

add_filter('template_include', 'my_template_include');

function my_template_include( $template ) {
    global $wp->query;
    if ( array_key_exists( 'articles', $wp_query->query_vars ) ) {
        return get_template_directory() . '/articles.php';
    }
   return $template;
}

Alors voici mon code:

function foo_change_author_base() {
    global $wp_rewrite;
    $wp_rewrite->author_base = 'writer';
}
add_filter( 'init', 'foo_change_author_base', 0 );

function foo_rewrite_rule()
{
    add_rewrite_rule( 'writer/([^/]+)/articles/page/([0-9]{1,})/?$', 'index.php?author_name=$matches[1]&articles=1&paged=$matches[2]', 'top' );
    //If you don't want the last trailing slash change the las /?$ to just $
    add_rewrite_rule( 'writer/([^/]+)/articles/?$', 'index.php?author_name=$matches[1]&articles=1', 'top' );
}
add_action( 'init', 'foo_rewrite_rule' );

function foo_add_vars($vars) {
    $vars[] = 'articles';   
    return $vars;
}
add_filter('query_vars', 'foo_add_vars');

function foo_add_endpoint() {
    add_rewrite_endpoint( 'articles', EP_AUTHORS );
}
//add_action( 'init', 'foo_add_endpoint'); // Commented out
// Edit: add_rewrite_endpoint is not needed when using add_rewrite_rule


// auto-add the articles endpoint to author links
function foo_author_link_filter( $link, $author_id, $author_nicename ) {
    return user_trailingslashit($link) . 'articles/';
}
add_filter( 'author_link', 'foo_author_link_filter', 20, 3);

add_filter('template_include', 'foo_template_include');
function foo_template_include( $template ) {
    global $wp_query;
    //You may need some other checks
    if ( array_key_exists( 'articles', $wp_query->query_vars ) ) {
        return get_template_directory() . '/articles.php';
    }
    return $template;
}

Maintenant, allez sur yoursite.com/writer/author_name/articles/

4
cybmeta

Tout d'abord, si vous ajoutez le noeud final, vous n'avez pas besoin d'ajouter la règle de réécriture. Toutefois, si vous souhaitez gérer la pagination, il vaut mieux utiliser la règle de réécriture. Vraiment 2 règles de réécriture, on pour pagen un pour non paginé.

Après cela, votre requête d'articles var n'est pas destinée à ne contenir rien d'exister ou pas. Pour cette raison, vous pouvez simplement le définir sur 1 s'il existe.

Ensuite, ajoutez simplement un filtre sur le modèle include, comme le suggère @cybnet dans sa réponse.

Tout le code devrait être quelque chose comme:

function foo_change_author_base() {
    global $wp_rewrite;
    $wp_rewrite->author_base = 'writer';
}
add_filter( 'init', 'foo_change_author_base', 0 );

function foo_add_vars($vars) {
    $vars[] = 'articles';   
    return $vars;
}
add_filter('query_vars', 'foo_add_vars');  

function foo_rewrite_rule() {
    add_rewrite_rule( 'writer/([^/]+)/articles/page/([^/]*)$', 'index.php?author_name=$matches[1]&articles=1&paged=$matches[2]', 'top' );
    add_rewrite_rule( 'writer/([^/]+)/articles(.*)$', 'index.php?author_name=$matches[1]&articles=1', 'top' );
}
add_action( 'init', 'foo_rewrite_rule' );

function foo_rewrite_template( $template ) {
    if ( ! is_author() ) return $template;
    global $wp_query;
    if ( $wp_query->get('articles') ) return ( get_template_directory(). '/articles.php');
    return $template;
}
add_filter( 'template_include', 'foo_rewrite_template' );

// add a filter to author link, so 'get_author_posts_url' return the customized url
function foo_author_link_filter( $link, $author_id, $author_nicename ) {
    return user_trailingslashit($link) . 'articles/';
}
add_filter( 'author_link', 'foo_author_link_filter', 20, 3);

Cela fonctionnera bien avec la pagination. Rappelez-vous seulement de sauvegarder les paramètres de permalien à nouveau.


Ci-dessous un écran d’impression de mon environnement de test où je teste ce code:

enter image description here

1
gmazzap