Custom Post Type desde functions

En este Post crearemos un tipo de contenido nuevo (Custom Post Type) para WordPress sin ningún tipo de plugin. Si quieres más información sobre este tipo de contenidos puedes revisarte la documentación de Post Types.

Crear el icono del menú WordPress

Empezaremos creando un icono que aparecerá en el menu lateral del panel de WordPress, en este caso voy a crear un Tipo de contenido nuevo llamado «Links» así que usaremos un icono en .png de 23×23 píxeles. Una vez creado lo guardamos en una carpeta, en este caso la hemos guardado en una carpeta que hemos creado nueva dentro de plugins: /wp-content/plugins/links/Images/icono.png

icono custom type

Insertando el tipo de contenido en nuestro functions.php

Ahora debemos crear una función que genere este nuevo tipo de contenidos, para ello debemos editar el functions.php de nuestro tema de WordPress y añadir el siguiente código:

/* CUSTOM POST LINKS */

function my_custom_post_links() {

  $labels = array(
    'name'               => _x( 'Links', 'post type general name' ),
    //Nombre del nuevo tipo de contenido
    'singular_name'      => _x( 'Link', 'post type singular name' ),
    //Nombre del nuevo tipo de contenido en plural
    'add_new'            => _x( 'Añadir Link', 'book' ),
    //Texto que se muestra en el menú lateral para añadir este tipo de contenido
    'add_new_item'       => __( 'Añadir Link' ),
    //El texto que aparece para agregar este nuevo tipo de contenido
    'edit_item'          => __( 'Editar Link' ),
    //El texto que aparece cuando estamos viendo una entrada
    'new_item'           => __( 'Nuevo Link' ),
    //El texto que aparece para agregar un nuevo tipo de contenido
    'all_items'          => __( 'Todos los Links' ),
    //Texto que aparece para mostrar todas las entradas del nuevo tipo de contenido
    'view_item'          => __( 'Ver Link' ),
    //Texto que aparece para ver tu entrada
    'search_items'       => __( 'Buscar Links' ),
    //Texto que aparece al lado del cuadro de búsqueda
    'not_found'          => __( 'No hay Links creados!!' ),
    //Texto que muestra cuando no hay ningun tipo de contenido creado
    'not_found_in_trash' => __( 'No hay Links borrados!!' ), 
    //Texto que muestra cuando no hay ningun tipo de contenido en la papelera
    'parent_item_colon'  => 'Links',
    //Si el elemento se comporta jerarquicamente como padre, el texto que aparecerá en el enlace.
    'menu_name'          => 'Links'
    //El nombre en que aparecerá en el menu del escritorio de WordPress
  );

  $rewrite = array(
  		'slug'                => 'link',
    'with_front'          => true,
    'pages'               => true,
    'feeds'               => true,
  );

  //Creamos los argumentos

  $args = array(
    'label'               => __( 'link'),
    //Nombre del nuevo tipo de contenidos
    'description'   	  => 'Grupo de webs amigas',
    //Descripción del nuevo tipo de contenidos
    'labels'        	  => $labels,
    //Array con las etiquetas definidas anteriormente
     'supports'           => array( 'title'),
    //Array con los campos que aparecerán al crear este nuevo tipo de contenidos
    //  array( 'title', 'editor', 'author', 'comments', 'excerpt', 'thumbnail')
    'taxonomies'          => array( 'category', 'post_tag' ),
    //Te permita agregar categorías y etiquetas a tu entrada
    'hierarchical'        => false,
    //Si tu entrada personalizada puede ser jerárquica
    'public'        	  => true,
    //Para asignar a las entradas si serán publicas o no
    'show_ui'             => true,
    //Si aparece en el menú de wordpress aparece como public
    'show_in_menu'        => true,
    'show_in_nav_menus'   => true,
    'show_in_admin_bar'   => true,
    'menu_position'       => 5,
    //Posición que se mostrará en el menú WordPress
    //5 Debajo de Entradas - 10 Debajo de Multimedia - 15 Debajo de Enlaces - 20 Debajo de Páginas
    //25 Debajo de Comentarios - 60 Debajo de Apariencia - 65 Debajo de Plugins
    //70 Debajo de Usuarios - 75 Debajo de Herramientas - 80 Debajo de Ajustes
    'menu_icon'     	  => site_url().'/wp-content/plugins/links/images/logo.png',
    //La ruta a la imagen que aparecerá en el menú de WordPress
    'can_export'          => true,
    //Si se puede exportar el tipo de contenido
    'has_archive'         => true,
    //Permite los archivos de entrada personalizada. Puede ser “true” o “false”, o poner una cadena de texto para indicar cuál será el enlace
    'exclude_from_search' => false,
    // Si es true no aparecerá en los resultados de búsquedas de la web.
    'query_var'           => 'link',
    'rewrite'        	  => $rewrite,
    //Le pasamos un array con el formato para los permalinks de las entradas.
    'capability_type' 	  => 'post',
    //Establece permisos, poniendo “post” los permisos serán los mismos que para el resto de entradas
  );

  register_post_type( 'link', $args );	

}

