--- a/cooked/cooked.php
+++ b/cooked/cooked.php
@@ -6,7 +6,7 @@
Description: A recipe plugin for WordPress.
Author: Gora Tech
Author URI: https://goratech.dev
-Version: 1.11.3
+Version: 1.11.4
Text Domain: cooked
Domain Path: languages
License: GPL2
@@ -30,7 +30,7 @@
require_once __DIR__ . '/vendor/autoload.php';
-define( 'COOKED_VERSION', '1.11.3' );
+define( 'COOKED_VERSION', '1.11.4' );
define( 'COOKED_DEV', false );
if ( ! class_exists( 'Cooked_Plugin' ) ) :
@@ -254,7 +254,7 @@
self::$instance->updates = new Cooked_Updates();
self::$instance->post_types = new Cooked_Post_Types();
self::$instance->recipe_meta = new Cooked_Recipe_Meta();
- self::$instance->recipe_meta = new Cooked_Measurements();
+ self::$instance->measurements = new Cooked_Measurements();
self::$instance->users = new Cooked_Users();
self::$instance->recipes = new Cooked_Recipes();
self::$instance->shortcodes = new Cooked_Shortcodes();
--- a/cooked/includes/class.cooked-ajax.php
+++ b/cooked/includes/class.cooked-ajax.php
@@ -351,7 +351,7 @@
}
if (isset($_cooked_settings['default_content'])) {
- $default_content = stripslashes($_cooked_settings['default_content']);
+ $default_content = wp_unslash($_cooked_settings['default_content']);
} else {
$default_content = Cooked_Recipes::default_content();
}
--- a/cooked/includes/class.cooked-delicious-recipes.php
+++ b/cooked/includes/class.cooked-delicious-recipes.php
@@ -104,7 +104,7 @@
}
if (isset($_cooked_settings['default_content'])) {
- $default_content = stripslashes($_cooked_settings['default_content']);
+ $default_content = wp_unslash($_cooked_settings['default_content']);
} else {
$default_content = Cooked_Recipes::default_content();
}
--- a/cooked/includes/class.cooked-functions.php
+++ b/cooked/includes/class.cooked-functions.php
@@ -20,7 +20,7 @@
private static $guest_message_id = false;
public static function sanitize_text_field( $text ) {
- $text = htmlentities( stripslashes( $text ) );
+ $text = htmlentities( wp_unslash( $text ) );
$text = sanitize_text_field( $text );
return $text;
}
--- a/cooked/includes/class.cooked-measurements.php
+++ b/cooked/includes/class.cooked-measurements.php
@@ -13,9 +13,9 @@
use NXPMathExecutor;
/**
- * Cooked_Recipe_Meta Class
+ * Cooked_Measurements Class
*
- * This class handles the Cooked Recipe Meta Box creation.
+ * This class handles the Cooked Measurements.
*
* @since 1.0.0
*/
--- a/cooked/includes/class.cooked-post-types.php
+++ b/cooked/includes/class.cooked-post-types.php
@@ -207,7 +207,8 @@
$parent_page_slug = ( isset($_cooked_settings['browse_page']) && $_cooked_settings['browse_page'] ? ltrim( untrailingslashit( str_replace( home_url(), '', get_permalink( $_cooked_settings['browse_page'] ) ) ), '/' ) : false );
- if (!empty($_GET['settings-updated'])) {
+ // Security check: Only allow settings update from admin area with proper permissions
+ if (!empty($_GET['settings-updated']) && is_admin() && current_user_can('manage_options') && isset($_GET['page']) && $_GET['page'] === 'cooked_settings') {
// Recipe Permalink
$permalink_parts = explode( '/', $_cooked_settings['recipe_permalink'] );
if ( isset( $permalink_parts[1] ) ):
--- a/cooked/includes/class.cooked-recipe-maker.php
+++ b/cooked/includes/class.cooked-recipe-maker.php
@@ -105,7 +105,7 @@
}
if (isset($_cooked_settings['default_content'])) {
- $default_content = stripslashes($_cooked_settings['default_content']);
+ $default_content = wp_unslash($_cooked_settings['default_content']);
} else {
$default_content = Cooked_Recipes::default_content();
}
--- a/cooked/includes/class.cooked-recipe-meta.php
+++ b/cooked/includes/class.cooked-recipe-meta.php
@@ -39,13 +39,17 @@
if (!is_array($val)) {
if ( $key === "content" || $key === "excerpt" || $key === "notes" ) {
if ($wp_editor_roles_allowed) {
- $_recipe_settings[$key] = wp_kses_post( $val );
+ // Decode HTML entities first so wp_kses_post can see actual HTML tags
+ $decoded_val = wp_specialchars_decode( $val, ENT_QUOTES );
+ $_recipe_settings[$key] = wp_kses_post( $decoded_val );
} else {
$_recipe_settings[$key] = Cooked_Functions::sanitize_text_field( $val );
}
} else {
if ($key === "post_title") {
- $_recipe_settings[$key] = wp_kses_post( $val );
+ // Decode HTML entities first so wp_kses_post can see actual HTML tags
+ $decoded_val = wp_specialchars_decode( $val, ENT_QUOTES );
+ $_recipe_settings[$key] = wp_kses_post( $decoded_val );
} else {
$_recipe_settings[$key] = Cooked_Functions::sanitize_text_field( $val );
}
@@ -57,9 +61,18 @@
} else {
foreach ( $subval as $sub_subkey => $sub_subval ) {
if ( !is_array($sub_subval) ) {
- if ( $sub_subkey == 'content' || $key == 'ingredients' && $sub_subkey == 'name' || $key == 'ingredients' && ($sub_subkey == 'section_heading_name' || $sub_subkey == 'section_heading_element') || $key == 'directions' && ($sub_subkey == 'section_heading_name' || $sub_subkey == 'section_heading_element') ) {
+ if (
+ // For content keys: allow 'content'
+ ($sub_subkey === 'content') ||
+ // For ingredients: allow 'name' and section heading fields
+ ($key === 'ingredients' && ($sub_subkey === 'name' || $sub_subkey === 'section_heading_name' || $sub_subkey === 'section_heading_element')) ||
+ // For directions: allow 'content' and section heading fields
+ ($key === 'directions' && ($sub_subkey === 'content' || $sub_subkey === 'section_heading_name' || $sub_subkey === 'section_heading_element'))
+ ) {
if ($wp_editor_roles_allowed) {
- $_recipe_settings[$key][$subkey][$sub_subkey] = wp_kses_post( $sub_subval );
+ // Decode HTML entities first so wp_kses_post can see actual HTML tags
+ $decoded_sub_subval = wp_specialchars_decode( $sub_subval, ENT_QUOTES );
+ $_recipe_settings[$key][$subkey][$sub_subkey] = wp_kses_post( $decoded_sub_subval );
} else {
$_recipe_settings[$key][$subkey][$sub_subkey] = Cooked_Functions::sanitize_text_field( $sub_subval );
}
@@ -129,7 +142,7 @@
global $recipe_settings;
/* OK, it's safe for us to validate/sanitize the data now. */
- $recipe_settings = isset($_POST['_recipe_settings']) ? self::meta_cleanup( $_POST['_recipe_settings'] ) : [];
+ $recipe_settings = isset($_POST['_recipe_settings']) ? self::meta_cleanup( wp_unslash( $_POST['_recipe_settings'] ) ) : [];
if ( isset( $recipe_settings['content'] ) ) {
$recipe_settings['content'] = str_replace( ["rn", "r"], "n", $recipe_settings['content'] );
@@ -352,7 +365,7 @@
<?php endif; ?>
<div class="recipe-setting-block cooked-bm-30">
- <?php $recipe_content = isset($recipe_settings['content']) ? stripslashes(wp_specialchars_decode($recipe_settings['content'])) : (isset($_cooked_settings['default_content']) ? stripslashes(wp_specialchars_decode($_cooked_settings['default_content'])) : Cooked_Recipes::default_content()); ?>
+ <?php $recipe_content = isset($recipe_settings['content']) ? wp_unslash($recipe_settings['content']) : (isset($_cooked_settings['default_content']) ? wp_unslash($_cooked_settings['default_content']) : Cooked_Recipes::default_content()); ?>
<?php
wp_editor($recipe_content, '_recipe_settings_content', [
'teeny' => false,
@@ -369,7 +382,7 @@
<h3 class="cooked-settings-title"><?php _e( 'Recipe Excerpt', 'cooked' ); ?><span class="cooked-tooltip cooked-tooltip-icon" title="<?php echo esc_attr( __( 'The excerpt is used on recipe listing templates, where the full recipe should not be displayed.','cooked') ); ?>"><i class="cooked-icon cooked-icon-question"></i></span></h3>
<p>
<?php if ( $wp_editor_roles_allowed ): ?>
- <?php $recipe_excerpt = isset($recipe_settings['excerpt']) ? stripslashes(wp_specialchars_decode($recipe_settings['excerpt'])) : ''; ?>
+ <?php $recipe_excerpt = isset($recipe_settings['excerpt']) ? wp_unslash($recipe_settings['excerpt']) : ''; ?>
<?php
wp_editor($recipe_excerpt, '_recipe_settings_excerpt', [
'teeny' => true,
@@ -429,7 +442,7 @@
<div class="recipe-setting-block cooked-bm-30">
<h3 class="cooked-settings-title"><?php _e( 'Recipe Notes', 'cooked' ); ?><span class="cooked-tooltip cooked-tooltip-icon" title="<?php echo __( 'The notes are displayed in the recipe.','cooked'); ?>"><i class="cooked-icon cooked-icon-question"></i></span></h3>
<?php if ( $wp_editor_roles_allowed ): ?>
- <?php $recipe_notes = isset($recipe_settings['notes']) ? stripslashes(wp_specialchars_decode($recipe_settings['notes'])) : ''; ?>
+ <?php $recipe_notes = isset($recipe_settings['notes']) ? wp_unslash($recipe_settings['notes']) : ''; ?>
<?php
wp_editor($recipe_notes, '_recipe_settings_notes', [
'teeny' => false,
--- a/cooked/includes/class.cooked-recipes.php
+++ b/cooked/includes/class.cooked-recipes.php
@@ -259,7 +259,7 @@
echo '<div class="cooked-srl-content">';
- echo '<div class="cooked-srl-title"><a href="' . esc_url( get_permalink($rid) ) . '">' . wp_kses_post( $recipe['title'] ) . '</a></div>';
+ echo '<div class="cooked-srl-title"><a href="' . esc_url( get_permalink($rid) ) . '">' . esc_html( $recipe['title'] ) . '</a></div>';
if ( in_array('author', $_cooked_settings['recipe_info_display_options']) && !$hide_author ):
echo '<div class="cooked-srl-author">';
--- a/cooked/templates/front/recipe-single.php
+++ b/cooked/templates/front/recipe-single.php
@@ -30,7 +30,7 @@
do_action( 'cooked_recipe_grid_before_name', $recipe );
- echo '<a href="' . esc_url( get_permalink( $recipe['id'] ) ) . '" class="cooked-recipe-card-title">' . wp_kses_post( $recipe_settings['title'] ) . '</a>';
+ echo '<a href="' . esc_url( get_permalink( $recipe['id'] ) ) . '" class="cooked-recipe-card-title">' . esc_html( $recipe_settings['title'] ) . '</a>';
do_action( 'cooked_recipe_grid_after_name', $recipe );
--- a/cooked/templates/front/recipe.php
+++ b/cooked/templates/front/recipe.php
@@ -29,7 +29,7 @@
$recipe_content = $wp_embed->autoembed( $recipe_content );
$recipe_content .= '<div id="cooked-fsm-' . intval( $recipe_id ) . '" class="cooked-fsm" data-recipe-id="' . intval( $recipe_id ) . '">';
$recipe_content .= do_shortcode( Cooked_Recipes::fsm_content() );
- $recipe_content .= '<div class="cooked-fsm-top">' . wp_kses_post( $recipe_settings['title'] ) . '<a href="#" class="cooked-close-fsm"><i class="cooked-icon cooked-icon-close"></i></a></div>';
+ $recipe_content .= '<div class="cooked-fsm-top">' . esc_html( $recipe_settings['title'] ) . '<a href="#" class="cooked-close-fsm"><i class="cooked-icon cooked-icon-close"></i></a></div>';
$recipe_content .= '<div class="cooked-fsm-mobile-nav">';
$recipe_content .= '<a href="#ingredients" data-nav-id="ingredients" class="cooked-fsm-nav-ingredients cooked-active">' . __( 'Ingredients', 'cooked' ) . '</a>';
$recipe_content .= '<a href="#directions" data-nav-id="directions" class="cooked-fsm-nav-directions">' . __( 'Directions', 'cooked' ) . '</a>';