Respuestas de foro creadas

Viendo 15 respuestas - de la 1 a la 15 (de un total de 55)
  • Iniciador del debate inigonz

    (@inigonz)

    Buenas,

    Al final lo solucione con código, porque con el plugin tenia que decirle en otra pagina el orden de los terms de cada cpt, y no me gusto mucho, ya que no soy quien mete el contenido y las personas encargadas de ello se pueden volver locos.

    Seguí buscando por internet y vi que la función register_taxonomy tiene un argumento «sort», que mantiene el orden de insercion de los terms en el cpt, como no me funcionaba estuve buscando el porque, y vi que había un bug pero se soluciona añadiendo en los argumentos ‘orderby’ => ‘term_order’, quedaria de esta manera para que funcione:

    register_taxonomy( 'wptests_tax', 'post', array(
    	'sort' => true,
    	'args' => array(
    		'orderby' => 'term_order',
    	),
    ) );

    Lo único que el nombre de la taxonomía me ha cambiado de servicios por etiquetas.

    Saludos

    Iniciador del debate inigonz

    (@inigonz)

    Buenas Alvaro,

    Leí la descripción del plugin pero ya veo que no entendí bien lo que ponía o en que estaría pensando. Muchas gracias.

    Iniciador del debate inigonz

    (@inigonz)

    Buenas Alvaro, muchas gracias por tu respuesta.

    No se si es a lo que te refieres, pero por ejemplo tengo un proyecto que le añado 3 terms no jerárquicos, primero añado programación, luego diseño y luego estudio. Cuando le das a actualizar o guardar el proyecto, el te ordena alfabéticamente los terms, pero yo quiero que me los muestre por orden en los que he añadido, es decir, programación, luego diseño y luego estudio. En la vista del proyecto seria lo mismo, que los muestre en el orden que los he añadido. Sabéis si se puede hacer?

    Gracias

    Iniciador del debate inigonz

    (@inigonz)

    Muchas gracias Pablo por tu respuesta, opino lo mismo que tu.

    Iniciador del debate inigonz

    (@inigonz)

    Buenas,

    Como era diferente tipo de taxonomía, he creado otro debate, entonces los pongo juntos y cierro este o como hago?

    Gracias

    Iniciador del debate inigonz

    (@inigonz)

    ok, perfecto. Muchísimas gracias.

    Un saludo

    Iniciador del debate inigonz

    (@inigonz)

    A mi sin ello me está funcionando correctamente, pero era por saber, no vaya a ser que se me este escapando algo.

    Muchas gracias, un saludo

    Iniciador del debate inigonz

    (@inigonz)

    Muchas gracias por la respuesta Almendron.
    Acabo de comprender que esa función te crea como un bloque para esos campos, columna izquierda con el label de la función y columna derecha con los campos que se añaden en el callback.
    Es necesario poner la función? si no la pones afecta a algo?

    Gracias

    Buenas,

    Mírate esto en el codex: https://codex.wordpress.org/Class_Reference/wpdb

    Espero que te sirva, yo cuando he necesitado llamar a tablas de la bbdd lo he hecho así, ya sean tablas del wp o tablas propias.

    Saludos

    Iniciador del debate inigonz

    (@inigonz)

    Buenas Dackar,

    Que error te da?
    La parte de seguridad la hago en el plugin, y está copiada en el ultimo comentario, y lo otro que necesitas, es el cpt para ver como llamo a los caps del cpt proyecto, no se que mas puede faltar.

    Lo otro que comento, es con el plugin options-framework, para crear un theme options, desde ahí genero una página-options donde me muestra las taxonomías de mi cpt proyecto, con los usuarios registrados, voy marcando que taxonomías puede editar cada usuario.

    Iniciador del debate inigonz

    (@inigonz)

    Algo así había pensado pero como no lo he utilizado nunca… me pongo con ello.

    Muchas gracias por la respuesta

    Buenas,

    He visto este código, a ver si te sirve:

    
    $args = array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'orderby' => 'date',
        'order' => 'DESC',
    
        // Using the date_query to filter posts from last week
        'date_query' => array(
            array(
                'after' => '1 week ago'
            )
        )
    ); 
    

    Url: https://wordpress.stackexchange.com/questions/99265/display-posts-of-the-last-7-days

    Buenas,

    Primero tienes una regla css que te bloquea el display none

    @media screen and (min-width: 621px)
    style.css?ver=1.4.5:922
    #wpforo-wrap #wpforo-menu .wpf-menu {
        display: block!important;
    }

    Deberías poner !important en tu código para que tengo prioridad sobre lo demás.
    Pero acabo de ver que ocultado ese menu, tampoco te vas a librar del error que se visualiza, ya que el texto ese no esta dentro de ese elemento contenedor.

    Tienes que buscar en el plugin, la frase esa (< class=»menu-mobilenav-container»>), y comentarla

    Iniciador del debate inigonz

    (@inigonz)

    Buenas de nuevo,

    Ya lo he conseguido, ha costado pero bueno, funciona que es lo importante.

    
    // CPT PROYECTO
    $pr_labels = array(
    	'name' => __( 'Proyectos' ),
    	'singular_name' => __( 'Proyecto' ),
    	'add_new' => __( 'Añadir nuevo' ),
    	'add_new_item' => __( 'Añadir nuevo Proyecto' ),
    	'edit_item' => __( 'Editar Proyecto' ),
    	'new_item' => __( 'Nuevo Proyecto' ),
    	'view_item' => __( 'Ver Proyecto' ),
    	'search_items' => __( 'Buscar Proyecto' ),
    	'not_found' => __( 'No se encontraron Proyectos' ),
    	'not_found_in_trash' => __( 'No se encontraron Proyectos en la papelera' )
    );
    
    $pr_args = array(
    	'labels' => $pr_labels,
    	'public' => true,
    	'publicly_queryable' => true,
    	'show_ui' => true,
    	'show_in_menu'	=> true,
    	'show_in_nav_menus' => true,
    	'menu_position ' => 20,
    	'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes', 'post-formats', 'revisions', 'author' ),
    	'capability_type' => 'proyecto',
    	'capabilities' => array(
    	        'edit_post' => 'edit_proyecto',
    	        'read_post' => 'read_proyecto',
    		'delete_post' => 'delete_proyecto',
    		'edit_posts' => 'edit_proyectos',
    		'edit_others_posts' => 'edit_others_proyectos',
    		'publish_posts'	=> 'publish_proyectos',
                    'edit_publish_posts' => 'edit_publish_proyectos',
    		'read_private_posts' => 'read_private_proyectos',
    		'create_posts' => 'edit_proyectos',
    		'delete_posts' => 'delete_proyectos',
    		'delete_others_posts' => 'delete_others_proyectos',
    	),
    	'map_meta_cap' => true,
    	'hierarchical'	=> false,
    	'has_archive' => true,
    		'rewrite' => array(
    		'slug'	=> 'proyecto',
    	),
    	'menu_icon' => 'dashicons-screenoptions'
    );
    
    $pr_args = apply_filters( 'proyecto_args', $pr_args );
    register_post_type( 'proyecto', $pr_args );
    

    Y en el plugin

    
    // ACTIVACION / DESACTIVACION PLUGIN: CREACION / ELIMINACION DE ROLES - CAPS
    class CustomEditorRole {
    	private static $role = 'rol12';
    	private $role_label;
    
    	function __construct() {
    		// here we need a real, loaded, text domain
    		$this->role_label = __( 'Rol12' );
    	}
    
    	function addRole() {
    		global $wp_roles;
    
    		if ( ! $wp_roles instanceof WP_Roles ) {
    			$wp_roles = new WP_Roles;
    		}
    
    		// Crear Rol para los Recas
    		$caps = array(
    			'read' => true,
    			'upload_files' => true,
    			'edit_theme_options' => true,
    				
    		);
    
    		// Añadir caps CTP y TAX al rol
    		$caps['edit_proyecto'] 	= TRUE;
    		$caps['publish_proyecto'] = TRUE;
    		$caps['delete_proyecto'] = TRUE;
    
    		// Custom cap
    		$caps['edit_same_tax_posts'] 	= TRUE;
    
    		// Create new role with custom caps
    		add_role( self::$role, $this->role_label, $caps );
    	}
    
    	function removeRole() {
    		global $wp_roles;
    
    		if ( ! $wp_roles instanceof WP_Roles ) {
    			$wp_roles = new WP_Roles;
    		}
    
    		remove_role(self::$role);
    	}
    }
    
    register_activation_hook( __FILE__, array( new CustomEditorRole, 'addRole' ) );
    register_deactivation_hook( __FILE__, array( new CustomEditorRole, 'removeRole' ) );
    
    // PERMISOS DE LECTURA / ESCRITURA PARA LOS POST PROPIOS / OTROS / MISMA CATEGORIA
    class CustomEditorCaps {
    	function manageCaps( $allcaps, $caps, $args, $user ) {
    		if ( ! $this->shouldManage( $args[0], $user ) ) {
    			return $allcaps;
    		}
    
    		// Are we saving?
    		$action = filter_input( INPUT_POST, 'action', FILTER_SANITIZE_STRING );
    		$method = strtoupper( filter_var($_SERVER['REQUEST_METHOD'], FILTER_SANITIZE_STRING ) );
    
    		if ( $method !== 'POST' ) { // not saving
    			global $pagenow;
    
    			// we are interested only on post list and post edit screens
    			if ( is_admin() && in_array( $pagenow, array( 'post.php', 'post-new.php', 'edit.php' ), TRUE ) ) {
    				$screen_id 	= $pagenow === 'edit.php' ? 'edit-pproyecto' : 'proyecto';
    				$allcaps 	= $this->maybeAllow( $args, $allcaps, $user, $screen_id );
    			}
    		} elseif ( $action === 'editpost' ) { // saving and right action
    			$allcaps = $this->maybeAllowOnSave( $args, $allcaps, $user );
    		}
    
    		return $allcaps; // always return: it's a filter
    	}
    
    	function lockPendingStatus( $data, $postarr ) {
                    return $data; // always return: it's a filter
    	}
    
    	function allowPreview( $posts, $query ) {
    		if ( is_admin() || ! $query->is_main_query() || empty( $posts ) || ! $query->is_single || $posts[0]->post_type !== 'proyecto' ) {
    			return $posts; // return first argument: it's a filter
    		}
    
    		$status = get_post_status( $posts[0] );
    		$post_status_obj = get_post_status_object( $status );
    			
    		if ( ! $post_status_obj->public && current_user_can('edit_same_tax_posts') ) {
    			// post is pending and our user has our special role
    			// allow preview
    			global $wp_post_statuses;
    			$wp_post_statuses[$status]->public = TRUE;
    		}
    
    		return $posts; // return first argument: it's a filter
    	}
    
    	private function maybeAllow( $args, $allcaps, $user, $screen ) {
    		if ( $args[0] === 'edit_others_proyectos' ) {
    			// if filtering 'edit_others_posts' we have no access to single post data
    			// allow cap only on post list screen and before querying posts
    			$allcaps['edit_others_proyectos'] = ! did_action('pre_get_posts') && $screen === 'edit-proyecto';
    
    			return $allcaps;
    		}
    
    		$post = get_post( $args[2] );
    		$permisos = of_get_option( $user->ID . 'permisos' );
    		$terms 	= get_the_terms( $post, 'mercado' );
    		$termId = '';
    		$termParent = '';
    
    		if ( $terms ) {
    			foreach ( $terms as $term ) {
    				$termId = $term->term_id;
    				$termParent = $term->parent;
    
    				if ( $termParent != 0 ) {
    					$term_parent = get_term_top_most_parent( $termId, 'mercado' );
    					$termId = $term_parent['parent'];
    				}
    
    				if ( $permisos[$termId] == 1 ) {
    					$allcaps['edit_others_proyectos'] 	 = TRUE;
    					$allcaps['edit_published_proyectos'] = TRUE;
    				}
    			}
    		}
    
    		return $allcaps; // always return: it's a filter
    	}
    
    	private function maybeAllowOnSave( $args, $allcaps, $user ) {
    		$data = $this->getPostedData();
    
    		if ( $data['post_type'] !== 'proyecto' || (int) $data['post_ID'] <= 0 ) {
    			return $allcaps;
    		}
    
    		$post = get_post( $data['post_ID'] );
    		$permisos = of_get_option( $user->ID . 'permisos' );
    		$terms = get_the_terms( $post, 'mercado' );
    		$termId = '';
    		$termParent = '';
    
    		if ( $terms ) {
    			foreach ( $terms as $term ) {
    				$termId = $term->term_id;
    				$termParent = $term->parent;
    
    				if ( $termParent != 0 ) {
    					$term_parent = get_term_top_most_parent( $termId, 'mercado' );
    					$termId = $term_parent['parent'];
    				}
    
    				if ( $permisos[$termId] == 1 ) {
    					// if post is pending and will stay pending allow editing
    					$allcaps['edit_others_proyectos'] 	 = true;
    					$allcaps['edit_published_proyectos'] = true;
    				}
    			}
    		}			
    
    		return $allcaps;
    	}
    
    	private function shouldManage( $cap, $user ) {
    		return is_admin() && in_array( $cap, array( 'edit_others_proyectos', 'edit_published_proyectos', 'edit_proyecto', 'edit_post', ), TRUE ) && ! $user->has_cap( 'delete_others_proyectos' ) && $user->has_cap( 'edit_same_tax_posts' ) && ! defined( 'DOING_AJAX' ); // does not affect ajax
    	}
    
    	private function getPostedData() {
    		return filter_input_array( INPUT_POST, array( 'post_type' => FILTER_SANITIZE_STRING, 'post_ID' => FILTER_SANITIZE_NUMBER_INT, 'original_post_status' => FILTER_SANITIZE_STRING, 'post_status' => FILTER_SANITIZE_STRING, ) );
    	}
    
    }
    
    $cap_manager = new CustomEditorCaps;
    add_filter( 'user_has_cap', array( $cap_manager, 'manageCaps' ), PHP_INT_MAX, 4 );
    add_filter( 'posts_results', array( $cap_manager, 'allowPreview' ), 10, 2 );
    add_filter( 'wp_insert_post_data', array( $cap_manager, 'lockPendingStatus' ), 10, 2 );
    

    Lo de los permisos genero en el options del options-framework unos checkbox con los terms para cada usuario, y así compruebo si el id de ese usuario tiene permisos para ese term

    Saludos

    Iniciador del debate inigonz

    (@inigonz)

    Buenas de nuevo,

    Codigo con roles especiales

    He encontrado el link de arriba, donde explican como dar permisos especiales a los usuarios, basándose en el rol de author.
    Los autores solo pueden editar en estos casos:

    Los post de otros – si están pendiente de revisión
    Los suyos propios – si están pendiente de revisión o borrador
    Si estan publicados ya no pueden editarlos

    Lo he probado y funciona perfectamente, ahora solo tengo que modificarlo para que se adapte a lo que yo necesito.

    Un saludo

Viendo 15 respuestas - de la 1 a la 15 (de un total de 55)