Posted on Leave a comment

Acciones Bulk para las categorías de productos de woocommerce

Groups Woocommerce Categories Bulk

Hoy he necesitado crear para una duda de un cliente, poder asignar grupos a categorías de productos en Woocommerce, que en principio, es sencillo, se van editando las categorías una por una, y se van asignando los grupos. El problema llega cuando el cliente me dice que tiene más de 200 categorías, e ir una a una es una pesadilla.
Por cierto, en este caso estoy hablando del plugin Groups de @itthinx.

Mirando documentación oficial y no oficial de WordPress, veo que hay filtros que podemos usar para añadir Bulk Actions a artículos y post types, pero no para las categorías (taxonomías).
La solución que opto, es crear un submenú en la administración de WordPress, mostrar ahí las categorías, los grupos, y que el usuario pueda seleccionarlos, para luego indicar si añadirlos o eliminarlos.

El plugin creado es: Groups Woo Categories Bulk, disponible en github.

Posted on Leave a comment

Usando groups_can y groups_can_not con Visual Composer

Vamos a extender el elemento ‘vc_row’ para poder aplicar los shortcodes ‘groups_can’ y ‘groups_can_not’ del plugin Groups.

Ajustando la plantilla

Añadiremos las siguientes líneas al fichero functions.php de nuestro tema hijo de WordPress.

[php]
vc_add_param("vc_row", array(
"type" => "textfield",
"group" => "Groups",
"class" => "",
"heading" => "groups_can",
"param_name" => "groups_can",
‘description’ => ‘The capability attribute is required and is used to indicate one or more capabilities separated by comma.’
));
vc_add_param("vc_row", array(
"type" => "textfield",
"group" => "Groups",
"class" => "",
"heading" => "groups_can_not",
"param_name" => "groups_can_not",
‘description’ => ‘The capability attribute is required and is used to indicate one or more capabilities separated by comma.’
));
[/php]

Ahora, el elemento Columna tiene dos nuevos parámetros dentro de la pestaña ‘Groups’:

Cada elemento de Visual Composer tiene su plantilla de representación. En este caso vamos a sobrescribir vc_row.php desde nuestra plantilla hija.

1.- Crea una nueva carpeta “vc_templates” en tu tema hijo.

2.- Copia vc_row.php desde /wp-content/plugins/js_composer/includes/templates/shortcodes/ a la nueva carpeta creada en el tema hijo.

3.- Ahora vamos a cambiar el archivo vc_row.php, con este código:

[php]
<?php
if ( ! defined( ‘ABSPATH’ ) ) {
die( ‘-1’ );
}

/**
* Shortcode attributes
* @var $atts
* @var $el_class
* @var $full_width
* @var $full_height
* @var $equal_height
* @var $columns_placement
* @var $content_placement
* @var $parallax
* @var $parallax_image
* @var $css
* @var $el_id
* @var $video_bg
* @var $video_bg_url
* @var $video_bg_parallax
* @var $parallax_speed_bg
* @var $parallax_speed_video
* @var $content – shortcode content
* @var $css_animation
* Shortcode class
* @var $this WPBakeryShortCode_VC_Row
*/
$el_class = $full_height = $parallax_speed_bg = $parallax_speed_video = $full_width = $equal_height = $flex_row = $columns_placement = $content_placement = $parallax = $parallax_image = $css = $el_id = $video_bg = $video_bg_url = $video_bg_parallax = $css_animation = »;
$disable_element = »;
$output = $after_output = »;
$atts = vc_map_get_attributes( $this->getShortcode(), $atts );
extract( $atts );

wp_enqueue_script( ‘wpb_composer_front_js’ );

$el_class = $this->getExtraClass( $el_class ) . $this->getCSSAnimation( $css_animation );

$css_classes = array(
‘vc_row’,
‘wpb_row’,
//deprecated
‘vc_row-fluid’,
$el_class,
vc_shortcode_custom_css_class( $css ),
);

if ( ‘yes’ === $disable_element ) {
if ( vc_is_page_editable() ) {
$css_classes[] = ‘vc_hidden-lg vc_hidden-xs vc_hidden-sm vc_hidden-md’;
} else {
return »;
}
}

if ( vc_shortcode_custom_css_has_property( $css, array(
‘border’,
‘background’,
) ) || $video_bg || $parallax
) {
$css_classes[] = ‘vc_row-has-fill’;
}

if ( ! empty( $atts[‘gap’] ) ) {
$css_classes[] = ‘vc_column-gap-‘ . $atts[‘gap’];
}

$wrapper_attributes = array();
// build attributes for wrapper
if ( ! empty( $el_id ) ) {
$wrapper_attributes[] = ‘id="’ . esc_attr( $el_id ) . ‘"’;
}
if ( ! empty( $full_width ) ) {
$wrapper_attributes[] = ‘data-vc-full-width="true"’;
$wrapper_attributes[] = ‘data-vc-full-width-init="false"’;
if ( ‘stretch_row_content’ === $full_width ) {
$wrapper_attributes[] = ‘data-vc-stretch-content="true"’;
} elseif ( ‘stretch_row_content_no_spaces’ === $full_width ) {
$wrapper_attributes[] = ‘data-vc-stretch-content="true"’;
$css_classes[] = ‘vc_row-no-padding’;
}
$after_output .= ‘<div class="vc_row-full-width vc_clearfix"></div>’;
}

