web-dev-qa-db-fra.com

comment interroger les articles et attribuer automatiquement la catégorie si le titre de l'article a un mot clé

comment puis-je interroger les publications par date actuelle et attribuer automatiquement la catégorie en fonction du mot clé trouvé dans le titre de l'annonce, quelque chose comme si le titre contient la catégorie 'oranges' l'attribue automatiquement à la catégorie 'oranges'

peut-être quelque chose comme ça qui peut aller à functions.php

function add_category_automatically($post_ID) {
global $wpdb,$post;

   $today = getdate();
   $query = new WP_Query( 'year=' . $today["year"] . '&monthnum=' . $today["mon"] .'&day=' . $today["mday"] );
while ( $the_query->have_posts() ) : $the_query->the_post();

  $post_title = get_the_title();
   if (stripos($post_title, 'oranges')!==false) {
    $cat = array(8);
    wp_set_object_terms($post_ID, $cat, 'category');
}
 endwhile;
}
 add_action('publish_post', 'add_category_automatically');

le code ci-dessus ne fonctionne pas bien que le code ci-dessous fonctionne, mais il ne le fait pas vraiment pour les publications existantes tant que je ne les ai pas mises à jour à nouveau. Je souhaite donc qu'une fonction interroge toutes les publications par date actuelle. Elle ne doit être exécutée que si elle est trouvée nouvelle. messages pour aujourd'hui

    function add_category_automatically($post_ID) {
global $wpdb,$post;

       $post_title = get_the_title();
     if (stripos($post_title, 'oranges')!==false) {
    $cat = array(8);
    wp_set_object_terms($post_ID, $cat, 'category');
  }

     }
      add_action('publish_post', 'add_category_automatically');

Mettre à jour:

j'utilise ce code maintenant, cela fonctionne si je publie un nouveau post mais ne fonctionne pas pour les posts existants ??? ..... il devrait être exécuté à chaque fois et vérifier toutes les publications de la base de données et classer automatiquement la publication mais smhw ce n'est pas

       add_action( 'wp_insert_post', 'update_post_terms' );
       function update_post_terms( $post_id ) {
      if ( $parent = wp_is_post_revision( $post_id ) )
    $post_id = $parent;
   $post = get_post( $post_id );
    if ( $post->post_type != 'post' )
    return;
     $post_title = get_the_title();
       if (stripos($post_title, 'oranges')!==false) {

     // add a category
      $categories = wp_get_post_categories( $post_id );
        $newcat    = get_term_by( 'name', 'oranges', 'category' );
        array_Push( $categories, $newcat->term_id );
        wp_set_post_categories( $post_id, $categories );
     } 
        }

je sais que cela mettra une bonne charge sur ma base de données, même si je comprends cela, mais je cherche un moyen de le faire comme un exemple toutes les deux heures ou quelque chose comme ça, aidez-moi!

Mise à jour 2 pour vérifier tous les articles et les boucler pour afficher la catégorie

 $postids = array();
   //this is to tell the script to only pull posts that are labeled "publish"
  $args=array(
     'post_type' => 'post',
      'post_status' => 'publish',
      'posts_per_page' => -1,
      'caller_get_posts'=> 1
   );
  $my_query = null;
$my_query = new WP_Query($args);
   if ( $my_query->have_posts() ) {
while ($my_query->have_posts()) : $my_query->the_post();
$postids[]=$my_query->post->ID;
endwhile;
 }
 wp_reset_query();  // Restore global post data stomped by the_post().

 $i = 0;

  while ($num_of_posts > $i){
  $post_id = $postids[$i];
  add_action( 'wp_insert_post', 'update_post_terms' );
  function update_post_terms( $post_id ) {
  if ( $parent = wp_is_post_revision( $post_id ) )
    $post_id = $parent;
   $post = get_post( $post_id );
  if ( $post->post_type != 'post' )
    return;
  $post_title = get_the_title();
 if (stripos($post_title, 'oranges')!==false) {

 // add a category
  $categories = wp_get_post_categories( $post_id );
  $newcat    = get_term_by( 'name', 'Oranges', 'category' );
  array_Push( $categories, $newcat->term_id );
  wp_set_post_categories( $post_id, $categories );
 }
 }
  $i++;
 }
1
Ravi

Le premier code ne le fera que pour les posts correspondant à votre requête - i.e posts publiés ce jour-là. Quelque chose comme

$query = new WP_Query( 'post_type=post' );

devrait récupérer tous les messages, puis vous pourrez les parcourir et effectuer l'opération nécessaire.

Un mot d'avertissement. Chaque fois qu'une publication est publiée, votre fonction est exécutée. Ainsi, à chaque nouvelle publication publiée, toutes vos publications sont vérifiées et (si nécessaire) ajoutées à la catégorie. Pour gagner du temps/interroger inutilement la base de données, vous voudrez peut-être utiliser la première fonction une seule fois (éventuellement la déclencher d'un clic de bouton), puis utiliser la deuxième fonction pour toutes les nouvelles publications, qui vérifient uniquement la publication en cours de publication.

Réponse à la question mise à jour Si vous souhaitez planifier la répétition de la fonction, utilisez:

<?php wp_schedule_event($timestamp, $recurrence, $hook, $args); ?>

$timestamp est un horodatage UNIX pour le début de la planification. $recurrence est une chaîne décrivant la fréquence à laquelle cela devrait se produire (par exemple, "tous les jours", "toutes les heures", etc.), $hook est votre nom de fonction sous forme de chaîne, c'est-à-dire "update_post_terms". Enfin, $args est un tableau d'arguments (facultatif) pour votre fonction.

Dans l'état actuel des choses, votre fonction prend $post_id en argument et ne met à jour que cette publication. Vous auriez peut-être besoin d'une autre fonction (appelée périodiquement) pour parcourir toutes vos publications et appeler la fonction ci-dessus si vous souhaitez mettre à jour toutes les publications (quotidienne, horaire, etc.).

Voir la page du Codex pour plus de détails.

J'espère que cela t'aides!

1
Stephen Harris