Trápim sa s meta-boxom pre wordpress. Problém je v tom, že wordpress zachováva / ukladá iba niektoré z hodnôt, ktoré zadávam do polí .. Ani ja nemôžem nájsť vzor .. takže tu je kód:
<?php
function add_products_metaboxes() {
add_meta_box("sra_product_info", "Product Information", "sra_products_info", "product", "side", "default");
}
// The Productinfo Metabox
function sra_products_info() {
//get access to the post object
global $post;
// Noncename needed to verify where the data originated
echo "<input type="hidden" name="productmeta_noncename" id="productmeta_noncename" value="" .
wp_create_nonce( plugin_basename(__FILE__) ) . "" />";
// Get the data from the field if its already been entered
$name = get_post_meta($post->ID, "_name", true);
$price = get_post_meta($post->ID, "_price", true);
$includes = get_post_meta($post->ID, "_includes", true);
$supports = get_post_meta($post->ID, "_supports", true);
$version = get_post_meta($post->ID, "_version" , true);
$extrainfo = get_post_meta($post->ID, "_extrainfo", true);
// Echo out the form
echo "<form>";
echo "<label for="_name">Name</label>" . "<input type="text" name="_name" value="" . $name . ""/>";
echo "<label for="_price">Price</label>" . "<input type="text" name="_price" value="" . $price . ""/>";
echo "<label for="_includes">Includes</label> <textarea name="_includes" rows="4" cols="10">" . $includes . "</textarea>";
echo "<label for="_supports">Supports</label> <input type="text" name="_supports" value="" . $supports . ""/>";
echo "<label for="_version">Version</label>" . "<input type="text" name="_version" value="" . $version . ""/>";
echo "<label for="_extrainfo">Extras</label> <textarea name="_extrainfo" rows="4" cols="10">" . $extrainfo . "</textarea>";
echo "</form>";
}
// Save the Metabox Data
function sra_save_product_meta($post_id, $post) {
// verify this came from the our screen and with proper authorization,
// because save_post can be triggered at other times
if ( !wp_verify_nonce( $_POST["productmeta_noncename"], plugin_basename(__FILE__) )) {
return $post->ID;
}
// Is the user allowed to edit the post or page?
if ( !current_user_can( "edit_post", $post->ID ))
return $post->ID;
// OK, we"re authenticated: we need to find and save the data
// check if the field exists in the posts array - if it does, then put cintent in $product_meta.
// this code needs to be refactored!
if (isset($_POST["_name"])) {
$product_meta["_name"] = $_POST["_name"];
}
if (isset($_POST["_price"])) {
$product_meta["_price"] = $_POST["_price"];
}
if (isset($_POST["_includes"])) {
$product_meta["_includes"] = $_POST["_includes"];
}
if (isset($_POST["_supports"])) {
$product_meta["_supports"] = $_POST["_supports"];
}
if (isset($_POST["_version"])) {
$product_meta["_version"] = $_POST["_version"];
}
if (isset($_POST["_extrainfo"])) {
$product_meta["_extrainfo"] = $_POST["_extrainfo"];
}
// Add values of $prpduct_meta as custom fields
foreach ($product_meta as $key => $value) { // Cycle through the $product_meta array!
if( $post->post_type == "revision" ) return; // Don"t store custom data twice
$value = implode(",", (array)$value); // If $value is an array, make it a CSL (unlikely)
if(get_post_meta($post->ID, $key, FALSE)) { // If the custom field already has a value
update_post_meta($post->ID, $key, $value);
} else { // If the custom field doesn"t have a value
add_post_meta($post->ID, $key, $value);
}
if(!$value) delete_post_meta($post->ID, $key); // Delete if blank
}
}
add_action("save_post", "sra_save_product_meta", 1, 2); // save the custom fields
Vidíte nejaké zjavné chyby? Myslím, že som trochu zaslepený voči svojim vlastným chybám v tomto kóde.
odpovede:
0 pre odpoveď č. 1Všeobecne by som odporúčal používať predvoľby pre názvy polí. Hodnoty ako _name
máte príliš veľa šancí dostať sa do konfliktu s inými hodnotami s rovnakým menom inde. Použite veci ako _product_name
, atď.Môžete to vyskúšať? Ak váš kód funguje so stránkami, malo by to mať vplyv. A prečo nepridať 4. parameter s hodnotou „true“ do add_post_meta () a predchádzajúcu hodnotu pre update_post_meta ()? Prečítajte si kódex WordPress o týchto funkciách: http://codex.wordpress.org/Function_Reference/add_post_meta. Takže by to išlo:
if(get_post_meta($post->ID, $key, FALSE)) { // If the custom field already has a value
update_post_meta($post->ID, $key, $value, /***OLDVALUE***/ ); // See http://codex.wordpress.org/Function_Reference/update_post_meta for old value
} else { // If the custom field doesn"t have a value
add_post_meta($post->ID, $key, $value, true);
}
Myslím si, že je zrejmé, že máte konflikt smetakey s rovnakým menom. Nie na stránkach, ale v príspevkoch. Skúste teda použiť tento štvrtý parameter, aby ste sa ubezpečili, že odkazujete na jedinečný kľúč (a podľa mojich odporúčaní stále používajte jasné predpony, aby ste sa odlíšili od všetkého iného, či už ide o doplnky, jadro atď.)