web-dev-qa-db-fra.com

Page d'archive pour la taxonomie du type d'article personnalisé

Je construis un modèle pour la page d'archive de la taxonomie de type d'article personnalisé.

Fondamentalement, je dois montrer selon le mois comme

August 2015
July 2015

Pour afficher ci-dessus, j'ai utilisé le filtre ci-dessous:

add_filter( 'getarchives_where','abc_where',10,2);

add_filter('getarchives_join', 'custom_archives_join', 10, 2);

function custom_archives_join($x, $r) {
  global $wpdb;
  $cat_ID = $r['cat'];
  if (isset($cat_ID)) {
    return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";
  } else {
    return $x;
  }
}

Et en cliquant sur Août 2015, il devrait afficher tous les post en particulier la taxonomie du CPT. Mais actuellement, je reçois tous les messages.

Quelqu'un peut-il me suggérer cette page d'archive pour la taxonomie du type de message personnalisé?

1
Blue Rose

Avant de commencer, votre code contient un bogue que vous auriez dû détecter si le débogage était activé. Vous affectez d’abord $r['cat'] à une variable avant même de vérifier si $r['cat'] est défini. Étant donné que cat n’est pas une valeur par défaut, il se peut qu’il ne soit pas défini, ce qui entraînera une erreur PHP lorsque cat n’est pas défini. Vous pouvez refactoriser votre code à quelque chose comme ceci: ( Nécessite PHP5.3 +. J'ai aussi supposé que cela fonctionnait comme prévu, donc je n'ai rien changé )

add_filter('getarchives_join', function ( $x, $r ) 
{
  global $wpdb;

  // Set $cat_ID to the value of $r['cat'] if it is set, otherwise set to false
  $cat_ID = isset( $r['cat'] ) ? $r['cat'] : false;

  // If $cat_ID is false, return $x as is
  if ( !$cat_ID )
    return $x;

  // We have a value in $cat_ID, lets modify and return the required sql string
  return $x . " INNER JOIN $wpdb->term_relationships ON ($wpdb->posts.ID = $wpdb->term_relationships.object_id) INNER JOIN $wpdb->term_taxonomy ON ($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)";

}, 10, 2 );

Maintenant que nous avons réglé ce problème, examinons le véritable problème ici. Afin d’obtenir les publications correctes sur la page d’archives lorsqu’une archive est sélectionnée, nous devons:

  • savoir d'où vient la demande

  • filtrez la requête principale en fonction de l’origine de la publication pour afficher les publications correctes.

Pour aborder le point 1, nous avons besoin d’une sorte de référent afin de savoir d’où provient la demande de page d’archive. Ce référent sera notre clé qui nous permettra d’afficher les publications correctes en fonction du terme.

Les référents HTTP sont extrêmement peu fiables car de nombreux facteurs liés au client peuvent modifier ou contrôler la valeur d'un référent. La section suivante est une section que j’ai tirée de l’une de mes réponses précédentes en tant qu’informations supplémentaires pour les référants, afin que vous puissiez prendre votre temps et lire les informations suivantes.

Le problème avec les référents est qu'ils sont définis et contrôlés par l'utilisateur. Les référents peuvent être désactivés ou bloqués (comme les utilisateurs accédant à un site derrière un proxy). Juste par souci d’intérêt, voici une réponse très intéressante à la question Dans quels cas http referrer sera-t-il vide tiré de ce message sur SO

Il sera/peut être vide lorsque l'utilisateur final

  • entré l'URL du site dans la barre d'adresse du navigateur.
  • visité le site par un signet géré par le navigateur.
  • visité le site en tant que première page de la fenêtre/onglet.
  • basculé d'une URL https à une URL http.
  • basculé d'une URL https vers une autre URL https.
  • a un logiciel de sécurité installé (antivirus/pare-feu/etc.) qui supprime le référent de toutes les demandes.
  • est derrière un proxy qui supprime le référent de toutes les demandes.
  • visité le site par programme (comme, curl) sans définir l’en-tête du référent (searchbots!).

Vous voudriez lire les autres réponses ici aussi pour plus d'informations

