web-dev-qa-db-fra.com

réécrire les règles et la chaîne de requête

Quand je vais à l'URL mysite.com/photos/120, je suis je veux obtenir le 120.

Dans le PHP je veux pouvoir récupérer ces "paramètres" comme si l'URL était mysite.com?page=photos&id=120 ou même simplement mysite.com/photos?id=120

Puis-je utiliser réécrire les règles ? Ou dois-je faire regex en php pour obtenir ce que je veux?

**** EDIT 1 ****

Pour ma vie, je ne peux pas que ça fonctionne. D'après les réponses données ici, voici ce que j'ai à ce jour:

add_action( 'init', 'rewrite_photo_url' );
function rewrite_photo_url() {
    add_rewrite_rule( '^photos/([^/]*)/?','index.php?page=photos&photo_id=$matches[1]', 'top' );
}

add_rewrite_tag('%id%','([0-9]+)');

print(get_query_var('photo_id'));

Je soupçonne que je manque un concept quelque part?

**** EDIT 2 ****

Je commence à voir que cela doit peut-être être dans functions.php alors j'ai maintenant:

function rewrite_photo_url() {
    add_rewrite_rule( '^photos/([^/]*)/?','index.php?page=photos&photo_id=$matches[1]', 'top' );
}
function register_custom_query_vars( $vars ) {
    array_Push( $vars, 'photo_id' );
    return $vars;
}

add_action( 'init', 'rewrite_photo_url');
add_filter( 'query_vars', 'register_custom_query_vars', 1 );

Maintenant, j'ai juste besoin de savoir comment obtenir le var souhaité dans mon modèle de page. J'ai essayé

print(get_query_var('photo_id'));

Mais ça ne fait pas l'affaire.

6
Jacksonkr

Après plusieurs jours de recherche sur ce sujet, la réponse était simple:

$wp_query->query_vars['page']

envelopper cela dans une intval et alto.

1
Jacksonkr

Vous pouvez ajouter votre propre règle de réécriture qui vous permettra d'affiner la requête via les paramètres d'URL:

add_action( 'init', 'rewrite_photo_url' );
function rewrite_photo_url() {
    add_rewrite_rule( 'photos/([^/]+)/?$','index.php?page=photos&photo_id=$matches[1]', 'top' );
}

Si vous devez utiliser une variable personnalisée, c'est-à-dire 'photo_id', vous devez l'enregistrer afin qu'elle soit reconnue par la requête:

add_filter( 'query_vars', 'register_custom_query_vars', 1 );
function register_custom_query_vars( $vars ) {
    array_Push( $vars, 'photo_id' );
    return $vars;
}
11
Rachel Carden

Vous pouvez utiliser add_rewrite_tag pour enregistrer votre variable de requête personnalisée ('id' en question):

add_rewrite_tag('%id%','([0-9]+)');

(La regex ne dit que pour accepter les chiffres). Ensuite, pour créer votre règle de réécriture, vous pouvez utiliser add_rewrite_rule

(les deux doivent être connectés à init).

add_rewrite_rule('^photos/([0-9]+)/?','index.php?p=1234&id=$matches[1]','top');

où 1234 est l'ID de votre page "photos". Vous devrez effacer les règles de réécriture une fois après leur ajout (allez à la page des paramètres de Permalink). Ensuite, comme @DanielBachhuber , vous pouvez utiliser la fonction get_query_var( 'id' ) pour obtenir l'ID.

Remarque , bien que l'expression rationnelle du add_rewrite_tag signifie que cela n'acceptera que des chiffres - vous devriez probablement toujours supprimer avec intval (dans tous les cas, il peut s'agir d'une chaîne représentant un chiffre).

4
Stephen Harris

Selon la manière dont les règles sont générées, vous pouvez utiliser la fonction get_query_var () pour obtenir la valeur de la variable 'photo'. Si c'est fait correctement, 'photo' devrait être une requête disponible var. Vous aurez besoin de nettoyer la valeur avec intval () ou similaire, bien sûr.

2
Daniel Bachhuber

Salut les gars c'est ce qui a fonctionné pour moi:

    $pagination_args = array(
    'base'            => user_trailingslashit( trailingslashit( remove_query_arg( 's', strtok(get_pagenum_link( 1 ), '?') ) ) . 'page/%#%/'.rtrim(str_replace('%2F','',substr(get_pagenum_link( 1 ),strlen(strtok(get_pagenum_link( 1 ), '?')))),'/'), 'paged' ),
    'format'          => 'page/%#%',
    'total'           => $numpages,
    'current'         => $paged,
    'show_all'        => False,
    'end_size'        => 1,
    'mid_size'        => $pagerange,
    'prev_next'       => True,
    'prev_text'       => __('«'),
    'next_text'       => __('»'),
    'type'            => 'plain',
    'add_args'        => false,
    'add_fragment'    => ''
);

La valeur de base est ce qui fonctionne vraiment la magie. Pas besoin de modifier la valeur de base. J'ai été mis dans la bonne direction en lisant cet article: https://wordpress.org/support/topic/plugin-simple-pagination-page2-and-_get-parameters

0