Question

( Note de modérateur: Le titre original était "à l'aide des archives par date, avec une date personnalisée")

J'ajoute une date supplémentaire à des postes comme un champ personnalisé. Maintenant, je veux l'archive pour afficher les messages de la date de commande et non par la date de publication. Par exemple J'ai aujourd'hui publié après (Décembre 22ème) mais la date personnalisée est fixée à 1ère Janvier . Quand je charge la archives/date/2011/01 URL dans le navigateur les messages avec la date de mesure qui correspondent ne sont pas affichés (évidemment).

Est-il possible de modifier le comportement de la page générée pour l'URL archives/date/2011/01 pour retrive les messages de la date de commande?

Merci.

Était-ce utile?

La solution

Comme beaucoup de choses dans WordPress il y a plusieurs façons de le faire ce que vous voulez. Je vais vous expliquer un d'entre eux.

Retirez le 'year', 'monthnum' et 'day' requête de variables

Vous pouvez modifier les paramètres pour l'utilisation de WordPress de requête sur les URL archive à l'intérieur du crochet 'pre_get_posts'. Ces paramètres sont capturés comme un tableau associatif par les règles de réécriture dans la propriété de l'objet WP_Query appelées variables de query_vars 'year', 'monthnum' et 'day'.

Lorsque $wp_query->query_vars a des valeurs pour 'year', 'monthnum' et 'day' WordPress les utiliser lors de l'interrogation de la liste des messages si la première étape consiste à supprimer les paires de valeurs de clé à partir du tableau de requête en utilisant la fonction unset() de PHP (notez que $wp_query est une variable globale dans WordPress qui contient l'objet de la requête en cours comme une instance de la classe WP_Query.)

La fonction yoursite_pre_get_posts() ci-dessous déclenché par le crochet de 'pre_get_posts' supprimera les variables à partir du tableau de query_vars mais seulement lorsque la requête est la principale requête * (le $query passé au crochet est exactement égale à la $wp_the_query globale ou $query===$wp_the_query) et seulement lorsque la requête est une archives requête. Si vous ajoutez ce au fichier functions.php de votre thème, vous trouverez vos pages d'archives afficher tous les messages, et non pas seulement ceux pour la date (donc nous sommes à mi-chemin de ce que vous voulez ...) :

add_action('pre_get_posts', 'yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    unset($query->query_vars['year']);
    unset($query->query_vars['monthnum']);
    unset($query->query_vars['day']);
  }
}

Ajouter des variables de requête pour votre champ personnalisé

est où il obtient un peu délicat. Dans v3.0.x WordPress vous permet uniquement de requête pour le champ personnalisé à l'aide des valeurs dans le tableau de query_var et il ne nous permet pas d'appliquer des fonctions à ces critères soit.

La modification suivante à yoursite_pre_get_posts() permettrait à votre requête archive correspondant à une date exacte en admettant que vous conservé la date au format 'YYYY-MM-DD' dans le champ personnalisé:

add_action('pre_get_posts', 'yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $qv = &$query->query_vars;
    $date = mktime(0,0,0,$qv['monthnum'],$qv['day'],$qv['year']);
    $qv['meta_key'] = 'Custom Date';
    $qv['meta_value'] = date("Y-m-d",$date);
    unset($qv['year']);
    unset($qv['monthnum']);
    unset($qv['day']);
  }
}

Et voici ce qui ressemble à une capture d'écran:

Bien sûr, qui est pas vraiment envie que vous voulez. Vous souhaitez interroger pour l'année et le mois au lieu d'un jour spécifique, ou même pour tout l'année. Comme je l'ai dit, c'est là que ça devient délicat.

Utilisez le crochet 'posts_where' pour modifier le WHERE SQL article

Fondamentalement, vous devez aller plus loin dans les crochets et et appeler le crochet 'posts_where', que j'essaie toujours d'éviter, si possible, car lorsque vous faites trouver texte et remplacer sur des fragments de requête SQL, il est très facile à écrire du code qui sera incompatible avec un autre plug-in qui modifie la même requête SQL. Quoi qu'il en soit, si vous en avez besoin et rien d'autre ne fonctionnera alors il est là pour vous en dernier recours.

Ainsi, les recherches de la fonction yoursite_posts_where() la clause WHERE que WordPress construit pour le texte "AND wp_postmeta.meta_value = '2011-01'" et le remplace par le texte "AND SUBSTRING(wp_postmeta.meta_value,1,7) = '2011-01'", et voici le code:

