• Resuelto kisukedeath

    (@kisukedeath)


    Buenas tardes, tengo el siguiente problema:

    -¿Cómo puedo validar que cuando tenga 5 post’s con el mismo tag me genere automaticamente un custom_post_type con el nombre de ese tag y que este custom_post_type actue como un tag page?

    Estoy desarrollando un plugin pero no consigo crear el custom_post_type de manera dinámica, este es mi código

    <?php
       /*
          Plugin Name: Plugin-prueba.
          Plugin URI: Url del plugin.
          Description:  Descripcion.
          Version: Numero de versiones 1,2,..10.
          Author: Nombre del autor.
          Author URI: Pagina personal del autor.
       */
    
    function cus_post(){
    
     while(have_posts()) : the_post();
       $posttags = get_the_tags();
       if($posttags){
          foreach($posttags as $tag){
             $tags_arr[] = $tag -> name;
          }
       }
    endwhile;
    
    for ($i=0; $i < sizeof($tags_arr) ; $i++) { 
    
       if(countRepeat($tags_arr[$i],$tags_arr)== 5){
              register_post_type('prueba',
              array(
             'labels' => array(
                'name' => __($tags_arr[0]),
                'singular_name' => __($tags_arr[0])
             ),
             'public' => true,
             'has_archive' => true,
          )
       );
          }
    
    function countRepeat($value, array $array){
    $count = 0;
       foreach($array as $k => $v)
       {
          if((string)$v == (string)$value)
          {
             ++$count;
          }
       }
       return $count;
    }
       }
Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)
  • Creo que está mal enfocado. Primero, hay fallos en el código, no sé si los has visto. Segundo, estás intentando sacar posts dentro de un plugin y WordPress no detecta eso como una plantilla (index, archivos, single, etc…) por lo que have_posts() devuelve false. La query tendrías que hacerla de forma manual con WP_Query y piensa que no querrás ejecutar esa función cada vez que WordPress se cargue. Podrían existir muchos tags y muchos posts y ralentizaría mucho la carga. Lo mejor es que guardes los tags en la base de datos y cuando se cree un nuevo tag, lo vuelves a generar. No sé si me explico. Te paso el código que he hecho pero esta última comprobación no la incluyo. Si necesitas más ayuda pregunta:

    add_action( 'init', 'cus_post' );
    function cus_post(){
    
       // Obtenemos todos los tags
       $tags = get_tags();
    
       // Para cada tag, obtenemos los posts asociados
       $tags_arr = array();
       foreach ( $tags as $tag ) {
    
          // Los argumentos son: búscame los posts que estén etiquetados con un tag cuyo ID sea $tag->term_id
          $args = array(
             'tag_id' => $tag -> term_id
          );
          $the_query = new WP_Query( $args );
    
          // Si hay más de 5 posts asociados, gúardamos los datos de ese
          if ( $the_query -> post_count > 5 ) {
             $tags_arr[] = $tag;
          }
    
       }      
    
       // Ahora, en $tags_arr tenemos los datos de todos los tags asociados a más de 5 posts
    
       // Para cada nombre de los tags creamos un custom post type
       foreach ( $tags_arr as $tag ) {
    
          // Labels. El problema es que no podremos internacionalizarlo
          $labels = array(
             'name' => $tag -> name,
             'singular_name' => $tag -> name,
             'add_new' => sprintf( __( 'Add New %s', 'your_text_domain' ), $tag -> name ),
             'add_new_item' => sprintf( __( 'Add New %s', 'your_text_domain' ), $tag -> name ),
             'edit_item' => sprintf( __( 'Edit %s', 'your_text_domain' ), $tag -> name ),
             'new_item' => sprintf( __( 'New %s', 'your_text_domain' ), $tag -> name ),
             'all_items' => sprintf( __( 'All %s', 'your_text_domain' ), $tag -> name ),
             'view_item' => sprintf( __( 'View %s', 'your_text_domain' ), $tag -> name ),
             'search_items' => sprintf( __( 'Search %s', 'your_text_domain' ), $tag -> name ),
             'not_found' =>  sprintf( __( 'No %s found', 'your_text_domain' ), $tag -> name ),
             'not_found_in_trash' => sprintf( __( 'No %s found in Trash', 'your_text_domain' ), $tag -> name ),
             'parent_item_colon' => '',
             'menu_name' => sprintf( __( '%s', 'your_text_domain' ), $tag -> name ),
          );
    
          // Argumentos. Ten en cuenta que el slug del custom post type no puede ser el nombre porque podría llevar caracteres raros
          $args = array(
             'labels' => $labels,
             'public' => true,
              'publicly_queryable' => true,
              'show_ui' => true,
              'show_in_menu' => true,
              'query_var' => true,
              'capability_type' => 'post',
              'has_archive' => true,
              'hierarchical' => false,
              'menu_position' => null,
              'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' )
          );
          register_post_type( $tag -> slug, $args);
    
       }
    }

    Iniciador del debate kisukedeath

    (@kisukedeath)

    Muchas gracias igmoweb, una consulta tengo el siguiente problema:

    -Como puedo hacer para que utilizando add_filter(the_content) en mi función pueda retornar diferentes contenidos a diferentes posts

    add_filter('the_content','addposts');
    
    function addposts($content){
          global $post;
          global $finaltag; // arreglo con test y test2 son los tag que se repetian 4 veces en los posts [0] y [1]
    
          //registered public custom post types
         $types = get_post_types(array('public' => true, '_builtin' => false) ,'names'); //encuentra test y test2 son 2 custom types que se crearon dinámicamente al haberse encontrado 4 posts con el tag test y 4 post con el tag test2
         foreach ($types as $type) {     //entra 2 veces
            if(is_single() && get_posts('post_type='.$type)){ //si encuentra primero post type test entra
                for($i=0; $i < sizeof($finaltag); $i++){
                $args = array(
                'post_type' => 'post',
                'post_status' => 'publish',
                'tag' => $finaltag[$i] //$finaltag es un arreglo con los tag obtenidos en otra funcion test y test2
                );//argumentos para que busque los post con status publish y con el tag test
    
              $tag_posts = get_posts($args); 
    
                 foreach ($tag_posts as $post) : setup_postdata($post); ?>
    
                 <?php $content = ?> <h1 class='entry-title'><a href="<?php the_permalink() ?>"><?php the_title() ?></a></h1>
                 //encontrará 4 titles de los 4 post que tienen como tag test, la siguiente ves que entre encontrará 4 titles de los 4 post que tienen como tag test2
                 <?php
    
                 endforeach; 
    
                 }
    
            }
              return $content;  // necesito que retorne los titles y contents respectivamente a get_posts('post_type='.$type) osea al post que tenga como post_type = test y al post que tenga como post_type = test 2 pero no se cómo hacerlo si cuando hace return finaliza la función.
          }
    }
    ?>

    Agradeceré mucho tu ayuda.

    Hola kisukedeath. La verdad es que no entiendo muy bien lo que quieres hacer pero si lo que quieres es sacar un listado de los posts que tengan tags incluidos en $finaltag, aquí tendrías una solución más sencilla:

    add_filter( 'the_content', 'my_test_content' );
    function my_test_content($content) {
    
      // Voy a suponer que tu variable es esta. No entiendo muy bien para qué la necesitas pero supongo que
      // aquí no están todos los tags que se repiten más de 4 veces. Si están todos no la necesitas
      $finaltag = array( 'tag1', 'tag2' );
    
      // Primero pondría esta comprobación. Si !is_single() entonces mejor no hacer nada
      if ( is_single() ) {
    
        // No queremos que el post que estamos viendo salga en la lista así que guardamos su ID
        $current_post_id = get_the_ID();
    
        foreach( $finaltag as $tag ) {
    
          // Con esto te salen los posts con tag = $finaltag[i] excepto el post que estamos viendo
          $my_query = new WP_Query(
              array(
                  'tag' => $tag,
                  'post__not_in' => array( $current_post_id )
              )
          );
    
          while ( $my_query -> have_posts() ) {
            $my_query -> the_post();
    
            // Vamos agregando al final de nuestro contenido los títulos de los posts
            $content .= '<h1 class="entry-title"><a href="' . get_permalink() . '">' . get_the_title() . '</a></h1>';
    
          }
    
          // No te olvides de rebobinar por si acaso
          wp_reset_postdata();
    
        }
      }
    
      return $content;
    }

    Ahora bien. Vuelvo a decirte que cuando tienes pocos tags y pocos posts, esto es rápido pero conforme vayas creando contenido, esa función podría convertirse en una pesadilla. Recomiendo que leas algún tutorial de la Transient API de WordPress y vayas guardando estos resultados de alguna manera para no tener que hacer tantísimos bucles cada vez que ves un post. Pero vamos, te irás dando cuenta tú mismo.

Viendo 3 respuestas - de la 1 a la 3 (de un total de 3)
  • El debate ‘Problema desarrollando plugin’ está cerrado a nuevas respuestas.