Skip Navigation

[Resolved] crear un formulario de producto

This support ticket is created 5 years, 8 months ago. There's a good chance that you are reading advice that it now obsolete.

This is the technical support forum for Toolset - a suite of plugins for developing WordPress sites without writing PHP.

Everyone can read this forum, but only Toolset clients can post in it. Toolset support works 6 days per week, 19 hours per day.

Sun Mon Tue Wed Thu Fri Sat
- 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 7:00 – 14:00 -
- 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 15:00 – 16:00 -

Supporter timezone: Europe/London (GMT+00:00)

This topic contains 13 replies, has 3 voices.

Last updated by Rafael Corts 5 years, 8 months ago.

Assisted by: Nigel.

Author
Posts
#1201469
Captura de pantalla 2019-02-17 20.31.27.png
Captura de pantalla 2019-02-17 19.30.40.png

Hola Nigel, quiero recuperar un tema que ya te lo plantee hace tiempo y no conseguí solucionarlo.
Tengio un formulario para crear un producto de Woocommerce. necesito que cuando se cree el formulario que se añada directamente el nombre del centro en una taxonomía con el nombre de "wcpv_product_vendors",
La llamada al formulario viene de este codigo
<codigo>
[cred_child_link_form form='3608' parent_id='[tienda-id]' class='rc_boto' text='crear un producte' target='_self']
</codigo>
una vez se envia el formulario la taxonomia del producto "wcpv_product_vendors" se deberia poner el nombre del centro.

para que cuando el producto este en la web tenga un enlace con la taxonomia del centro que lo ha creado. el codigo deberia ser este:
<codigo>

add_action( 'cred_save_data_4427', 'prefix_cred_taxonomy', 10, 2 );
function prefix_cred_taxonomy( $post_id, $form_data ){

$campo = get_the_title( $post_id );

error_log("nom del centre es: " . $campo);

$term = wp_insert_term( $campo, 'wcpv_product_vendors' );

error_log(print_r($term, true));

}
</codigo>

El debug.log
<codigo>
[17-Feb-2019 18:45:23 UTC] PHP Notice: Trying to get property 'ID' of non-object in /home/linventa/public_html/plantilla/wp-content/plugins/cred-frontend-editor/library/toolset/cred/embedded/classes/CRED_Helper.php on line 1683
[17-Feb-2019 18:49:05 UTC] nom del centre es: producte 55
[17-Feb-2019 18:49:05 UTC] Array
(
[term_id] => 134
[term_taxonomy_id] => 134
)

</codigo>
Por lo que puedes ver me ha mostrado el nombre del producto pero yo lo que necesito es el nombre del "centro" que es un parent_id .
Cada centro tiene varios productos.
Como debería hacerlo?
Saludos.
Rafa Corts

#1201745

Hi Rafa,

Thank you for contacting us.

Nigel is on vacations and will be back tomorrow, but I'll be happy to assist while he is away.

Based on what you've shared, I understand that your code's line:


error_log ("center name is:". $ field);

is returning the title of the current product which is being added/edited through the form, but you need the title of the "centres" post type, which is the parent post in "centres_product" relationship.