add_action('posts_where','yoursite_posts_where',10,2);
function yoursite_posts_where( $where, $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $meta_value = $query->query_vars['meta_value'];
    $length = strlen($meta_value);
    $find = "AND wp_postmeta.meta_value = '{$meta_value}'";
    $replace = "AND SUBSTR(wp_postmeta.meta_value,1,{$length}) = '{$meta_value}'";
    $where = str_replace($find,$replace,$where);
  }
  return $where;
}

Modifier yoursite_pre_get_posts() pour prendre en charge plusieurs options Année-mois-jour

Bien sûr, cela exigera que nous modifions notre fonction yoursite_pre_get_posts() pour soutenir différentes valeurs de méta longueur: 'YYYY', 'YYYY-MM' et 'YYYY-MM-DD' (Notez l'utilisation de ce qui semble être l'utilisation complexe des fonctions de mktime() et date() de PHP sont simplement pour éviter d'avoir à vous soucier de ces modèles: 'YYYY-M', 'YYYY-MM-D' et 'YYYY-M-D'):

add_action('pre_get_posts','yoursite_pre_get_posts' );
function yoursite_pre_get_posts( $query ) {
  global $wp_the_query;
  if ($query===$wp_the_query && $query->is_archive) {
    $qv = &$query->query_vars;  // Make it less tedious to reference
    if ($qv['monthnum']==0) // Just search on YYYY
      $date = $qv['year'];
    else if ($qv['day']==0) // Search on YYYY-MM
      $date = date('Y-m',mktime(0,0,0,$qv['monthnum'],1,$qv['year']));
    else
      $date = date('Y-m-d',mktime(0,0,0,$qv['monthnum'],$qv['day'],$qv['year']));
    $qv['meta_key'] = 'Custom Date';
    $qv['meta_value'] = $date;
    unset($qv['year']);
    unset($qv['monthnum']);
    unset($qv['day']);
  }
}

Et qui nous donne la suiteING qui enveloppe assez bien ce que vous recherchez:

Code pour afficher la date personnalisée dans le thème

BTW, voici le code que j'utilisé dans le thème de saisir la valeur meta Date personnalisée:

<?php if ($custom_date = get_post_meta($post->ID,'Custom Date',true)): ?>
  <h2>Custom Date: <?php echo $custom_date; ?></h2>
<?php endif; ?>

P.S. Rappelez-vous l'utilisateur doit entrer au format 'YYYY-MM-DD'

Rappelez-vous les besoins des utilisateurs d'entrer la date personnalisée au format 'YYYY-MM-DD' pour que cela fonctionne. Bien sûr, vous pouvez le rendre plus convivial à l'utilisateur via plusieurs méthodes différentes, à savoir dans le code SQL ou via un crochet de 'save_post' qui reformate la date, mais je vais laisser cela comme un exercice pour quelqu'un d'autre.

P.P.S. Option: Enregistrer plusieurs valeurs Meta au lieu

Une autre approche aurait été d'utiliser le crochet 'save_post' pour sauver trois (3) les valeurs de méta cachées dans le format pour la correspondance à 'YYYY-MM-DD', 'YYYY-MM' et 'YYYY' peut-être avec les touches méta '_custom_date', '_custom_date_year_month' '_custom_date_year' qui serait plus résistante aux autres plugins qui pourraient vouloir également modifier la clause de WHERE SQL, mais ajouterait trois (3) des champs personnalisés supplémentaires cachés pour chaque poste afin que peut-être pas une bonne idée pour un blog avec un grand nombre de postes et il est possible qu'ils pourraient sortir de synchronisation d'une certaine manière.

Autres conseils

Essayez ceci:

  • copier votre archive.php (index.php si vous ne disposez pas d'archives) modèle à date.php
  • dans le modèle de date.php utilisation query_posts() passer outre tri, vous devez utiliser

PS hm, je pense que les archives de date sont généralement comme /year/month/, qu'est-ce que vous utilisez pour obtenir /archives/date/year/month/? ..

PPS fait après avoir regardé la réponse de Mike cela risque ne suffit pas d'incidence sur la sélection des messages. Grattez cela.

Oui - vous devrez soit utiliser query_posts() ou get_posts() ou écrire une requête personnalisée vous-même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top