add_action( 'init', 'my_custom_post_links' );

 

Visualizando nuestro nuevo tipo de contenidos en WordPress

Si todo está bien deberíamos ver en nuestro panel de WordPress nuestro botón de Links con su icono correspondiente.

custom post type

El nuevo tipo de contenido Link  se puede seguir implementando, por ejemplo, en $args tenemos todos los argumentos del tipo de contenido Link, si añadimos:

‘taxonomies’          => array( ‘category’, ‘post_tag’ ),

Esto nos mostrará las categorías también en de contenido Link. En este caso sólo queremos que aparezcan 3 campos, el título, la descripción y la url.

Añadir nuevos campos al Custom Post Type

Para añadir nuevos campos al custom post type debemos implementar de nuevo el código en nuestro functions.php de nuestro tema, después del código que genera el nuevo tipo de contenido pegaremos lo siguiente para añadir los bloques que necesitemos, por ejemplo en nuestro caso, queremos mostrar:

  • Web
  • Correo
  • Titulo de enlace
  • Url de destino
  • CheckBox de enlace recíproco

Para ello, seguidamente del código que genera el custom post type nuevo, ampliaremos el código para guardar los nuevos campos.

El código completo del nuevo CUSTOM POST TYPE LINK (copiar y pegar en el functions.php del tema WordPress):

/* CUSTOM POST LINKS */