If that is correct, you can use "toolset_get_related_posts" function ( ref: https://toolset.com/documentation/customizing-sites-using-php/post-relationships-api/#toolset_get_related_posts ) to get the ID of the related parent post in your "prefix_cred_taxonomy" function.

Example:


add_action( 'cred_save_data_4427', 'prefix_cred_taxonomy', 10, 2 );
function prefix_cred_taxonomy( $post_id, $form_data ){


	// get parent post in a relationship
	$query_by_element = $post_id; // ID of post to get relationship from
	$relationship = 'centres_product'; // relationship slug
	$query_by_role_name = 'child'; // $query_by_element is a child in this relation 
	$limit = 1; // defaults
	$offset = 0; // defaults
	$args = array(); //nothing needed
	$return = 'post_id'; // We want Post ID
	$role_name_to_return = 'parent'; // We want parent.

	$get_results = toolset_get_related_posts(
					$query_by_element,
					$relationship,
					$query_by_role_name,
					$limit,
					$offset,
					$args,
					$return,
					$role_name_to_return
					);

	error_log(print_r($get_results));

}

You'll note that "$get_results" array should hold the ID of the parent post, in the relationship, when one exists. You can then use it to get the title or any other processing, as needed.

I hope this helps and please let me know if you need any further assistance around this.

regards,
Waqar

#1201828

Hola Waqar, he canviado el codigo y no hace nada,
¿De donde has sacado esta información 'centres_product' ?
$relationship = 'centres_product'; // relationship slug
El Slug del centro és:
hidden link
Lo que necesito es el nombre del centro "Electrònica Vallès" para relacionar el centro con el producto utilizo una función:
"[tienda-id]"
Enlace:
[cred_child_link_form form='3608' parent_id='[tienda-id]' class='rc_boto' text='crear un producte' target='_self']

Esta función hace:
/**
* Shortcode personalizado que devuelve el ID
* de la tienda del usuario corriente
*/
add_shortcode( 'tienda-id', function(){

$tienda_id = 0;

$usuario = wp_get_current_user();

if ( $usuario->ID != 0 ) {

$args = array(
'post_type' => 'centres',
'post_status' => 'publish',
'author' => $usuario->ID
);
$entradas_tienda = get_posts( $args );

if ( !empty($entradas_tienda) ) {
$tienda_id = $entradas_tienda[0]->ID;
}
}

return $tienda_id;

});

¿para escribir código como se hacia en el ticket?
Saludos.
Rafa Corts

#1202312

Nigel
Supporter

Languages: English (English ) Spanish (Español )

Timezone: Europe/London (GMT+00:00)

Hola Rafa

Una nota decir que he cogido este hilo y te contestaré lo antes posible, estamos muy ocupados en este momento.

#1203100

Nigel
Supporter

Languages: English (English ) Spanish (Español )

Timezone: Europe/London (GMT+00:00)

Hola Rafa

Permítame aclarar los requisitos.

Tienes una relación entre 'centres' y 'productes'.

Usas WooCommerce Product Vendors, que añade una taxonomía de vendors a productos.

Tienes un formulario para publicar productos (que sepa el centro padre).

Quieres que, al enviar el formulario, se asigna un término de la taxonomía product_vendors automáticamente con el título del padre centro, ¿correcto?

Mi única pregunta es, ¿ya existe este término o sea necesario crearlo?

#1203310

Hola Nigel, todo lo que has dicho esta correcto la pregunta que me haces de si ya existe este termino o sea necesario crearlo?
En principio lo creo manualmente, porque para que funcione, dentro de la taxonomía vendor a parte de crear el nombre también se debe adjudicar un usuario para que haga de administrador del producto.
Por ahora solo harem el primer paso que es: En el moment que un usuario crea un producto con un formulario se asigne un termino de la taxonomía Product_vendors automáticamente y coja el nombre del centro.
Saludos.
Rafa corts

#1204005

Nigel
Supporter

Languages: English (English ) Spanish (Español )

Timezone: Europe/London (GMT+00:00)

Hola Rafa

El ID del padre entrada está disponible en el $_POST objeto cuando usas el hook cred_save_data.

El el sitio mio de prueba, p.j., el selector de la entrada padre se inserta en el formulario como tal:

	<div class="form-group">
		<label>Projects Tasks</label>
		[cred_field field="@project-task.parent" class="form-control" output="bootstrap" select_text="--- not set ---"]
	</div>

El atributo field tiene la forma "@relationship-slug.parent".

Si saco el valor de $_POST en el registro de depuración lo veo:

[21-Feb-2019 16:31:39 UTC] _POST: Array
(
    [@project-task_parent] => 44
    [form_submit_1] => Submit
    [_cred_cred_wpnonce_cred_form_93] => b7870936b3
    [_cred_cred_prefix_post_id] => 96
    [_cred_cred_prefix_cred_container_id] => 94
    [_cred_cred_prefix_form_id] => 93
    [_cred_cred_prefix_form_count] => 1
)

Entonces en cred_save_data tengo el ID de la entrada padre así: $_POST['@project-task.parent']

Puedes coger el título de esta entrada con get_the_title (https://developer.wordpress.org/reference/functions/get_the_title/), ó puede ser mejor coger el objeto de la entrada para que tienes el slug de la entrada, p.j. (https://developer.wordpress.org/reference/functions/get_post/).

Entonces puedes usar wp_set_post_terms para añadir el término de la taxonomía de product vendors que corresponde (https://developer.wordpress.org/reference/functions/wp_set_post_terms/).

#1204731

Hola Nigel, perdona pero no tengo suficiente nivel de programación para poderte seguirte, ya no se cual es el código que debo poner,
entiendo que el código de abajo lo debo poner en el formulario pero con mis campos:

// El tuyo 
<div class="form-group">
    <label>Projects Tasks</label>
    [cred_field field="@project-task.parent" class="form-control" output="bootstrap" select_text="--- not set ---"]
</div>
// El mio
<div class="form-group">
    <label>Projects Tasks</label>
    [cred_field field="@wcpv_product_vendors.parent" class="form-control" output="bootstrap" select_text="--- not set ---"]
</div>

¿Esto es correcto?

¿Para poder ver el mensaje del log de este código seria asin?:

 error_log($_POST);

De donde saco el código que me indicas "Entonces en cred_save_data tengo el ID de la entrada padre así: $_POST['@project-task.parent']"

Lo saco del código que me paso tu compañero Waqar, o lo debo sacar de los enlaces que me has pasado?
De los dos enlaces creo que será mejor el primero, "coger el titulo".

function get_the_title( $post = 0 ) {
    $post = get_post( $post );
 
    $title = isset( $post->post_title ) ? $post->post_title : '';
    $id    = isset( $post->ID ) ? $post->ID : 0;
 
    if ( ! is_admin() ) {
        if ( ! empty( $post->post_password ) ) {
 
            /**
             * Filters the text prepended to the post title for protected posts.
             *
             * The filter is only applied on the front end.
             *
             * @since 2.8.0
             *
             * @param string  $prepend Text displayed before the post title.
             *                         Default 'Protected: %s'.
             * @param WP_Post $post    Current post object.
             */
            $protected_title_format = apply_filters( 'protected_title_format', __( 'Protected: %s' ), $post );
            $title                  = sprintf( $protected_title_format, $title );
        } elseif ( isset( $post->post_status ) && 'private' == $post->post_status ) {
 
            /**
             * Filters the text prepended to the post title of private posts.
             *
             * The filter is only applied on the front end.
             *
             * @since 2.8.0
             *
             * @param string  $prepend Text displayed before the post title.
             *                         Default 'Private: %s'.
             * @param WP_Post $post    Current post object.
             */
            $private_title_format = apply_filters( 'private_title_format', __( 'Private: %s' ), $post );
            $title                = sprintf( $private_title_format, $title );
        }
    }
 
    /**
     * Filters the post title.
     *
     * @since 0.71
     *
     * @param string $title The post title.
     * @param int    $id    The post ID.
     */
    return apply_filters( 'the_title', $title, $id );
}

y el último punto que comentas el "wp_set_post_terms" debe ser para crear directamente el termino de la taxonomía del vendor. Pero esto ya lo haré manualmente,
Gracias por la paciencia.

Saludos.
Rafa Corts

#1205627

Nigel
Supporter

Languages: English (English ) Spanish (Español )

Timezone: Europe/London (GMT+00:00)

Screenshot 2019-02-25 at 14.28.49.png

Hola Rafa

En el formulario cuando insertas el campo de la entrada relacionada el markup sale así:

<div class="form-group">
    <label>Título de relación</label>
    [cred_field field="@slug-de-relacion.parent" class="form-control" output="bootstrap" select_text="--- not set ---"]
</div>

En el caso mío el slug de relación era "parent-task". No sé cual es el tuyo pero se encuentra en la página Toolset > Relationships, editando la relación (pantallazo).

Aquí tienes un ejemplo del código requerido:

add_action( 'cred_save_data', 'tssupp_form_submit', 10, 2 );
function tssupp_form_submit( $post_id, $form_data ){

	$relationship = 'project-task'; // Editar
	$taxonomy = 'product-vendors'; // Editar


	if ( in_array( $form_data['id'], array( 123 ) ) ) { // Editar ID del formulario

		// ID de entrada padre
		$parent_id = $_POST['@' . $relationship . '_parent'];

		$parent_title = get_the_title( $parent_id );

		// necesitamos el ID del término correspondiente
		$term = get_term_by( 'name', $parent_title, $taxonomy );

		// asignar término 
		wp_set_object_terms( $post_id, $term->term_id, $taxonomy );

	}
}

Sea necesario editarlo, y no lo he probado. Rafa, proveer código personalizado está fuera de nuestra políticas de soporte. Espero que lo que tienes ahí te da un buen comienzo.

#1210081

Hola Nigel, no consigo que funcione la condición, no llega actuar, en la linea de la condición aparece un error.

[05-Mar-2019 14:35:49 UTC] PHP Notice:  Undefined offset: 4427 in /home/linventa/public_html/plantilla/wp-content/themes/mai-lifestyle-pro/functions.php on line 127

el código de la linea és:

if ( in_array( $form_data['4427'], array( 123 ) ) ) { // Editar ID del formulario

Haber si puedes ver que es lo que está pasando.
Para ir al formulario del producto selecciono un boton con el siguiente codigo:

[cred_child_link_form form='3608' parent_id='[tienda-id]' class='rc_boto' text='crear un producte' target='_self']

Ahora ya no se si el código del boton es correcto, por que el ID `3608` no se de donde procede.
Según el código del boton esta utilizando un formulario de crear producto de Woocommerce con el parent_id del centro [tienda-id] .
Saludos.
Rafa Corts

#1210545

Nigel
Supporter

Languages: English (English ) Spanish (Español )

Timezone: Europe/London (GMT+00:00)

Hola Rafa

Surge el error porque cambiaste "ID" en lugar de la muestra de "123", aquí es lo que debe hacer:

    if ( in_array( $form_data['id'], array( 4427 ) ) ) {

¿Puedes intentar de nuevo?

#1210642

Hola Nigel, ya casi lo tengo, por lo que sucede tengo dos dudas: la variable $term no muestra nada, en el log me muestra que las dos variables $parent_title, $taxonomy si que se muestran pero en cambio el campo 'name' mo se si esta correcto si debería de ser una variable.

 [06-Mar-2019 14:23:47 UTC] PHP Warning:  Use of undefined constant relationship - assumed 'relationship' (this will throw an Error in a future version of PHP) in /home/linventa/public_html/plantilla/wp-content/themes/mai-lifestyle-pro/functions.php on line 141
[06-Mar-2019 14:23:47 UTC] relationship 1 wcpv_product_vendors
[06-Mar-2019 14:23:47 UTC] PHP Warning:  Use of undefined constant relationship - assumed 'relationship' (this will throw an Error in a future version of PHP) in /home/linventa/public_html/plantilla/wp-content/themes/mai-lifestyle-pro/functions.php on line 142
[06-Mar-2019 14:23:47 UTC] relationship 2 
[06-Mar-2019 14:23:47 UTC] PHP Warning:  Use of undefined constant relationship - assumed 'relationship' (this will throw an Error in a future version of PHP) in /home/linventa/public_html/plantilla/wp-content/themes/mai-lifestyle-pro/functions.php on line 143
[06-Mar-2019 14:23:47 UTC] relationship 3 5233
[06-Mar-2019 14:23:47 UTC] PHP Warning:  Use of undefined constant relationship - assumed 'relationship' (this will throw an Error in a future version of PHP) in /home/linventa/public_html/plantilla/wp-content/themes/mai-lifestyle-pro/functions.php on line 144
[06-Mar-2019 14:23:47 UTC] relationship 4 centres_product
[06-Mar-2019 14:23:47 UTC] PHP Warning:  Use of undefined constant relationship - assumed 'relationship' (this will throw an Error in a future version of PHP) in /home/linventa/public_html/plantilla/wp-content/themes/mai-lifestyle-pro/functions.php on line 145
[06-Mar-2019 14:23:47 UTC] relationship 4 Inpublici Continguts Publicitaris

te adjunto la linea del código:
De esta linea de código debería salir tres parámetros?

// necesitamos el ID del término correspondiente
        $term = get_term_by( 'name', $parent_title, $taxonomy );

y en esta linea de código, es posible que se deba quitar este trozo de codigo"->term_id"?

// asignar término 
     wp_set_object_terms( $post_id, $term->term_id, $taxonomy ); 

Saludos.

Rafa Corts

#1210671

Nigel
Supporter

Languages: English (English ) Spanish (Español )

Timezone: Europe/London (GMT+00:00)

Creo que me hace falta acceso para poder inspeccionar lo que tienes, desde aquí no puedo decir.

Voy a marcar tu respuesta siguiente como privada para que me facilita acceso.

Por favor, indícame dónde puedo probar el formulario.

#1213178

My issue is resolved now. Thank you!