Mostrar campos personalizados ao editar publicações no WP

  • Autor Autor Baires23
  • Data de início Data de início
Tradução em andamento: em alguns minutos este tópico estará em português. Por enquanto, o conteúdo está no original em espanhol. Ver original
B

Baires23

Me estuve haciendo una complicación tremenda probé leyendo en varios lados, no encontré solución y las que funcionaban aparentemente son de 2013 por ende al parecer ya no funcionan con la nueva versión de WP.


Lo que necesito hacer es lo siguiente:

Al crear/editar una publicación/pagina deseo que aparezcan los campos personalizados ya para completar ej:

HZt8E8N.png


y bueno despues mostrarlo donde yo desea segun lei seria con lo siguiente:

PHP:
<?php echo get_post_meta(get_the_ID(), 'ID del campo', true); ?>


Supuestamente agregando en function.php de mi theme podría hacerlo pero probé con varios tipos de códigos y nada si alguien me puede dar una mano con esto.
 
Última edição:
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
No se si ya solucionastes pero te comparto un concepto básico:

Esto coloca el widget en el backend. Para personalizar buscar esta función en wordpress.

PHP:
if ( !function_exists('myfieldtest_myfieldtest_function') ) {
	function myfieldtest_myfieldtest_function() {
	    add_meta_box( 'myfieldtest-function-id', 'Campos Personalizados', 'myfieldtest_callback_function', 'post', 'normal', 'high' );
	}
	add_action( 'add_meta_boxes', 'myfieldtest_myfieldtest_function' );
}

Esta función añade los campos dentro del widget:
PHP:
if ( !function_exists('myfieldtest_callback_function') ) {
	function myfieldtest_callback_function( $post ) {
		$myfieldtest = get_post_meta( $post->ID, '_myfieldtest', true );
		$outline = '
			<table><tbody>
				<tr>
					<td scope="row">DATO X1</td>
					<td>
						<input type="text" name="myfieldtest" id="myfieldtest" value="'.$myfieldtest.'" />
					</td>
				</tr>
			</tbody></table>';
		echo $outline;
	}
}

Esta función te permite almacenar ese campo cuando guardas/actualiza dicha publicación:
PHP:
if ( !function_exists('myfieldtest_save_meta_box') ) {
	function myfieldtest_save_meta_box( $post_id ) {
		if ( isset($_POST['myfieldtest']) && $_POST['myfieldtest']!= "" ) {
			update_post_meta( $post_id, '_myfieldtest', trim($_POST['myfieldtest']) );
		}
	}
	add_action( 'save_post', 'myfieldtest_save_meta_box' );
}

Espero te sirva, Saludos. Esto lo puedes añadir en el function.php de tu plantilla o en un plugin nuevo que realices.

- - - Actualizado - - -

No se si ya solucionastes pero te comparto un concepto básico:

Esto coloca el widget en el backend. Para personalizar buscar esta función en wordpress.

PHP:
if ( !function_exists('myfieldtest_myfieldtest_function') ) {
	function myfieldtest_myfieldtest_function() {
	    add_meta_box( 'myfieldtest-function-id', 'Campos Personalizados', 'myfieldtest_callback_function', 'post', 'normal', 'high' );
	}
	add_action( 'add_meta_boxes', 'myfieldtest_myfieldtest_function' );
}

Esta función añade los campos dentro del widget:
PHP:
if ( !function_exists('myfieldtest_callback_function') ) {
	function myfieldtest_callback_function( $post ) {
		$myfieldtest = get_post_meta( $post->ID, '_myfieldtest', true );
		$outline = '
			<table><tbody>
				<tr>
					<td scope="row">DATO X1</td>
					<td>
						<input type="text" name="myfieldtest" id="myfieldtest" value="'.$myfieldtest.'" />
					</td>
				</tr>
			</tbody></table>';
		echo $outline;
	}
}

Esta función te permite almacenar ese campo cuando guardas/actualiza dicha publicación:
PHP:
if ( !function_exists('myfieldtest_save_meta_box') ) {
	function myfieldtest_save_meta_box( $post_id ) {
		if ( isset($_POST['myfieldtest']) && $_POST['myfieldtest']!= "" ) {
			update_post_meta( $post_id, '_myfieldtest', trim($_POST['myfieldtest']) );
		}
	}
	add_action( 'save_post', 'myfieldtest_save_meta_box' );
}

