{"id":228581,"date":"2022-10-23T11:15:00","date_gmt":"2022-10-23T08:15:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228581"},"modified":"2022-11-09T03:06:27","modified_gmt":"2022-11-09T00:06:27","slug":"usar-un-gancho-de-wordpress-para-actualizar-las-opciones","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/es\/usar-un-gancho-de-wordpress-para-actualizar-las-opciones\/","title":{"rendered":"Usar un gancho de WordPress para actualizar las opciones"},"content":{"rendered":"\n<p>Actualizar las opciones dentro del administrador de WordPress es simple, \u00bfverdad? Es cuesti\u00f3n de completar un campo de texto, marcar una casilla o cambiar un bot\u00f3n de opci\u00f3n y luego hacer clic en Guardar.<\/p>\n<p>Pero supongamos que necesita configurar un gancho que se activa y que tambi\u00e9n actualiza una opci\u00f3n secundaria relacionada cada vez que se activa una.<\/p>\n<p>Por ejemplo, dada una opci\u00f3n representada por una casilla de verificaci\u00f3n, digamos que desea establecer una opci\u00f3n en la base de datos siempre que la casilla de verificaci\u00f3n no est\u00e9 marcada y luego eliminarla cada vez que se establezca dicha opci\u00f3n.<\/p>\n<p><a href=\"https:\/\/developer.wordpress.org\/reference\/hooks\/update_option\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Hay una acci\u00f3n<\/a> espec\u00edfica para hacer esto que lo hace bastante f\u00e1cil.<\/p>\n<h2>Un gancho para actualizar las opciones<\/h2>\n<p>Antes de entrar en cualquier c\u00f3digo sobre c\u00f3mo hacer esto, diga que la opci\u00f3n de actualizaci\u00f3n dada se ha disparado. Una vez hecho, deber\u00e1 configurar una devoluci\u00f3n de llamada que se activa cada vez que se establece la opci\u00f3n.<\/p>\n<p>Adem\u00e1s de eso, existen las siguientes consideraciones:<\/p>\n<ol>\n<li>\u00bfSe activ\u00f3 la opci\u00f3n en cuesti\u00f3n?<\/li>\n<li>Si es as\u00ed, \u00bfestaba configurada la opci\u00f3n (asumiendo que era una casilla de verificaci\u00f3n)?<\/li>\n<li>Si no, \u00bftiene un plan sobre c\u00f3mo manejar ese caso?<\/li>\n<\/ol>\n<p>Suponiendo que se haya resuelto todo lo anterior, necesitar\u00e1 una funci\u00f3n para definir la acci\u00f3n y una funci\u00f3n que implemente la devoluci\u00f3n de llamada. En mi ejemplo, usar\u00e9 la programaci\u00f3n orientada a objetos, pero se puede hacer igual de bien en la programaci\u00f3n procedimental.<\/p>\n<p>En mi ejemplo, usar\u00e9 la programaci\u00f3n orientada a objetos, pero se puede hacer igual de bien en la programaci\u00f3n procedimental.<\/p>\n<h3>Un ejemplo<\/h3>\n<p>Digamos que tiene una opci\u00f3n llamada user_is_disguised, y tiene otro valor en la base de datos llamado user_is_superman.<\/p>\n<p>Siempre que user_is_disguised se establezca en yet, user_is_superman debe establecerse en false. Y luego, cuando user_is_disguised se establece en falso, user_is_superman debe establecerse en verdadero.<\/p>\n<p>En \u00faltima instancia, los valores se intercambian. Aqu\u00ed hay un ejemplo de c\u00f3mo hacerlo. Primero, <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1c3af0efb30c5ac8203ec225be6aa8c9#file-00-init-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">necesitamos configurar el gancho<\/a> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Initializes the defined actions.\n *\/\npublic function init() {\n\n  add_action(\n    'update_option',\n    array( $this, 'toggle_other_option' ),\n    10, 3\n  );\n}\n<\/code><\/pre>\n<p>Luego necesitamos <a href=\"https:\/\/gist.github.com\/tommcfarlin\/1c3af0efb30c5ac8203ec225be6aa8c9#file-01-toggle_other_option-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">implementar la funci\u00f3n<\/a> para intercambiar los valores:<\/p>\n<pre><code>&lt;?php\n\n\/**\n * If the given option_name is `user_is_disguised`, then toggles another option\n * in the database - `user_is_superman` - based on the specified values.\n *\n * @param string $option_name The name of the value being updated.\n * @param mixed  $old_value   The previous value of the option before updating it.\n * @param mixed  $new_value   The value of the option now that it's been updated.\n *\/\npublic function toggle_other_option( $option_name, $old_value, $new_value) {\n\n  \/\/ If 'user_is_disguised' is not being changed, then don't worry about it.\n  if (0 !== strcasecmp( $option_name, 'user_is_disguised')) {\n   return; \n  }\n\n  \/* If 'user_is_disguised' is being set, then remove the Superman value; otherwise,\n   * set it to true (but don't worry about autoloading it).\n   *\/\n  if ('1' === $new_value) {\n    delete_option( 'user_is_superman' );\n  } else {\n    update_option( 'user_is_superman', true, false );\n  }\n}\n<\/code><\/pre>\n<p>Y eso deber\u00eda solucionarlo.<\/p>\n<h2>Una nota sobre los argumentos<\/h2>\n<p>Tenga en cuenta que la devoluci\u00f3n de llamada acepta tres argumentos (que tambi\u00e9n se definen en la documentaci\u00f3n vinculada anteriormente). Estos son \u00fatiles en otras implementaciones menos artificiales.<\/p>\n<p>Pero quiz\u00e1s una de las cosas m\u00e1s importantes que se deben quitar del c\u00f3digo anterior es que verifique el nombre de la opci\u00f3n en la devoluci\u00f3n de llamada antes de alternar cualquier valor.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fuente de grabaci\u00f3n:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Actualizar las opciones dentro del administrador de WordPress es f\u00e1cil, pero \u00bfqu\u00e9 sucede si desea actualizar una segunda opci\u00f3n relacionada cada vez que se alterna otra?<\/p>\n","protected":false},"author":1,"featured_media":168014,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[892,716,747,914,861],"tags":[1172],"class_list":["post-228581","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo","category-desarrollador","category-fuente-abierta","category-otro","category-wordpress-2","tag-affiai-es"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228581","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/comments?post=228581"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/posts\/228581\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media\/168014"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/media?parent=228581"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/categories?post=228581"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/es\/wp-json\/wp\/v2\/tags?post=228581"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}