if ( ! empty( $full_height ) ) {
$css_classes[] = ‘vc_row-o-full-height’;
if ( ! empty( $columns_placement ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-columns-‘ . $columns_placement;
if ( ‘stretch’ === $columns_placement ) {
$css_classes[] = ‘vc_row-o-equal-height’;
}
}
}

if ( ! empty( $equal_height ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-equal-height’;
}

if ( ! empty( $content_placement ) ) {
$flex_row = true;
$css_classes[] = ‘vc_row-o-content-‘ . $content_placement;
}

if ( ! empty( $flex_row ) ) {
$css_classes[] = ‘vc_row-flex’;
}

$has_video_bg = ( ! empty( $video_bg ) && ! empty( $video_bg_url ) && vc_extract_youtube_id( $video_bg_url ) );

$parallax_speed = $parallax_speed_bg;
if ( $has_video_bg ) {
$parallax = $video_bg_parallax;
$parallax_speed = $parallax_speed_video;
$parallax_image = $video_bg_url;
$css_classes[] = ‘vc_video-bg-container’;
wp_enqueue_script( ‘vc_youtube_iframe_api_js’ );
}

if ( ! empty( $parallax ) ) {
wp_enqueue_script( ‘vc_jquery_skrollr_js’ );
$wrapper_attributes[] = ‘data-vc-parallax="’ . esc_attr( $parallax_speed ) . ‘"’; // parallax speed
$css_classes[] = ‘vc_general vc_parallax vc_parallax-‘ . $parallax;
if ( false !== strpos( $parallax, ‘fade’ ) ) {
$css_classes[] = ‘js-vc_parallax-o-fade’;
$wrapper_attributes[] = ‘data-vc-parallax-o-fade="on"’;
} elseif ( false !== strpos( $parallax, ‘fixed’ ) ) {
$css_classes[] = ‘js-vc_parallax-o-fixed’;
}
}

if ( ! empty( $parallax_image ) ) {
if ( $has_video_bg ) {
$parallax_image_src = $parallax_image;
} else {
$parallax_image_id = preg_replace( ‘/[^d]/’, », $parallax_image );
$parallax_image_src = wp_get_attachment_image_src( $parallax_image_id, ‘full’ );
if ( ! empty( $parallax_image_src[0] ) ) {
$parallax_image_src = $parallax_image_src[0];
}
}
$wrapper_attributes[] = ‘data-vc-parallax-image="’ . esc_attr( $parallax_image_src ) . ‘"’;
}
if ( ! $parallax && $has_video_bg ) {
$wrapper_attributes[] = ‘data-vc-video-bg="’ . esc_attr( $video_bg_url ) . ‘"’;
}
$css_class = preg_replace( ‘/s+/’, ‘ ‘, apply_filters( VC_SHORTCODE_CUSTOM_CSS_FILTER_TAG, implode( ‘ ‘, array_filter( array_unique( $css_classes ) ) ), $this->settings[‘base’], $atts ) );
$wrapper_attributes[] = ‘class="’ . esc_attr( trim( $css_class ) ) . ‘"’;

$output .= ‘<div ‘ . implode( ‘ ‘, $wrapper_attributes ) . ‘>’;

// @eggemplo changes
if ( isset ( $groups_can ) && ( strlen( trim( $groups_can ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can capability="’ . $groups_can . ‘"]’ . ( $content ) . ‘[/groups_can]’ );
}
if ( isset ( $groups_can_not ) && ( strlen( trim( $groups_can_not ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can_not capability="’ . $groups_can_not . ‘"]’ . ( $content ) . ‘[/groups_can_not]’ );
}
// end – @eggemplo changes

$output .= wpb_js_remove_wpautop ($content);
$output .= ‘</div>’;
$output .= $after_output;

echo $output;
[/php]

Esta es la parte de código que hemos cambiado:
[php]
// @eggemplo changes
if ( isset ( $groups_can ) && ( strlen( trim( $groups_can ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can capability="’ . $groups_can . ‘"]’ . ( $content ) . ‘[/groups_can]’ );
}
if ( isset ( $groups_can_not ) && ( strlen( trim( $groups_can_not ) ) > 0 ) ) {
$content = do_shortcode( ‘[groups_can_not capability="’ . $groups_can_not . ‘"]’ . ( $content ) . ‘[/groups_can_not]’ );
}
// end – @eggemplo changes
[/php]

Espero que sirva de ayuda !!!

Posted on Leave a comment

Restricciones por defecto con Groups

Si estás usando el plugin Groups de @itthinx Y necesitas establecer unas restricciones por defecto para todos los artículos/páginas/etc … este código puede ayudarte:

function restricted_save_post($post_id, $post) {
if(!is_object($post) || !isset($post->post_type)) {
return;
}
switch($post->post_type) { // Do different things based on the post type
case "post":
// add your default capabilities
Groups_Post_Access::create( array( 'post_id'=>$post_id, 'capability'=>'Premium' ) );
break;
default:
// Do other stuff
}
}
add_action('save_post', 'restricted_save_post', 1, 2);

Con el código se añade la capacidad ‘Premium’ a todos los nuevos artículos.

Suerte!