Espero te sirva, Saludos. Esto lo puedes añadir en el function.php de tu plantilla o en un plugin nuevo que realices.
 
No se si ya solucionastes pero te comparto un concepto básico:

Esto coloca el widget en el backend. Para personalizar buscar esta función en wordpress.

PHP:
if ( !function_exists('myfieldtest_myfieldtest_function') ) {
	function myfieldtest_myfieldtest_function() {
	    add_meta_box( 'myfieldtest-function-id', 'Campos Personalizados', 'myfieldtest_callback_function', 'post', 'normal', 'high' );
	}
	add_action( 'add_meta_boxes', 'myfieldtest_myfieldtest_function' );
}

Esta función añade los campos dentro del widget:
PHP:
if ( !function_exists('myfieldtest_callback_function') ) {
	function myfieldtest_callback_function( $post ) {
		$myfieldtest = get_post_meta( $post->ID, '_myfieldtest', true );
		$outline = '
			<table><tbody>
				<tr>
					<td scope="row">DATO X1</td>
					<td>
						<input type="text" name="myfieldtest" id="myfieldtest" value="'.$myfieldtest.'" />
					</td>
				</tr>
			</tbody></table>';
		echo $outline;
	}
}

Esta función te permite almacenar ese campo cuando guardas/actualiza dicha publicación:
PHP:
if ( !function_exists('myfieldtest_save_meta_box') ) {
	function myfieldtest_save_meta_box( $post_id ) {
		if ( isset($_POST['myfieldtest']) && $_POST['myfieldtest']!= "" ) {
			update_post_meta( $post_id, '_myfieldtest', trim($_POST['myfieldtest']) );
		}
	}
	add_action( 'save_post', 'myfieldtest_save_meta_box' );
}

Espero te sirva, Saludos. Esto lo puedes añadir en el function.php de tu plantilla o en un plugin nuevo que realices.


PROBLEMA 1:

Perfecto me sirvio demasiado ahora te hago una consulta espero no abusar de vos como llamo este campo nuevo? y ademas como mostrarlo solamente en el caso de que este tenga contenido segun mire seria con lo siguiente :

PHP:
$micampo = get_post_meta($post->ID, 'nombre_custom_field', true);
    if (!empty($micampo)) 
    {  
    echo "El valor de mi campo es = " . $micampo;
    }

perdón por las preguntas soy nuevo en la parte de programación.
Y gracias por tu tiempo


-----------------

SOLUCIÓN A PROBLEMA 1:

Edito esto ya lo pude solucionar con lo que puse arriba modificando loos valores en rojo por los que estan en el codigo que me pasaste.

Inserir CODE, HTML ou PHP:
[COLOR="#0000FF"]$micampo[/COLOR] = get_post_meta($post->ID, '[COLOR="#FF0000"]nombre_custom_field[/COLOR]', true);
    if (!empty([COLOR="#0000FF"]$micampo[/COLOR])) 
    {  
    echo "El valor de mi campo es = " .[COLOR="#0000FF"] $micampo[/COLOR];
    }

lo que seria $micampo se puede cambiar por lo que se quiera. pero cambiar los 3 que estan marcados en AZUL.
De esta manera no se mostrara el contenido si no tiene ningun dato ingresado.

----------------

PROBLEMA 2: ( Sin solución por el momento )

El inconveniente que tengo es tratar de agregar mas campos teniendo la menor cantidad de código posible y no repetir "headers".


Trate de la siguiente manera :

PHP:
if ( !function_exists('myfieldtest2_callback_function') ) {
	function myfieldtest2_callback_function( $post ) {
		$myfieldtest2 = get_post_meta( $post->ID, '_myfieldtest2', true );
		$outline = '
			<table><tbody>
				<tr>
					<td scope="row">DATO X1</td>
					<td>
						<input type="text" name="myfieldtest" id="myfieldtest" value="'.$myfieldtest2.'" />
					</td>
				</tr>
			</tbody></table>';
		echo $outline;
	}
}

pero el mismo no se muestra lo que a hacer es agregar en la siguiente linea:

Inserir CODE, HTML ou PHP:
 Como esta: [COLOR="#0000FF"]add_meta_box( 'myfieldtest-function-id', 'Campos Personalizados', 'myfieldtest_callback_function', 'post', 'normal', 'high' );[/COLOR]
