web-dev-qa-db-fra.com

wp_editor ne sauvegarde pas les données et zone de texte affichant les balises HTML

Ceci est ma boîte méta personnalisée, ici la zone de texte montrant les balises html. J'ai utilisé l’éditeur tinymc textaea. et j'essaie d'utiliser wp_editor aussi. mais les données ne sont pas sauvegardées.Si elle est sauvegardée, je ne sais pas comment l'appeler. aidez-moi s'il vous plaît à trouver la solution



<?php
add_action("admin_init", "admin_init");
    add_action('save_post', 'save_points');
    function admin_init(){
    add_meta_box("productInfo-meta", "Product Details", "product_meta_options", "product", "normal", "low");}

    function product_meta_options(){
        global $post;
        $custom = get_post_custom($post->ID);
        $category = $custom["category"][0];
        $brand = $custom["brand"][0];
        $features = $custom["features"][0];
        $holds = $custom["holds"][0];
?>
<table>
    <tr>
        <td>Category
        <td> <input type="text" size="100" name="category" value="<?php echo $category; ?>" /> </td>
    </tr>
    <tr>
        <td>Brand
        <td> <input type="text" size="100" name="brand" value="<?php echo $brand; ?>" /> 
    </tr>
    <tr>
        <td>Features</td>
        <td><textarea rows="20" cols="100" name="features"><?php echo $features; ?>
    </tr>
    <tr>
        <td></td>
        <td>
        <?php wp_editor( $content, 'test_content', $settings = array('textarea_name'=>'test_content','textarea_rows'=>20) );?>
        </td>
    </tr>
    <tr>
        <td>Holds
        <td><textarea rows="20" cols="100" name="holds"><?php echo $holds; ?></td>
    </tr>
</table>

<?php
}

function save_points(){
    global $post;
    update_post_meta($post->ID, "category", $_POST["category"]);
    update_post_meta($post->ID, "brand", $_POST["brand"]);
    update_post_meta($post->ID, "features", $_POST["features"]);
    update_post_meta($post->ID, "holds", $_POST["holds"]);
}?>

1
Shihab Malayil

Il y a un certain nombre de choses qui ne vont pas dans votre code. J'ai dû l'installer pour les voir tous.

First, vous ne voulez pas global $post. save_post passera l'ID de poste. Ajouter un paramètre à votre rappel.

function save_points($post_id){
    update_post_meta($post_id, "category", $_POST["category"]);
    update_post_meta($post_id, "brand", $_POST["brand"]);
    update_post_meta($post_id, "features", $_POST["features"]);
    update_post_meta($post_id, "holds", $_POST["holds"]);
}

Remarque: cela ne fait que transmettre l’ID de publication, et non l’objet entier de publication. Si vous aviez besoin de tout l'objet (ce que vous n'avez pas fait), vous pouvez demander un deuxième paramètre.

Second, des lignes comme celle-ci - $brand = $custom["brand"][0];-- déclenchent des notifications. Vous devriez vérifier la clé avant d'essayer de l'utiliser.

$brand = (!empty($custom["brand"][0]) ? $custom["brand"][0] : '';

Third, qui résout les problèmes potentiels liés à des lignes telles que celle-ci: <td><textarea rows="20" cols="100" name="features"><?php echo $features; ?>-- en définissant la valeur echoing sur quelque chose.

Fourth, vous avez un certain nombre de tags <td> non fermés causant un balisage très endommagé.

Fifth, wp_editor, éventuellement l'instance par défaut, ne semble pas aimer textareas créé manuellement. Je ne connais pas de solution de contournement, mais il y en a peut-être une. J'aimerais savoir si quelqu'un a une solution. Entre-temps, utiliser wp_editor pour tous les textareas semble fonctionner.

Sixth, voir cette réponse pour les problèmes concernant ce que vous faites si vous utilisez moins que WordPress 3.5 (cela me semble).

Seventh, en enregistrant les clés au fur et à mesure de l'affichage de vos champs méta dans la zone des champs méta par défaut. Enregistrez vos champs avec un trait de soulignement.

Huit, vous n'avez pas du tout sauvegardé votre contenu du wp_editor dans votre code d'origine.

Nine, vous ne récupériez pas votre contenu non plus.

Ten, vous exécutez ce code pour toutes les sauvegardes de publication, pas seulement pour votre type de publication personnalisé.

Eleven,vous voulez probablement vérifier que vous ne traitez pas de post-révision, comme dans cet exemple tiré du Codex .

Twelve, vous feriez bien de désinfecter vos données POST avant de les transférer dans la base de données. POST data n'est pas sûr . Bien que vous ne puissiez pas le voir dans l'URL, vous devez modifier trivial .

Mettez tout cela ensemble, à l'exception de la validation des données que je vous laisserai puisqu'il s'agit déjà d'une réponse marathon:

add_action("admin_init", "admin_init");
add_action('save_post', 'save_points', 1, 2);
function admin_init(){
  add_meta_box("productInfo-meta", "Product Details", "product_meta_options", 'product', "normal", "low");
}

function product_meta_options(){
  global $post;
  $custom = get_post_custom($post->ID);
  $category = (!empty($custom["_category"][0])) ? $custom["_category"][0] : '';
  $brand = (!empty($custom["_brand"][0])) ? $custom["_brand"][0]  : '';
  $features = (!empty($custom["_features"][0])) ? $custom["_features"][0]  : '';
  $holds = (!empty($custom["_holds"][0])) ? $custom["_holds"][0]  : '';
  $content = (!empty($custom["_custom_content"][0])) ? $custom["_custom_content"][0]  : '';
?>
<table>
    <tr>
        <td>Category
        <td> <input type="text" size="100" name="category" value="<?php echo $category; ?>" /> </td>
    </tr>
    <tr>
        <td>Brand
        <td> <input type="text" size="100" name="brand" value="<?php echo $brand; ?>" /> </td>
    </tr>
    <tr>
        <td>Features</td>
        <td><?php wp_editor( $features, 'features', $settings = array('textarea_rows'=>20) ); ?></td>
    </tr>
    <tr>
        <td>Content</td>
        <td>
        <?php wp_editor( $content, 'custom_content', $settings = array('textarea_rows'=>20) );?>
        </td>
    </tr>
    <tr>
        <td>Holds</td>
        <td><?php wp_editor( $holds, 'holds', $settings = array('textarea_rows'=>20) ); ?></td>
    </tr>
</table>

<?php
}

function save_points($postid,$post){
  global $_POST;
  // set the ID to the parent post, not the revision
  $postid = (wp_is_post_revision( $postid )) ? wp_is_post_revision( $post ) : $postid;
  $post_type = get_post_type( $postid );
  if ('product' == $post_type) {
    update_post_meta($postid, "_category", $_POST["category"]);
    update_post_meta($postid, "_brand", $_POST["brand"]);
    update_post_meta($postid, "_features", $_POST["features"]);
    update_post_meta($postid, "_holds", $_POST["holds"]);
    update_post_meta($postid, "_custom_content", $_POST["custom_content"]); // save the data
  }
}
2
s_ha_dum