Mostrar campos personalizados al editar publicaciones en WP

  • Autor Autor Baires23
  • Fecha de inicio Fecha de inicio
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 edición:
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.

Insertar CODE, HTML o 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:

Insertar CODE, HTML o 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 edición:
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.
 
Atrás
Arriba