Como lo puse: [COLOR="#FF0000"]add_meta_box( 'myfieldtest-function-id', 'Campos Personalizados', 'myfieldtest_callback_function', 'myfieldtest2_callback_function', 'post', 'normal', 'high' );[/COLOR]

Pero tampoco funciono.

La solucion momentanea fue "agregar todo el codigo de vuelta con un "2" adelante de todo, pero... esto me genero otro "header" donde se repite "campos personalizados" y no es todo un bloque solo si no 2..
 
Última edição:
Me alegro te haya servido. En relación al punto #1:
Esta función: get_post_meta($post->ID, 'nombre_custom_field', true); en caso de que no tengas valores definidos en tu variable 'nombre_custom_field' devuelve "vacío" por lo que si vas a guardar un array en esa variable la validación:
PHP:
if (!empty($micampo)){...}
es correcta. Pero, si vas a guardar un valor que no es un array usa mejor esta validación:
PHP:
if ( $micampo != "" ){...}

Con respecto al punto #02 no entiendo mucho tu duda pero creo que lo que quieres es añadir mas campos a ese widget tal como aparece en tu ejemplo ¿correcto? de ser ese el caso te comento nuevamente:

Widget que creo tu lo llamas "header":
i
PHP:
f ( !function_exists('myfieldtest_myfieldtest_function') ) {
    function myfieldtest_myfieldtest_function() {
        add_meta_box( 'myfieldtest-function-id', 'Campos Personalizados', 'myfieldtest_callback_function', 'post', 'normal', 'high' );
    }
    add_action( 'add_meta_boxes', 'myfieldtest_myfieldtest_function' );
}

Campos dentro del widget:
PHP:
if ( !function_exists('myfieldtest_callback_function') ) {
    function myfieldtest_callback_function( $post ) {
        $datax1 = get_post_meta( $post->ID, '_datax1', true );
	$datax2 = get_post_meta( $post->ID, '_datax2', true );
	$datax3 = get_post_meta( $post->ID, '_datax3', true );
        $outline = '
            <table><tbody>
                <tr>
                    <td scope="row">DATO X1</td>
                    <td>
                        <input type="text" name="datax1" id="datax1" value="'.$datax1.'" />
                    </td>
                </tr>
                <tr>
                    <td scope="row">DATO X2</td>
                    <td>
                        <input type="text" name="datax2" id="datax2" value="'.$datax2.'" />
                    </td>
                </tr>
                <tr>
                    <td scope="row">DATO X3</td>
                    <td>
                        <input type="text" name="datax3" id="datax3" value="'.$datax3.'" />
                    </td>
                </tr>
            </tbody></table>';
        echo $outline;
    }
}

y por ultimo para guardar esos cambios:
PHP:
if ( !function_exists('myfieldtest_save_meta_box') ) {
    function myfieldtest_save_meta_box( $post_id ) {
        if ( isset($_POST['datax1']) && $_POST['datax1']!= "" ) {
            update_post_meta( $post_id, '_datax1', trim($_POST['datax1']) );
        }
        if ( isset($_POST['datax2']) && $_POST['datax2']!= "" ) {
            update_post_meta( $post_id, '_datax2', trim($_POST['datax2']) );
        }
        if ( isset($_POST['datax3']) && $_POST['datax3']!= "" ) {
            update_post_meta( $post_id, '_datax3', trim($_POST['datax3']) );
        }
    }
    add_action( 'save_post', 'myfieldtest_save_meta_box' );
}

Claro este es un ejemplo bastante básico. Tienes que hacer pruebas por si necesitas validar mas cosas como por ejemplo guardar información en blanco (que de momento no lo hace) y para hacerlo modifica donde dice $_POST['datax1']!= "" y los tipos de campos que manejes, etc.
No me dio chance de validar funcione ese código que te envié pero al menos te puede servir de idea 😉
 
Me alegro te haya servido. En relación al punto #1:
Esta función: get_post_meta($post->ID, 'nombre_custom_field', true); en caso de que no tengas valores definidos en tu variable 'nombre_custom_field' devuelve "vacío" por lo que si vas a guardar un array en esa variable la validación:
PHP:
if (!empty($micampo)){...}
es correcta. Pero, si vas a guardar un valor que no es un array usa mejor esta validación:
PHP:
if ( $micampo != "" ){...}

Con respecto al punto #02 no entiendo mucho tu duda pero creo que lo que quieres es añadir mas campos a ese widget tal como aparece en tu ejemplo ¿correcto? de ser ese el caso te comento nuevamente:

Widget que creo tu lo llamas "header":
i
PHP:
f ( !function_exists('myfieldtest_myfieldtest_function') ) {
    function myfieldtest_myfieldtest_function() {
        add_meta_box( 'myfieldtest-function-id', 'Campos Personalizados', 'myfieldtest_callback_function', 'post', 'normal', 'high' );
    }
    add_action( 'add_meta_boxes', 'myfieldtest_myfieldtest_function' );
}

Campos dentro del widget:
PHP:
if ( !function_exists('myfieldtest_callback_function') ) {
    function myfieldtest_callback_function( $post ) {
        $datax1 = get_post_meta( $post->ID, '_datax1', true );
	$datax2 = get_post_meta( $post->ID, '_datax2', true );
	$datax3 = get_post_meta( $post->ID, '_datax3', true );
        $outline = '
            <table><tbody>
                <tr>
                    <td scope="row">DATO X1</td>
                    <td>
                        <input type="text" name="datax1" id="datax1" value="'.$datax1.'" />
                    </td>
                </tr>
                <tr>
                    <td scope="row">DATO X2</td>
                    <td>
                        <input type="text" name="datax2" id="datax2" value="'.$datax2.'" />
                    </td>
                </tr>
                <tr>
                    <td scope="row">DATO X3</td>
                    <td>
                        <input type="text" name="datax3" id="datax3" value="'.$datax3.'" />
                    </td>
                </tr>
            </tbody></table>';
        echo $outline;
    }
}

y por ultimo para guardar esos cambios:
PHP:
if ( !function_exists('myfieldtest_save_meta_box') ) {
    function myfieldtest_save_meta_box( $post_id ) {
        if ( isset($_POST['datax1']) && $_POST['datax1']!= "" ) {
            update_post_meta( $post_id, '_datax1', trim($_POST['datax1']) );
        }
        if ( isset($_POST['datax2']) && $_POST['datax2']!= "" ) {
            update_post_meta( $post_id, '_datax2', trim($_POST['datax2']) );
        }
        if ( isset($_POST['datax3']) && $_POST['datax3']!= "" ) {
            update_post_meta( $post_id, '_datax3', trim($_POST['datax3']) );
        }
    }
    add_action( 'save_post', 'myfieldtest_save_meta_box' );
}

Claro este es un ejemplo bastante básico. Tienes que hacer pruebas por si necesitas validar mas cosas como por ejemplo guardar información en blanco (que de momento no lo hace) y para hacerlo modifica donde dice $_POST['datax1']!= "" y los tipos de campos que manejes, etc.
No me dio chance de validar funcione ese código que te envié pero al menos te puede servir de idea 😉

Muchas gracias! si lo logre hacer funcionar un poco mas largo el codigo pero lo hice funcionar, tuve un problema que no guardaba y era porque no modificaba el "ID" en el input y en el update tenia otro por eso no me guardaba pero ya lo pude hacer funcionar, por el momento utilice:

PHP:
$micampo = get_post_meta($post->ID, 'nombre_custom_field', true);
    if (!empty($micampo)) 
    {  
    echo "El valor de mi campo es = " . $micampo;
    }

y si no hay nada no muestra nada La verdad muchas gracias por tu tiempo bro!

En lo que te puda dar una mano me avisas por mp, mi fuerte es el diseño y sin problemas te doy una mano! 🙂! gracias nuevamente!
 
Muchas gracias! si lo logre hacer funcionar un poco mas largo el codigo pero lo hice funcionar, tuve un problema que no guardaba y era porque no modificaba el "ID" en el input y en el update tenia otro por eso no me guardaba pero ya lo pude hacer funcionar, por el momento utilice:

PHP:
$micampo = get_post_meta($post->ID, 'nombre_custom_field', true);
    if (!empty($micampo)) 
    {  
    echo "El valor de mi campo es = " . $micampo;
    }

y si no hay nada no muestra nada La verdad muchas gracias por tu tiempo bro!

En lo que te puda dar una mano me avisas por mp, mi fuerte es el diseño y sin problemas te doy una mano! 🙂! gracias nuevamente!

Genial! Muchas gracias e igual estamos a la orden por cualquier cosa de programación :encouragement: Saludos.
 
Voltar
Topo