function my_custom_post_links() {

  $labels = array(
    'name'               => _x( 'Links', 'post type general name' ),
    //Nombre del nuevo tipo de contenido
    'singular_name'      => _x( 'Link', 'post type singular name' ),
    //Nombre del nuevo tipo de contenido en plural
    'add_new'            => _x( 'Añadir Link', 'book' ),
    //Texto que se muestra en el menú lateral para añadir este tipo de contenido
    'add_new_item'       => __( 'Añadir Link' ),
    //El texto que aparece para agregar este nuevo tipo de contenido
    'edit_item'          => __( 'Editar Link' ),
    //El texto que aparece cuando estamos viendo una entrada
    'new_item'           => __( 'Nuevo Link' ),
    //El texto que aparece para agregar un nuevo tipo de contenido
    'all_items'          => __( 'Todos los Links' ),
    //Texto que aparece para mostrar todas las entradas del nuevo tipo de contenido
    'view_item'          => __( 'Ver Link' ),
    //Texto que aparece para ver tu entrada
    'search_items'       => __( 'Buscar Links' ),
    //Texto que aparece al lado del cuadro de búsqueda
    'not_found'          => __( 'No hay Links creados!!' ),
    //Texto que muestra cuando no hay ningun tipo de contenido creado
    'not_found_in_trash' => __( 'No hay Links borrados!!' ), 
    //Texto que muestra cuando no hay ningun tipo de contenido en la papelera
    'parent_item_colon'  => 'Links',
    //Si el elemento se comporta jerarquicamente como padre, el texto que aparecerá en el enlace.
    'menu_name'          => 'Links'
    //El nombre en que aparecerá en el menu del escritorio de WordPress
  );

  $rewrite = array(
  		'slug'                => 'link',
    'with_front'          => true,
    'pages'               => true,
    'feeds'               => true,
  );

  //Creamos los argumentos

  $args = array(
    'label'               => __( 'link'),
    //Nombre del nuevo tipo de contenidos
    'description'   	  => 'Grupo de webs amigas',
    //Descripción del nuevo tipo de contenidos
    'labels'        	  => $labels,
    //Array con las etiquetas definidas anteriormente
     'supports'           => array( 'revisions'),
    //Array con los campos que aparecerán al crear este nuevo tipo de contenidos
    //  array( 'title', 'editor', 'author', 'comments', 'excerpt', 'thumbnail')
    //'taxonomies'          => array( 'category', 'post_tag' ),
    //Te permita agregar categorías y etiquetas a tu entrada
    'hierarchical'        => false,
    //Si tu entrada personalizada puede ser jerárquica
    'public'        	  => true,
    //Para asignar a las entradas si serán publicas o no
    'show_ui'             => true,
    //Si aparece en el menú de wordpress aparece como public
    'show_in_menu'        => true,
    'show_in_nav_menus'   => true,
    'show_in_admin_bar'   => true,
    'menu_position'       => 5,
    //Posición que se mostrará en el menú WordPress
    //5 Debajo de Entradas - 10 Debajo de Multimedia - 15 Debajo de Enlaces - 20 Debajo de Páginas
    //25 Debajo de Comentarios - 60 Debajo de Apariencia - 65 Debajo de Plugins
    //70 Debajo de Usuarios - 75 Debajo de Herramientas - 80 Debajo de Ajustes
    'menu_icon'     	  => site_url().'/wp-content/plugins/links/images/logo.png',
    //La ruta a la imagen que aparecerá en el menú de WordPress
    'can_export'          => true,
    //Si se puede exportar el tipo de contenido
    'has_archive'         => true,
    //Permite los archivos de entrada personalizada. Puede ser “true” o “false”, o poner una cadena de texto para indicar cuál será el enlace
    'exclude_from_search' => false,
    // Si es true no aparecerá en los resultados de búsquedas de la web.
    'query_var'           => 'link',
    'rewrite'        	  => $rewrite,
    //Le pasamos un array con el formato para los permalinks de las entradas.
    'capability_type' 	  => 'post',
    //Establece permisos, poniendo “post” los permisos serán los mismos que para el resto de entradas
  );

  register_post_type( 'link', $args );	

  /* CREAR CAMPOS NUEVOS	*/

  function add_boxeslink_meta_boxes() {
    add_meta_box("direccion_contact_meta", "Detalles del link", "add_detalleslink_meta_box", "link", "normal", "low");
  }

  function add_detalleslink_meta_box() {

    global $post;
    $custom = get_post_custom( $post->ID );

    ?>
        <style>
      .width90{ width: 90%; height:30px;}
      label {font-size:16px; margin-top:10px;}
      label span{color:red}
    </style>

    <p> 
      <label>Web:</label><br/>
      <input type="text" name="web" value="<?= @$custom[/fusion_builder_column][fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="no" center_content="no" min_height="none"]["web"][0] ?>" class="width90" />

            <br/><br/>

      <label>Correo:</label><br/>
      <input type="text" name="correo" value="<?= @$custom["correo"][0] ?>" class="width90" />

            <br/><br/>  

      <label>Título del enlace:</label><br/>
      <input type="text" name="titulo" value="<?= @$custom["titulo"][0] ?>" class="width90" />

            <br/><br/>                      

      <label>URL de destino <span>( Usar http:// )</span>:</label><br />
      <input type="text" name="url" value="<?= @$custom["url"][0] ?>" class="width90" />

            <br/><br/>

    		¿Tiene enlace recíproco?<br/>
      <?php $radio_value = get_post_meta( $post->ID,'reciproco',true ); ?>
          <input type="radio" name="reciproco" value="si" <?php echo ($radio_value == 'si')? 'checked="checked"':'';?>/> Si <br/> 
          <input type="radio" name="reciproco" value="no" <?php echo ($radio_value == 'no')? 'checked="checked"':'';?> /> No

    </p>
    <?php
  }

  //Save custom field data when creating/updating posts

  function save_url_custom_fields(){
    global $post;

    if ( $post ) {
    update_post_meta($post->ID, "web", @$_POST["web"]);
    update_post_meta($post->ID, "correo", @$_POST["correo"]);
    update_post_meta($post->ID, "titulo", @$_POST["titulo"]);
    	update_post_meta($post->ID, "url", @$_POST["url"]);
    update_post_meta($post->ID, "reciproco", @$_POST["reciproco"]);
    }
  }

  add_action( 'admin_init', 'add_boxeslink_meta_boxes' );
  add_action( 'save_post', 'save_url_custom_fields' );

}

add_action( 'init', 'my_custom_post_links' );

 

 

Ahora ya podemos crear entradas de tipo LINK, almacenarlas en base de datos, editarlas y eliminarlas.

LINKS INTERESANTES

Generar el código de un nuevo CUSTOM POST TYPE:


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *