Tuneando el plugin ‘Users Submitted Post’ de WordPress para custom post type y custom taxonomy

El plugin ‘Users Submitted Post’ permite que los usuarios puedan publicar posts en nuestra web desde el front end y nos da la posibilidad de configurar varias opciones (moderación, campos etc). Aquí más información sobre este fantástico plugin.

Par poder utilizar este plugin con Custom post type y custom taxonomy no encontré otra opción que retocar el código, lo que no es la mejor manera si en el futuro tenemos que actualizar el plugin. Pero de momento es la solución más rápida que encontré.

Para esto tendremos que editar 2 archivos del mismo plugin.

1-wp-content/plugins/user-submitted-posts/user-submitted-posts.php en la línea 251

$postData = array();
$postData['post_title']   = $title;
$postData['post_content'] = $content;
$postData['post_status']  = 'pending';
$postData['post_author']  = $authorID;
//Add here the custom post type name you want to save the post as
//Añade aquí el tipo de post
$postData['post_type']  = 'My_custom_post_type'';
$numberApproved           = $usp_options['number-approved'];

Dónde sustituiremos My_custom_post_typepor el nombre que hemos asignado al custom post type que hemos creado previamente.

Si además hemos creado custom taxonomies, tendremos que cambiar la función que viene con el submit post del plugin, que está escrita para guardar las categorías pero no las custom taxonomies.
Para esto, en el mismo archivo cambiaremos la línea 278

wp_set_post_categories($newPost, array($category));

por lo siguiente

wp_set_object_terms($newPost, array($category), 'My_cutom_taxonomy');

Dónde sustituiremos My_cutom_taxonomy por el nombre que hemos asignado a las categorías personalizadas.

Para que nos aparezcan estas categorías en las opciones generales del ‘general form options’ del plugin y poder de esta manera asignar una custom category por defecto, a la hora de crear una nueva entrada, cambiaremos las siguientes líneas (725 del mismo archivo)

											<?php $categories = get_categories(array('hide_empty'=> 0)); ?>
											<?php foreach($categories as $category) { ?>
											
											<div class="mm-radio-inputs">
												<label class="description">
													<input <?php checked(true, in_array($category->term_id, $usp_options['categories'])); ?> type="checkbox" name="usp_options[categories][]" value="<?php echo $category->term_id; ?>" /> 
													<span><?php echo htmlentities($category->name); ?></span>
												</label>
											</div>
											
											<?php } ?>

por estas

											<?php $categories = get_terms('My_cutom_taxonomy',array('hide_empty'=> 0)); ?>
											<?php foreach($categories as $category) { ?>
											
											<div class="mm-radio-inputs">
												<label class="description">
													<input <?php checked(true, in_array($category->term_id, $usp_options['categories'])); ?> type="checkbox" name="usp_options[categories][]" value="<?php echo $category->term_id; ?>" /> 
													<span><?php echo htmlentities($category->name); ?></span>
												</label>
											</div>
											
											<?php } ?>

Dónde otra vez sustituiremos My_cutom_taxonomy por el nombre que hemos asignado a las categorías personalizadas.

Ahora hemos que hacer aparecer nuestras custom taxonomies en el dropdown del form, en lugar de las categorías de los posts de wordpress. El plugin viene con dos tipos de form, el clasic y el html5. Según cual usemos abriremos y editaremos el archivo correspondiente (o ambos por si no hemos decidido todavía). en este caso editaremos el archivo wp-content/plugins/user-submitted-posts/views/submission-form.php, que corresponde al HTML5 form.
Buscamos este código (está por la línea 54)

		<fieldset class="usp-category">
			<label for="user-submitted-category"><?php _e('Post Category'); ?></label>
			<select name="user-submitted-category">
				<?php foreach($usp_options['categories'] as $categoryId) { $category = get_category($categoryId); if(!$category) { continue; } ?>
				<option value="<?php echo $categoryId; ?>"><?php $category = get_category($categoryId); echo htmlentities($category->name); ?></option>
				<?php } ?>
			</select>
		</fieldset>

Y lo sostituimos por lo siguiente

		<fieldset class="usp-category">
<?php
function get_terms_dropdown($taxonomies, $args){
    $myterms = get_terms($taxonomies, $args);
    $output ="<select name='user-submitted-category' id='user-submitted-category' class='usp_select'>";
    $output .="<option value='#'>Please select a business category</option>";
    foreach($myterms as $term){
        $term_name =$term->name;
        $term_id =$term->term_id;
        $output .="<option class='usp_option' value='".$term_id."'>".$term_name."</option>";
    }
    $output .="</select>";
return $output;
}
$taxonomies = array('My-custom-tazonomy);
$args = array('orderby'=>'name','hide_empty'=>true);
$select = get_terms_dropdown($taxonomies, $args);
 
$select = preg_replace("#<select([^>]*)>#", "<select$1>", $select);
echo $select;?>
		</fieldset>

Otra vez cambiaremos My-custom-taxonomy por nuestra categoría

Script para dividir URL. Muy útil para qTranslate

Me encontré más de una vez con el problema de hacer funcionar el plugin qTranslate con otros plugins o scripts. A veces el fantástico qTranslate no es reconocido por otros plugins, o por scripts que añadimos.

Se me ocurrió una manera un poco casera pero eficaz para solucionar estos problemas y poder utilizar the_Permalink dentro del Loop de wordpress, para todos los idiomas que tenga activados.

Para esto necesitamos tener activadas las url amigables de nuestro WordPress.
Vamos a Settings->Permalinks y activamos el modo post.

Y hacemos lo mismo para el qTranslate. En Settings ->Idiomas, activamos “Usar modo de pre-ruta (Por defecto, pone /es/ delante de la URL)”.

Este script está escrito para poder hacer funcionar el plugin All-in-One Event Calendar cuyos enlaces a los posts de eventos no funcionaban para los idiomas. Pero os servirá para cualquier situación, ya que estamos trabajando en la url.
Así venían las url de los posts de eventos:

http://example.com/ai1ec_event/mi_evento/?instance_id=1

Y ahora el script:

<?php
$permalink=esc_attr( get_permalink($event->post_id ) . $event->instance_id );
list( $http, $nada, $domain, $ai1ec_event, $eventid, $instanceid,)=explode("/", $permalink);
$engpermalink=$http . "//" . $domain .  "/en/" . $ai1ec_event  . "/" . $eventid . "/" . $instanceid;
$catpermalink=$http . "//" . $domain .  "/CA/" . $ai1ec_event  . "/" . $eventid . "/" . $instanceid;
?>

Lo que hacemos con las primeras dos líneas de código, es dividir la url del permalink en cachitos, asignando una variable a cada parte comprendida entre los caracteres “/”.
Luego la recomponemos, insertando en el lugar apropiado /en/ para ingles, y /CA/ para catalán.
A partir de aquí la variable $engpermalink será mi Permalink para el ingles y $catpermalink para el catalán.
Así que, en mi loop, pondré este código para que los Permalinks cambien en función del idioma en el que se encuentre quien navega:


 <?php if (qtrans_getLanguage() == 'es') : ?>
<h4><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php echo the_title(); ?></a></h4>
           <?php elseif (qtrans_getLanguage() == 'en') : ?>
<h4><a href="<?php echo $engpermalink ;?>" title="<?php the_title(); ?>"><?php echo the_title(); ?></a></h4>
           <?php elseif (qtrans_getLanguage() == 'ca') : ?>
<h4><a href="<?php echo $catpermalink ;?>" title="<?php the_title(); ?>"><?php echo the_title(); ?></a></h4>
<?php endif; ?>

Y listo!

Aquí el código completo para el Loop

<?php get_header(); ?>
<?php
$permalink=esc_attr( get_permalink($event->post_id ) . $event->instance_id );
list( $http, $nada, $domain, $ai1ec_event, $eventid, $instanceid,)=explode("/", $permalink);
$engpermalink=$http . "//" . $domain .  "/en/" . $ai1ec_event  . "/" . $eventid . "/" . $instanceid;
$catpermalink=$http . "//" . $domain .  "/CA/" . $ai1ec_event  . "/" . $eventid . "/" . $instanceid;
?>

 <?php if(have_posts()) : while(have_posts()) : the_post(); ?>
<div class="the_content">
      <?php if (qtrans_getLanguage() == 'es') : ?>
<h4><a href="<?php the_permalink() ?>" title="<?php the_title(); ?>"><?php echo the_title(); ?></a></h4>
           <?php elseif (qtrans_getLanguage() == 'en') : ?>
<h4><a href="<?php echo $engpermalink ;?>" title="<?php the_title(); ?>"><?php echo the_title(); ?></a></h4>
           <?php elseif (qtrans_getLanguage() == 'ca') : ?>
<h4><a href="<?php echo $catpermalink ;?>" title="<?php the_title(); ?>"><?php echo the_title(); ?></a></h4>
<?php endif; ?>
		<?php the_content(); ?>
<?php endwhile; // end of the loop. ?>
</div><!--the_content-->