Je me suis assis avec un problème similaire et je cherchais un moyen plus fiable de définir et de transmettre des référents, ce qui a conduit à [cette question] ( Obtenir la structure par défaut de permalien à partir de jolies URL ) et une réponse merveilleuse de @gmazzap

Comme je l'ai laissé entendre dans les commentaires, nous allons passer une valeur dans l'URL que nous utiliserons en tant que référent pour afficher les publications correctes en fonction du terme dans la page d'archive. Pour ce faire, nous devons filtrer la fonction get_archives_link() afin d’ajouter notre référent à l’URL de l’archive ainsi que de notre référent à la liste de query_vars afin que nous puissions le lire et l’utiliser.

Premièrement, ajoutez le query_vars, appelons-le ref, qui est l'abréviation de referrer. ref tiendra une valeur personnalisée qui sera équivalente au terme ID

add_filter( 'query_vars', function ( $vars )
{
    $vars[] = 'ref';

    return $vars;
});

Maintenant que ref est lisible, ajoutons-le à notre lien d’archive dans la fonction get_archives_link() à travers le filtre get_archives_link: ( Ceci nécessite PHP 5.4+ en raison de la syntaxe de tableau courte ([]) )

add_filter( 'get_archives_link', function ( $link_html ) {

    if( is_tax() ) { // Adjust this to target specific taxonomies or taxonomy terms if needed

        preg_match ( "/href='(.+?)'/", $link_html, $url );

        $old_url = $url[1];
        $new_url = add_query_arg( ['ref' => get_queried_object_id()], $old_url );
        $link_html = str_replace( $old_url, $new_url, $link_html );

    }

    return $link_html;

});

Vous verrez maintenant que si vous cliquez sur un lien d'archive depuis une page de taxonomie, vous verrez quelque chose de ce qui suit s'ajouter à l'URL, ce sera désormais notre référent.

 ?ref=1

où l'on est l'ID de notre terme

La dernière partie (2ème point) consiste à filtrer notre requête en conséquence. Ici nous devons

  • vérifier si ref est défini

  • si ref est défini, obtenez sa valeur ( N'oubliez pas de désinfecter pour éviter l'injection de données )

  • filtrer la requête principale en conséquence

La dernière partie du code ressemble à ceci: ( Requiert au moins PHP 5.4+ en raison d'une syntaxe de tableau courte )

add_action( 'pre_get_posts', function ( $q )
{
    // VERY VERY IMPORTANT: Check if `ref` is set as $_GET variable, get the value and validate as an integer
    $referrer = filter_var( INPUT_GET, 'ref', FILTER_VALIDATE_INT );

    if (    !is_admin() // Only target front end queries
         && $q->is_main_query() // Only target the main query
         && $q->is_date() // Only targets date archive pages, adjust as needed
         && $referrer // Only proceed if $referrer has a value
    ) {
        // To avoid bugs in a multi custom taxonomy install, check if the term is valid
        if ( term_exists( $referrer, 'CUSTOM_TAXONOMY_NAME' ) ) { // IMPORTANT: Use the correct taxonomy name here
            // Set our taxonomy term filter, again, set the correct taxonomy name
            $tax_query = [
                [
                    'taxonomy' => 'CUSTOM_TAXONOMY_NAME',
                    'terms' => $referrer,
                    'include_children' => false,
                ]
            ];
            $q->set( 'tax_query', $tax_query );
            $q->set( 'post_type', ['post', 'YOUR_CUSTOM_POST_TYPE'] ); // Adds custom post type to date archives
        }
    }
}, PHP_MAX_INT );

PRENDRE NOTE:

La plupart du code ci-dessus n'a pas été testé, il est donc possible qu'il soit bogué. En outre, la plupart du code nécessite PHP 5.4 +, ce qui devrait être la version minimale de PHP que vous avez installée, car toutes les versions antérieures ont été supprimées et n'est donc plus pris en charge. Bien qu'ils fonctionnent toujours, ils ne reçoivent pas de mises à jour de sécurité, ce qui peut sérieusement endommager la sécurité globale de votre site.

1
Pieter Goosen