我正在更改我博客的当前主题,我希望在所有输入字段中添加一个类。
我不熟悉正则表达式代码,所以每当我需要做出类似这样的事情时,我就会遇到很多麻烦。
我想添加课程btn
需要添加到<input type="submit">
旧代码
<input type="submit" id="some_id" name="something" class="some_class" value="some_value" />
新代码
<input type="submit" id="some_id" name="something" class="btn some_class" value="some_value" />
同样,我希望将课程input
添加到<input type="text">
和<input type="textarea">
旧代码
<input type="text" id="some_id" name="something" class="some_class" value="some_value" />
<textarea id="some_id" name="something" class="some_class" value="some_value" />
新代码
<input type="text" id="some_id" name="something" class="input some_class" value="some_value" />
<textarea id="some_id" name="something" class="input some_class" value="some_value" />
答案 0 :(得分:4)
鉴于您的约束,您可以使用PHP以最简单的方式使用PHP并使用DOMDocument。虽然依靠正则表达式是可能的,但它非常草率,你可能会遇到比你开始时更多的问题。
将它放在你的functions.php文件中,它应该做你需要的一切:
add_filter('the_content', 'add_text_input_classes', 20);
function add_text_input_classes($content)
{
$doc = new DOMDocument(); //Instantiate DOMDocument
$doc->loadHTML($content); //Load the Post/Page Content as HTML
$textareas = $doc->getElementsByTagName('textarea'); //Find all Textareas
$inputs = $doc->getElementsByTagName('input'); //Find all Inputs
foreach($textareas as $textarea)
{
append_attr_to_element($textarea, 'class', 'input');
}
foreach($inputs as $input)
{
$setClass = false;
if($input->getAttribute('type') === 'submit') //Is the input of type submit?
$setClass = 'btn';
else if($input->getAttribute('type') === 'text') //Is the input of type text?
$setClass = 'input';
if($setClass)
append_attr_to_element($input, 'class', $setClass);
}
return $doc->saveHTML(); //Return modified content as string
}
function append_attr_to_element(&$element, $attr, $value)
{
if($element->hasAttribute($attr)) //If the element has the specified attribute
{
$attrs = explode(' ', $element->getAttribute($attr)); //Explode existing values
if(!in_array($value, $attrs))
$attrs[] = $value; //Append the new value
$attrs = array_map('trim', array_filter($attrs)); //Clean existing values
$element->setAttribute($attr, implode(' ', $attrs)); //Set cleaned attribute
}
else
$element->setAttribute($attr, $value); //Set attribute
}
答案 1 :(得分:2)
如果我正确理解您的问题,您希望动态地将类应用于输入元素。您需要使用的是过滤器或一系列过滤器。
首先让我解释过滤器的工作原理。过滤器使用'hooks'就像Actions一样。有关详细信息,请参阅Actions and Filters codex页面。
听起来你想使用钩子来添加这个btn
类,而无需手动更改每个输入。这不是钩子如何工作。要使用钩子你会使用过滤器,这意味着你需要写...
<input type="submit" class="<?php echo apply_filters('input_class', 'some-default-class'); ?>" />
然后,您就可以在'input_class'标记中添加过滤器。
add_filter('input_class', 'btn_class_filter');
function btn_class_filter($default){
return 'btn';
}
无论函数返回什么,都会替换默认值 - 在这种情况下,'some-default-class'将替换为'btn'。
但是,这些都不需要为要添加类的每个输入字段添加代码。唯一的方法是通过javascript,最容易使用jQuery。我知道你说你不想使用jQuery,但如果你不想编辑标记,这是你唯一的选择。
最简单的方法是手动添加btn
类 - 如果是访问问题,jQuery将是最佳选择。
答案 2 :(得分:0)
如果你只是将毯式样式规则应用于这些元素并且不关心IE6支持,为什么不在CSS中使用属性选择器,例如
.btn, input[type="submit"] {
/* styles for buttons */
}
.input, input[type="text"], textarea {
/* styles for text inputs and textareas */
}
仅供参考,没有<input type="textarea">
,只有<textarea>
使用钩子操纵标记将是耗时且笨拙的。您需要获取所有模板输出以及插件生成的标记。我建议不要尝试这个,Wordpress代码很麻烦。
答案 3 :(得分:-2)
我在上面回答说,我只是编辑那个,但已经收到了投票,这个答案会有很大不同。
在我的初步答案中发表一些评论之后,我意识到@Aniket想要更改的输入字段不在内容中,它们是整个网站中的元素,例如小部件和模板本身。
无法通过挂钩,操作或过滤器来修改主题模板中编写的代码。过滤器可以修改字符串和值,但仅限于已有可用的挂钩才能执行此操作。你没有这个,所以不可能。在不编辑输入字段的情况下动态添加此类的唯一选择是使用javascript。然而,由于两个原因,这是毫无意义的。
您无需在输入字段中添加'input'
类。
CSS允许您按标签名称选择元素,例如,如果您想选择任何div,则不需要为每个div添加".div"
类。您可以通过简单地使用"div"
而不使用任何类或ID表示法来选择所有div。
这同样适用于textareas。你说你想在textareas,文本字段和提交按钮中添加input
类,但这不是必需的。您可以使用CSS attribute selectors选择所有这些内容。在这种情况下,我们将指定输入字段,其中包含属性submit,text和textarea元素,而不是您要添加的两个类。
使用...
,而不是添加.btn类来提交按钮input[type="submit"] {
/* Your styles */
}
而不是将.input类添加到文本字段和textareas中使用...
textarea, input[type="text"] {
/* Your styles */
}
或者,如果您只想要所有输入字段,而不仅仅是文本区域和文本字段...
input {
/* Your styles */
}
即使您通过javascript执行此操作,您最终也必须使用此类CSS选择来选择这些元素,并且您可能执行的任何正则表达式都会比这些简单的行复杂得多。