From 925dd492771b12c3168f863ff1eec060ab2ba9f0 Mon Sep 17 00:00:00 2001 From: Timmy Willison Date: Wed, 28 Jun 2023 10:36:38 -0400 Subject: [PATCH] All: upgrade relevanssi plugin to 3.6.2.2 - this also fixes an error deploying some sites when WP_LANG in stopwords.php was not defined globally.: --- mu-plugins/relevanssi/LICENSE | 674 +++++++++ mu-plugins/relevanssi/README.md | 18 + mu-plugins/relevanssi/delete.png | Bin 0 -> 715 bytes mu-plugins/relevanssi/facebooklogo.jpg | Bin 0 -> 14311 bytes mu-plugins/relevanssi/lib/cache.php | 77 - mu-plugins/relevanssi/lib/common.php | 529 +++++-- .../relevanssi/lib/excerpts-highlights.php | 479 +++--- mu-plugins/relevanssi/lib/indexing.php | 345 +++-- mu-plugins/relevanssi/lib/init.php | 84 +- mu-plugins/relevanssi/lib/interface.php | 469 +++--- mu-plugins/relevanssi/lib/search.php | 1101 +++++++++----- mu-plugins/relevanssi/lib/shortcodes.php | 4 +- mu-plugins/relevanssi/lib/stopwords.php | 4 +- mu-plugins/relevanssi/lib/uninstall.php | 10 +- mu-plugins/relevanssi/readme.txt | 486 +++--- mu-plugins/relevanssi/relevanssi-cz_CZ.mo | Bin 0 -> 29747 bytes mu-plugins/relevanssi/relevanssi-cz_CZ.po | 748 +++++++++ mu-plugins/relevanssi/relevanssi-de_DE.mo | Bin 0 -> 30997 bytes mu-plugins/relevanssi/relevanssi-de_DE.po | 451 +++--- mu-plugins/relevanssi/relevanssi-fr_FR.mo | Bin 0 -> 45145 bytes mu-plugins/relevanssi/relevanssi-fr_FR.po | 1347 +++++++++++------ mu-plugins/relevanssi/relevanssi-it_IT.mo | Bin 0 -> 12935 bytes mu-plugins/relevanssi/relevanssi-pl_PL.mo | Bin 0 -> 42153 bytes mu-plugins/relevanssi/relevanssi-pt_BR.mo | Bin 0 -> 20931 bytes mu-plugins/relevanssi/relevanssi-ro_RO.mo | Bin 0 -> 39865 bytes mu-plugins/relevanssi/relevanssi-ru_RU.mo | Bin 0 -> 38461 bytes mu-plugins/relevanssi/relevanssi.php | 198 +-- mu-plugins/relevanssi/relevanssi.po | 956 ++++++++++-- .../relevanssi/stopwords/stopwords.cs_CZ | 327 ++++ .../relevanssi/stopwords/stopwords.de_DE | 2 +- .../relevanssi/stopwords/stopwords.en_GB | 6 +- .../relevanssi/stopwords/stopwords.en_US | 6 +- mu-plugins/relevanssi/stopwords/stopwords.fi | 2 +- .../relevanssi/stopwords/stopwords.fr_FR | 2 +- .../relevanssi/stopwords/stopwords.pl_PL | 2 +- .../relevanssi/stopwords/stopwords.ru_RU | 2 +- mu-plugins/relevanssi/uninstall.php | 5 +- 37 files changed, 6030 insertions(+), 2304 deletions(-) create mode 100644 mu-plugins/relevanssi/LICENSE create mode 100644 mu-plugins/relevanssi/README.md create mode 100644 mu-plugins/relevanssi/delete.png create mode 100644 mu-plugins/relevanssi/facebooklogo.jpg delete mode 100644 mu-plugins/relevanssi/lib/cache.php create mode 100644 mu-plugins/relevanssi/relevanssi-cz_CZ.mo create mode 100644 mu-plugins/relevanssi/relevanssi-cz_CZ.po create mode 100644 mu-plugins/relevanssi/relevanssi-de_DE.mo create mode 100644 mu-plugins/relevanssi/relevanssi-fr_FR.mo create mode 100644 mu-plugins/relevanssi/relevanssi-it_IT.mo create mode 100644 mu-plugins/relevanssi/relevanssi-pl_PL.mo create mode 100644 mu-plugins/relevanssi/relevanssi-pt_BR.mo create mode 100644 mu-plugins/relevanssi/relevanssi-ro_RO.mo create mode 100644 mu-plugins/relevanssi/relevanssi-ru_RU.mo create mode 100644 mu-plugins/relevanssi/stopwords/stopwords.cs_CZ diff --git a/mu-plugins/relevanssi/LICENSE b/mu-plugins/relevanssi/LICENSE new file mode 100644 index 00000000..9cecc1d4 --- /dev/null +++ b/mu-plugins/relevanssi/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/mu-plugins/relevanssi/README.md b/mu-plugins/relevanssi/README.md new file mode 100644 index 00000000..f05cecca --- /dev/null +++ b/mu-plugins/relevanssi/README.md @@ -0,0 +1,18 @@ +# Relevanssi +Relevanssi replaces the standard WordPress search with a better search engine, with lots of features and configurable options. You’ll get better results, better presentation of results – your users will thank you. + +This is the free version of Relevanssi. There’s also Relevanssi Premium, which has added features, including Multisite support. This free version does not work properly on Multisite. For more information about Premium, see [Relevanssi.com](https://www.relevanssi.com/). + +For more information, also see [Relevanssi plugin page at WordPress.org](https://wordpress.org/plugins/relevanssi/). + +# Installation +The easiest way to install is using the WordPress plugin install tools: go to Plugins, choose Add new, search for "Relevanssi" and install. + +# FAQ +For FAQ, see [Relevanssi plugin page](https://wordpress.org/plugins/relevanssi/). + +# Support +For support, post to the [Relevanssi support forum](https://wordpress.org/support/plugin/relevanssi). + +# Translations +Relevanssi translations are handled by the [WordPress translations system](https://translate.wordpress.org/projects/wp-plugins/relevanssi). diff --git a/mu-plugins/relevanssi/delete.png b/mu-plugins/relevanssi/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..08f249365afd29594b51210c6e21ba253897505d GIT binary patch literal 715 zcmV;+0yO=JP)C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(<@x7jghg9OTS^;mJ8T{oIOsMnG zla8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/mu-plugins/relevanssi/facebooklogo.jpg b/mu-plugins/relevanssi/facebooklogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac1ad17a1ddedc49c58ab2ac7a48d999ad40158c GIT binary patch literal 14311 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 z zf$tvpf8>F>#ZFucljvMn$~50&^@Pu&w4~(3nE1}o?uCq$3qrkqYMr$$<-$^}t z^=32Az`m(9Y~;cYsa#>yC#1v>n|lbpq1eR76oFS?u(tc|l4aYkEHEyK&92G#mro~! z-T>QkSQ7B_m9Sz7_!z*|xh6e9C$_s>(+3hbh1lqFHGqMDdk}c01rH#3EOYi! z8Kn?5>y;WMfgc8Z!r&ZY$CTO`@Nt7xcrM@<0B@nr(Wn3?w%T1axEywIX~b4q3lpx$ z0-OUl%aEEZ1H3(KN3t^O;pz2o6Kq`qFOuo>L&(iMb}L0|Sm~8Y*l~ES8aJ5&lVAl} zZcxJdutqP}4uPLKkaZ?XA?Lq*sFGw0_{Yq8eE)7gyt*&GpO}8Aj z`{8E|)aiA!^aThNk44DiS{<#$Qdr_2gV2t%_3GnJ#7n(}YZa~tA{<(KeUqV<^Y4** z`hp03wIBKHD9he2n}})!?B(Vd*hXT}haLFmApVaF)-$V~9RctmgBx&I31xSOD1*-d zXl|{NT)bkdv<;Rb>Ph$yi`A1rpq97>#AW3dhn{G=3!O!;fJckSp>;O_48Z z1)I-2Bu4E}IEqFcQ6fr3y-(#y1iuMnVs@Ad=7}}KT4HT69wxy$V9{7-EE(&C4Zt!n zEtZ1~!+yXfV>7WrY#Fu|`vu#D9mI}frPx*MF7^a_ja5>p6c)vm(uCqi38qLW5tL4p zR7yWeCS?#MpE8Crl`@~QoU(zkgL05^l5&x9hw_Y40Y7ZDrMgp_Qv<0Is*IXQ?M=;~ z8mJ?vlc;m4%c+~FyQxR1Wz;*=Kd2vR44Mm#O$(&8qs7s>(G;{nv=Ou^v_je%+78-b zS{dywt(^9SZb$c~x21>B<%xIQm@rD*AT%5&A{?1Nu7#gW=BbXNVbbj9!dv z#!$u-#$v{1#sNkt<36K;$z*ym+cHC$iA*`u#2m+5z}&#x&pgk3!2DokYt_t(XBA`B z+e&LS+G?)VI;(wF=dB)DeX@46ZfPB2ooKDJ9%4PsdZqPl>$BDmtUuW}+4$Rp+N9cK z+l;cAZ?nnfh|LX~H@3F6KDJWZuC^-Mk+$<~f3`hld)M|O%bC@NC1dqv<*=r*RPEGuchGTWeQhcgyaBy^DR2eZ0NWzQBH={SN!{_AeZ)9a=g>IP`bO zcbMz2)#0qeACA_JevUFnx#I}Og^s%%FFRH^xj1p15}htxrBu4i1!-JIP7Zr$DT+!ng+ zb-UwEb@y|RcUQYlbKl~A$-S~slSUDZ@J16GZEAGB(R+`^9^oFi$0U!<9v3|-J=vbo zo&!B+couu!^rCsS@#^Z8>$Sw|h}R#DT^qM+tY|!`@s`HdyeZyoypz3$dav+4`ENN6#v#rhW4T3WZ1w9INb zujSE}@BRG!diag^EB1Tr@8KWspYOlk|3)jjR$;9MwOZclLTg5AN$Y{F7q>pwhSEmZ zCacZDHfP&X+KSq$+AeNe8bF72SZ%=afXjibz=*)Xf$IbB2Dt}y4jLU)9P}c%MR4!n z8No+`zi@;cHD@K~I@g)okvp2ZoBNvAhNs{yA*PTmAurnnwj0=P zUAxEa{oCX1SGK<&>JustT^4$$1G~e34of@S32PoE4_h8~FWfg=8NMp~QAF#A?1&8! zFCsaShRE%a?`0vf;j#l!)Tr2~Nl|B_ouj)&7e?QT@rlWdSszm#D~uf)dmxS;*C}pB z+~xQt@rwAh@#P)G9fx;3+=3zh7Rz50afxu`Eq$hdVKn#^m2tvF;DSK8LphIe1eDKGx0|mp&2tX z9%qJT&dPj}6_zzO>kpMoRj7KE9hY5{{eEELz|{lI>K^LN8Y|5J%`UC8cA)mKuBk3h zSE_HTAE&=FC}hx_LFI-{hE+z)*w47r<{W!z8%j4UPFPcD`pqg-IB7fq7iC-ouC!Ltg znLKxL)fB~)6F+i)od2VFYR1$v(?rvjOlM5jPQNrGY{r_IPBZgo-k+5)YsYN%>`AlV z&Pkhde6C<_(L9@ZIrHw!?>v9!f))#=FQ_WaD!jNba^dDh-iszKdcRn?`23RaC7X(x z6iqIwT&h}nWm)X99n1Ze&t1V-F?hwpmEBh!{YmoE+ErewCa?OuTD$trn&dTy*NWG! zUFW@S+Iq_Rob^vO^xbf7W7Ni-n*uj2+w8u1^3Uk!oS&cmGT@g>TRLqyv{kZo)3%n| z7HxOgK4}NGW5|y3;;iC3JA3Uc-PLi|q229vZ~ryu*VTKP?^(FlZSS;wHv7ixGw;ve zUvWTx;E#iu2k#$BJ9NFIXUT=bT@Rl*(&@;t-(r3%IT~?v|FO_xdya=3-*rNAqWGlf z7{O$u3YYW z`OX#PmB&}rS6^KleC^ZqkvHf!Cf#(rIrow2{-`;#jbZ76~sJo}`rQExIUvdB0 z@5bM&9*lWt_i*l`W{=iB<~`o?B<9Jvr+uD2c&2~$>5p;Got`gx(dxyvm*Fo@mG>-v z@XGMY{Cdh8&o`^z3f>;7NUFH?PV?^5`$-=>KdkvE`FOOlN9ChWxmC=n`JY>V-u<_wk#VPTN@jeqvc3J^}~|*GsIww zvt!wLI68X#*QX5NXZdxf3>a|A0H(EwS^tm$qS2`o28OCn8Bi$H`ne5%GDg9u#3=&? zlL~-h#3)oJ8luB7gNUvS7dad=aOKTd#&om%%Kt9kJ-xhzVf3q(GC|7B{|#}{0M8ja$8y@>Zw?zs;(BJ~ zO_;xC=dmk~KeU#{_fid+xM1zB<5!=2Y!lM4cXs}y!gae(Tzgt+Ih8=A)8V89&5BCZ zkS7F)gAoz*u3#}^(5M-_WxtfW9xT1<8|jvuZg|CSA&`xBpPABfxnj#9rt!S+Uephb zQfI*#3=dB~QM8x8($r1-dd1d~R;|nKzZo-o<+g?<$J9F^QU8EM1DpTBraga4admQF`R& zvN>n+?p8RS@QIzXe7hM14|#d=RkUcU+v!Cq`>huL#InVD+XvnJS#f-7L4se`*+aHY zd&L00HjOV<{=RSX~kCUDx+=wlC2*08~H@o0WtQnn%|Eb`V zry0%KxNyX&%EY~gE*c$tPA{DFN4K}d4@O^moHlz#_NDUmoi&?+Uod3>6Z(w|{IYJ) zY5O$`GVX?5G?rhG>pb6FemHLPqqdzo4gAz@sB+u%6XPhq&pdf_g!03~vc#2Bec}dX z&OhZ}@G*S<^Ot7i^&suFf7PXe-;2zp|7^oCGYb0s_1h7;UkbSS{&AGF4a1ejsjK|% zCq;bTozY?ax=b z;#aJ1heVsI8^2cVn3qsC?}RP>tnv?S!lGe~%dCq7$KBYfS?;NRwR6anEd2)X2^^Hr z6@0ktP&LtvgayaL%;#rAW5=x6zhK*(=z!nOm4>ek+pE6*PIrFz3-|T&hlE|&9Cq8e z;6U-))AJk$t=+t~f6AwcR%X;~|El&8s<%aR6w^n<1mIQ$rDDaX#uqj$OcC@-{1E%` z;Mwu-3z(-zpD1VhS&JH1wJ2cSdc~wH`O%DK+kUxaMz1yvFr#BdZ~B-KSW&iU#PF-x z)KmGQpWHTV?R|tA^Ezhi$Pvm{f~HJSp>^z-(fK< zD~Vq6XvEB2X0%>&xoUD)nOBp$>i414gsN-B+h6O?rO7VzE?9R`_l(xxdnK#wt_Pob zjSX$izqj+vOYKz6x+VGV-zT`Ne*A3RmO0F_&?D{nk{)?kTW_2)qmtc^s@6=CJ>}<{ zQCj8g6(#rIs=5pt#&<{9 literal 0 HcmV?d00001 diff --git a/mu-plugins/relevanssi/lib/cache.php b/mu-plugins/relevanssi/lib/cache.php deleted file mode 100644 index 8900a4a4..00000000 --- a/mu-plugins/relevanssi/lib/cache.php +++ /dev/null @@ -1,77 +0,0 @@ -query("DELETE FROM " . $relevanssi_variables['relevanssi_excerpt_cache'] . " WHERE post = $post"); -} - -function relevanssi_fetch_excerpt($post, $query) { - global $wpdb, $relevanssi_variables; - - $query = mysql_real_escape_string($query); - $excerpt = $wpdb->get_var("SELECT excerpt FROM " . $relevanssi_variables['relevanssi_excerpt_cache'] . " WHERE post = $post AND query = '$query'"); - - if (!$excerpt) return null; - - return $excerpt; -} - -function relevanssi_store_excerpt($post, $query, $excerpt) { - global $wpdb, $relevanssi_variables; - - $query = mysql_real_escape_string($query); - $excerpt = mysql_real_escape_string($excerpt); - - $wpdb->query("INSERT INTO " . $relevanssi_variables['relevanssi_excerpt_cache'] . " (post, query, excerpt) - VALUES ($post, '$query', '$excerpt') - ON DUPLICATE KEY UPDATE excerpt = '$excerpt'"); -} - -function relevanssi_fetch_hits($param) { - global $wpdb, $relevanssi_variables; - - $time = get_option('relevanssi_cache_seconds', 172800); - - $hits = $wpdb->get_var("SELECT hits FROM " . $relevanssi_variables['relevanssi_cache'] . " WHERE param = '$param' AND UNIX_TIMESTAMP() - UNIX_TIMESTAMP(tstamp) < $time"); - - if ($hits) { - return unserialize($hits); - } - else { - return null; - } -} - -function relevanssi_store_hits($param, $data) { - global $wpdb, $relevanssi_variables; - - $param = mysql_real_escape_string($param); - $data = mysql_real_escape_string($data); - $wpdb->query("INSERT INTO " . $relevanssi_variables['relevanssi_cache'] . " (param, hits) - VALUES ('$param', '$data') - ON DUPLICATE KEY UPDATE hits = '$data'"); -} - -function relevanssi_truncate_cache($all = false) { - global $wpdb, $relevanssi_variables; - $relevanssi_excerpt_cache = $relevanssi_variables['relevanssi_excerpt_cache']; - $relevanssi_cache = $relevanssi_variables['relevanssi_cache']; - - if ($all) { - $query = "TRUNCATE TABLE $relevanssi_excerpt_cache"; - $wpdb->query($query); - - $query = "TRUNCATE TABLE $relevanssi_cache"; - } - else { - $time = get_option('relevanssi_cache_seconds', 172800); - $query = "DELETE FROM $relevanssi_cache - WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(tstamp) > $time"; - // purge all expired cache data - } - $wpdb->query($query); -} - - -?> diff --git a/mu-plugins/relevanssi/lib/common.php b/mu-plugins/relevanssi/lib/common.php index 2649fbd8..c47b9310 100644 --- a/mu-plugins/relevanssi/lib/common.php +++ b/mu-plugins/relevanssi/lib/common.php @@ -8,6 +8,8 @@ function relevanssi_wpml_filter($data) { $lang = get_bloginfo('language'); $filtered_hits = array(); foreach ($data[0] as $hit) { + if (is_integer($hit)) $hit = get_post($hit); // this in case "fields" is set to "ids" + if (isset($hit->blog_id)) { switch_to_blog($hit->blog_id); } @@ -15,27 +17,12 @@ function relevanssi_wpml_filter($data) { if (function_exists('icl_object_id') && !function_exists('pll_is_translated_post_type')) { if ($sitepress->is_translated_post_type($hit->post_type)) { - if ($hit->ID == icl_object_id($hit->ID, $hit->post_type, false, ICL_LANGUAGE_CODE)) $filtered_hits[] = $hit; + if ($hit->ID == icl_object_id($hit->ID, $hit->post_type, false, $sitepress->get_current_language())) $filtered_hits[] = $hit; } else { $filtered_hits[] = $hit; } } - elseif (function_exists('icl_object_id') && function_exists('pll_is_translated_post_type')) { - if (pll_is_translated_post_type($hit->post_type)) { - global $polylang; - if ($polylang->model->get_post_language($hit->ID)->slug == ICL_LANGUAGE_CODE) { - $filtered_hits[] = $hit; - } - else if ($hit->ID == icl_object_id($hit->ID, $hit->post_type, false, ICL_LANGUAGE_CODE)) { - $filtered_hits[] = $hit; - } - } - else { - $filtered_hits[] = $hit; - } - } - // if there is no WPML but the target blog has identical language with current blog, // we use the hits. Note en-US is not identical to en-GB! elseif (get_bloginfo('language') == $lang) { @@ -50,51 +37,207 @@ function relevanssi_wpml_filter($data) { return $data; } +/* + * Fetches a key-direction pair from the orderby array. Converts key names to match the post object parameters + * when necessary and seeds the random generator, if required. +*/ +function relevanssi_get_next_key(&$orderby) { + if (!is_array($orderby) || count($orderby) < 1) return array('key' => null, 'dir' => null, 'compare' => null); + + list($key) = array_keys($orderby); + $dir = $orderby[$key]; + unset($orderby[$key]); + + $compare = "string"; + + if (strtolower($dir) == "rand") $key = "rand"; + + if ('title' == $key) $key = 'post_title'; + if ('date' == $key) $key = 'post_date'; + if ('modified' == $key) $key = 'post_modified'; + if ('parent' == $key) $key = 'post_parent'; + if ('type' == $key) $key = 'post_type'; + if ('name' == $key) $key = 'post_name'; + if ('author' == $key) $key = 'post_author'; + if ('relevance' == $key) $key = 'relevance_score'; + + $numeric_keys = array('menu_order', 'ID', 'post_parent', 'post_author', 'comment_count', 'relevance_score'); + $date_keys = array('post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt'); + + if (in_array($key, $numeric_keys)) $compare = "number"; + if (in_array($key, $date_keys)) $compare = "date"; + + if ('rand' == $key) { + if (is_numeric($dir)) srand($dir); + } + else { + $dir = strtolower($dir); + if ($dir != "asc") $dir = "desc"; + } + + $values = array( + 'key' => $key, + 'dir' => $dir, + 'compare' => $compare + ); + return $values; +} + +/* + * Fetches the key values for the item pair. If random order is required, will randomize the order. + */ +function relevanssi_get_compare_values($key, $item_1, $item_2) { + function_exists('mb_strtolower') ? $strtolower = 'mb_strtolower' : $strtolower = 'strtolower'; + + if ($key == "rand") { + do { + $key1 = rand(); + $key2 = rand(); + } while ($key1 == $key2); + $keys = array( + 'key1' => $key1, + 'key2' => $key2, + ); + return $keys; + } + + $key1 = ""; + $key2 = ""; + + if ($key == "meta_value" || $key == "meta_value_num") { + global $wp_query; + $key = $wp_query->query_vars['meta_key']; + if (!isset($key)) return array("", ""); + + $key1 = get_post_meta($item_1->ID, $key, true); + if (empty($key1)) $key1 = apply_filters('relevanssi_missing_sort_key', $key1, $key); + + $key2 = get_post_meta($item_2->ID, $key, true); + if (empty($key2)) $key2 = apply_filters('relevanssi_missing_sort_key', $key2, $key); + } + else { + if (isset($item_1->$key)) { + $key1 = call_user_func($strtolower, $item_1->$key); + } + else { + $key1 = apply_filters('relevanssi_missing_sort_key', $key1, $key); + } + if (isset($item_2->$key)) { + $key2 = call_user_func($strtolower, $item_2->$key); + } + else { + $key2 = apply_filters('relevanssi_missing_sort_key', $key2, $key); + } + } + + $keys = array( + 'key1' => $key1, + 'key2' => $key2, + ); + return $keys; +} + +function relevanssi_compare_values($key1, $key2, $compare) { + $val = 0; + if ($compare == "date") { + if (strtotime($key1) > strtotime($key2)) { + $val = 1; + } + else if (strtotime($key1) < strtotime($key2)) { + $val = -1; + } + } + else if ($compare == "string") { + $val = relevanssi_mb_strcasecmp($key1, $key2); + } + else { + if ($key1 > $key2) { + $val = 1; + } + else if ($key1 < $key2) { + $val = -1; + } + } + return $val; +} + +function relevanssi_mb_strcasecmp($str1, $str2, $encoding = null) { + if (!function_exists('mb_internal_encoding')) { + return strcasecmp($str1, $str2); + } + else { + if (null === $encoding) $encoding = mb_internal_encoding(); + return strcmp(mb_strtoupper($str1, $encoding), mb_strtoupper($str2, $encoding)); + } +} + /** * Function by Matthew Hood http://my.php.net/manual/en/function.sort.php#75036 */ -function relevanssi_object_sort(&$data, $key, $dir = 'desc') { - if ('title' == $key) $key = 'post_title'; - if ('date' == $key) $key = 'post_date'; - if (!isset($data[0]->$key)) return; // trying to sort by a non-existent key - $dir = strtolower($dir); - for ($i = count($data) - 1; $i >= 0; $i--) { - $swapped = false; - for ($j = 0; $j < $i; $j++) { - if (function_exists('mb_strtolower')) { - $key1 = mb_strtolower($data[$j]->$key); - $key2 = mb_strtolower($data[$j + 1]->$key); - } - else { - $key1 = strtolower($data[$j]->$key); - $key2 = strtolower($data[$j + 1]->$key); - } - if ('asc' == $dir) { - if ($key1 > $key2) { - $tmp = $data[$j]; - $data[$j] = $data[$j + 1]; - $data[$j + 1] = $tmp; - $swapped = true; - } +function relevanssi_object_sort(&$data, $orderby) { + $keys = array(); + $dirs = array(); + $compares = array(); + do { + $values = relevanssi_get_next_key($orderby); + if (!empty($values['key'])) { + $keys[] = $values['key']; + $dirs[] = $values['dir']; + $compares[] = $values['compare']; + } + } while (!empty($values['key'])); + + $primary_key = $keys[0]; + if (!isset($data[0]->$primary_key)) return; // trying to sort by a non-existent key + + for ($i = count($data) - 1; $i >= 0; $i--) { + $swapped = false; + for ($j = 0; $j < $i; $j++) { + $key1 = ""; + $key2 = ""; + + $level = -1; + $val = 0; + + while ($val == 0) { + $level++; + if (!isset($keys[$level])) { + $level--; + break; // give up – we can't sort these two + } + $compare = $compares[$level]; + $compare_values = relevanssi_get_compare_values($keys[$level], $data[$j], $data[$j + 1]); + $val = relevanssi_compare_values($compare_values['key1'], $compare_values['key2'], $compare); } - else { - if ($key1 < $key2) { - $tmp = $data[$j]; - $data[$j] = $data[$j + 1]; - $data[$j + 1] = $tmp; - $swapped = true; - } - } - } - if (!$swapped) return; + + if ('asc' == $dirs[$level]) { + if ($val > 0) { + $tmp = $data[$j]; + $data[$j] = $data[$j + 1]; + $data[$j + 1] = $tmp; + $swapped = true; + } + } + else { + if ($val < 1) { + $tmp = $data[$j]; + $data[$j] = $data[$j + 1]; + $data[$j + 1] = $tmp; + $swapped = true; + } + } + } + if (!$swapped) return; } } function relevanssi_show_matches($data, $hit) { - isset($data['body_matches'][$hit]) ? $body = $data['body_matches'][$hit] : $body = ""; - isset($data['title_matches'][$hit]) ? $title = $data['title_matches'][$hit] : $title = ""; - isset($data['tag_matches'][$hit]) ? $tag = $data['tag_matches'][$hit] : $tag = ""; - isset($data['comment_matches'][$hit]) ? $comment = $data['comment_matches'][$hit] : $comment = ""; + isset($data['body_matches'][$hit]) ? $body = $data['body_matches'][$hit] : $body = 0; + isset($data['title_matches'][$hit]) ? $title = $data['title_matches'][$hit] : $title = 0; + isset($data['tag_matches'][$hit]) ? $tag = $data['tag_matches'][$hit] : $tag = 0; + isset($data['category_matches'][$hit]) ? $category = $data['category_matches'][$hit] : $category = 0; + isset($data['taxonomy_matches'][$hit]) ? $taxonomy = $data['taxonomy_matches'][$hit] : $taxonomy = 0; + isset($data['comment_matches'][$hit]) ? $comment = $data['comment_matches'][$hit] : $comment = 0; isset($data['scores'][$hit]) ? $score = round($data['scores'][$hit], 2) : $score = 0; isset($data['term_hits'][$hit]) ? $term_hits_a = $data['term_hits'][$hit] : $term_hits_a = array(); arsort($term_hits_a); @@ -104,13 +247,13 @@ function relevanssi_show_matches($data, $hit) { $term_hits .= " $term: $hits"; $total_hits += $hits; } - - $text = get_option('relevanssi_show_matches_text'); - $replace_these = array("%body%", "%title%", "%tags%", "%comments%", "%score%", "%terms%", "%total%"); - $replacements = array($body, $title, $tag, $comment, $score, $term_hits, $total_hits); - + + $text = stripslashes(get_option('relevanssi_show_matches_text')); + $replace_these = array("%body%", "%title%", "%tags%", "%categories%", "%taxonomies%", "%comments%", "%score%", "%terms%", "%total%"); + $replacements = array($body, $title, $tag, $category, $taxonomy, $comment, $score, $term_hits, $total_hits); + $result = " " . str_replace($replace_these, $replacements, $text); - + return apply_filters('relevanssi_show_matches', $result); } @@ -119,8 +262,8 @@ function relevanssi_update_log($query, $hits) { return; global $wpdb, $relevanssi_variables; - - $user = wp_get_current_user(); + + $user = apply_filters('relevanssi_log_get_user', wp_get_current_user()); if ($user->ID != 0 && get_option('relevanssi_omit_from_logs')) { $omit = explode(",", get_option('relevanssi_omit_from_logs')); if (in_array($user->ID, $omit)) return; @@ -129,6 +272,7 @@ function relevanssi_update_log($query, $hits) { // Bot filter, by Justin_K // See: http://wordpress.org/support/topic/bot-logging-problem-w-tested-solution + $user_agent = ""; if (isset($_SERVER['HTTP_USER_AGENT'])) { $user_agent = $_SERVER['HTTP_USER_AGENT']; $bots = array('Google'=>'Mediapartners-Google'); @@ -136,11 +280,15 @@ function relevanssi_update_log($query, $hits) { foreach ($bots as $name => $lookfor) { if (stristr($user_agent, $lookfor) !== false) return; } - } - - get_option('relevanssi_log_queries_with_ip') == "on" ? $ip = $_SERVER['REMOTE_ADDR'] : $ip = ''; - $q = $wpdb->prepare("INSERT INTO " . $relevanssi_variables['log_table'] . " (query, hits, user_id, ip, time) VALUES (%s, %d, %d, %s, NOW())", $query, intval($hits), $user->ID, $ip); - $wpdb->query($q); + } + + get_option('relevanssi_log_queries_with_ip') == "on" ? $ip = apply_filters('relevanssi_remote_addr', $_SERVER['REMOTE_ADDR']) : $ip = ''; + + $ok_to_log = apply_filters('relevanssi_ok_to_log', true, $query, $hits, $user_agent, $ip); + if ($ok_to_log) { + $q = $wpdb->prepare("INSERT INTO " . $relevanssi_variables['log_table'] . " (query, hits, user_id, ip, time) VALUES (%s, %d, %d, %s, NOW())", $query, intval($hits), $user->ID, $ip); + $wpdb->query($q); + } } /** @@ -156,9 +304,9 @@ function relevanssi_default_post_ok($post_ok, $doc) { if ('publish' != $status) { $post_ok = false; } - + // ...unless - + if ('private' == $status) { $post_ok = false; @@ -168,24 +316,39 @@ function relevanssi_default_post_ok($post_ok, $doc) { $current_user = wp_get_current_user(); $post_ok = awp_user_can('read_post', $doc, $current_user->ID); } + else if (defined('GROUPS_CORE_VERSION')) { + // Groups + $current_user = wp_get_current_user(); + $access = Groups_Post_Access::user_can_read_post($doc, $current_user->ID); + } + else if (defined('SIMPLE_WP_MEMBERSHIP_VER')) { + // Simple Membership + $access_ctrl = SwpmAccessControl::get_instance(); + $access = $access_ctrl->can_i_read_post($post); + } else { // Basic WordPress version $type = relevanssi_get_post_type($doc); - $cap = 'read_private_' . $type . 's'; - $cap = apply_filters('relevanssi_private_cap', $cap); + if (isset($GLOBALS['wp_post_types'][$type]->cap->read_private_posts)) { + $cap = $GLOBALS['wp_post_types'][$type]->cap->read_private_posts; + } + else { + // guessing here + $cap = 'read_private_' . $type . 's'; + } if (current_user_can($cap)) { $post_ok = true; } } } - + // only show drafts, pending and future posts in admin search - if (in_array($status, array('draft', 'pending', 'future')) && is_admin()) { + if (in_array($status, apply_filters('relevanssi_valid_admin_status', array('draft', 'pending', 'future'))) && is_admin()) { $post_ok = true; } - + if (relevanssi_s2member_level($doc) == 0) $post_ok = false; // not ok with s2member - + return $post_ok; } @@ -201,12 +364,12 @@ function relevanssi_s2member_level($doc) { if (function_exists('is_permitted_by_s2member')) { // s2member $alt_view_protect = $GLOBALS["WS_PLUGIN__"]["s2member"]["o"]["filter_wp_query"]; - + if (version_compare (WS_PLUGIN__S2MEMBER_VERSION, "110912", ">=")) $completely_hide_protected_search_results = (in_array ("all", $alt_view_protect) || in_array ("searches", $alt_view_protect)) ? true : false; else /* Backward compatibility with versions of s2Member, prior to v110912. */ $completely_hide_protected_search_results = (strpos ($alt_view_protect, "all") !== false || strpos ($alt_view_protect, "searches") !== false) ? true : false; - + if (is_permitted_by_s2member($doc)) { // Show title and excerpt, even full content if you like. $return = 2; @@ -220,20 +383,20 @@ function relevanssi_s2member_level($doc) { $return = 0; } } - + return $return; } function relevanssi_populate_array($matches) { global $relevanssi_post_array, $relevanssi_post_types, $wpdb; - if (function_exists('wp_suspend_cache_addition')) + if (function_exists('wp_suspend_cache_addition')) wp_suspend_cache_addition(true); - + $ids = array(); foreach ($matches as $match) { array_push($ids, $match->doc); } - + $ids = implode(',', $ids); $posts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE id IN ($ids)"); foreach ($posts as $post) { @@ -241,7 +404,7 @@ function relevanssi_populate_array($matches) { $relevanssi_post_types[$post->ID] = $post->post_type; } - if (function_exists('wp_suspend_cache_addition')) + if (function_exists('wp_suspend_cache_addition')) wp_suspend_cache_addition(false); } @@ -256,31 +419,24 @@ function relevanssi_get_term_taxonomy($id) { * Returns an array of phrases */ function relevanssi_extract_phrases($q) { - if ( function_exists( 'mb_strpos' ) ) - $pos = mb_strpos($q, '"'); - else - $pos = strpos($q, '"'); + function_exists( 'mb_strpos' ) ? $strpos_function = "mb_strpos" : $strpos_function = "strpos"; + function_exists( 'mb_substr' ) ? $substr_function = "mb_substr" : $substr_function = "substr"; + + $pos = call_user_func($strpos_function, $q, '"'); $phrases = array(); while ($pos !== false) { $start = $pos; - if ( function_exists( 'mb_strpos' ) ) - $end = mb_strpos($q, '"', $start + 1); - else - $end = strpos($q, '"', $start + 1); - + $end = call_user_func($strpos_function, $q, '"', $start + 1); + if ($end === false) { // just one " in the query $pos = $end; continue; } - if ( function_exists( 'mb_substr' ) ) - $phrase = mb_substr($q, $start + 1, $end - $start - 1); - else - $phrase = substr($q, $start + 1, $end - $start - 1); - + $phrase = call_user_func($substr_function, $q, $start + 1, $end - $start - 1); $phrase = trim($phrase); - + if (!empty($phrase)) $phrases[] = $phrase; $pos = $end; } @@ -292,19 +448,19 @@ function relevanssi_extract_phrases($q) { */ function relevanssi_recognize_phrases($q) { global $wpdb; - + $phrases = relevanssi_extract_phrases($q); - + $all_queries = array(); if (count($phrases) > 0) { foreach ($phrases as $phrase) { $queries = array(); $phrase = esc_sql($phrase); "on" == get_option("relevanssi_index_excerpt") ? $excerpt = " OR post_excerpt LIKE '%$phrase%'" : $excerpt = ""; - $query = "(SELECT ID FROM $wpdb->posts + $query = "(SELECT ID FROM $wpdb->posts WHERE (post_content LIKE '%$phrase%' OR post_title LIKE '%$phrase%' $excerpt) AND post_status IN ('publish', 'draft', 'private', 'pending', 'future', 'inherit'))"; - + $queries[] = $query; $query = "(SELECT ID FROM $wpdb->posts as p, $wpdb->term_relationships as r, $wpdb->term_taxonomy as s, $wpdb->terms as t @@ -312,7 +468,7 @@ function relevanssi_recognize_phrases($q) { AND t.name LIKE '%$phrase%' AND p.post_status IN ('publish', 'draft', 'private', 'pending', 'future', 'inherit'))"; $queries[] = $query; - + $query = "(SELECT ID FROM $wpdb->posts AS p, $wpdb->postmeta AS m WHERE p.ID = m.post_id @@ -329,7 +485,7 @@ function relevanssi_recognize_phrases($q) { else { $phrases = ""; } - + $all_queries = implode(" ", $all_queries); return $all_queries; @@ -355,7 +511,7 @@ function relevanssi_strip_invisibles($text) { } function relevanssi_strlen_sort($a, $b) { - return strlen($b) - strlen($a); + return relevanssi_strlen($b) - relevanssi_strlen($a); } function relevanssi_get_custom_fields() { @@ -380,42 +536,49 @@ function relevanssi_get_custom_fields() { return $custom_fields; } -function relevanssi_mb_trim($string) { +function relevanssi_mb_trim($string) { $string = str_replace(chr(194) . chr(160), '', $string); - $string = preg_replace( "/(^\s+)|(\s+$)/us", "", $string ); - return $string; -} + $string = preg_replace( "/(^\s+)|(\s+$)/us", "", $string ); + return $string; +} function relevanssi_remove_punct($a) { - $a = strip_tags($a); - $a = stripslashes($a); - - $a = str_replace('ß', 'ss', $a); - - $a = str_replace("·", '', $a); - $a = str_replace("…", '', $a); - $a = str_replace("€", '', $a); - $a = str_replace("­", '', $a); - - $a = str_replace(chr(194) . chr(160), ' ', $a); - $a = str_replace(" ", ' ', $a); - $a = str_replace('’', ' ', $a); - $a = str_replace("'", ' ', $a); - $a = str_replace("’", ' ', $a); - $a = str_replace("‘", ' ', $a); - $a = str_replace("”", ' ', $a); - $a = str_replace("“", ' ', $a); - $a = str_replace("„", ' ', $a); - $a = str_replace("´", ' ', $a); - $a = str_replace("—", ' ', $a); - $a = str_replace("–", ' ', $a); - $a = str_replace("×", ' ', $a); - $a = preg_replace('/[[:punct:]]+/u', ' ', $a); - - $a = preg_replace('/[[:space:]]+/', ' ', $a); - $a = trim($a); - - return $a; + if (!is_string($a)) return ""; // In case something sends a non-string here. + + $a = preg_replace ('/<[^>]*>/', ' ', $a); + + $a = str_replace("\r", '', $a); // --- replace with empty space + $a = str_replace("\n", ' ', $a); // --- replace with space + $a = str_replace("\t", ' ', $a); // --- replace with space + + $a = stripslashes($a); + + $a = str_replace('ß', 'ss', $a); + + $a = str_replace("·", '', $a); + $a = str_replace("…", '', $a); + $a = str_replace("€", '', $a); + $a = str_replace("­", '', $a); + + $a = str_replace(chr(194) . chr(160), ' ', $a); + $a = str_replace(" ", ' ', $a); + $a = str_replace('’', ' ', $a); + $a = str_replace("'", ' ', $a); + $a = str_replace("’", ' ', $a); + $a = str_replace("‘", ' ', $a); + $a = str_replace("”", ' ', $a); + $a = str_replace("“", ' ', $a); + $a = str_replace("„", ' ', $a); + $a = str_replace("´", ' ', $a); + $a = str_replace("—", ' ', $a); + $a = str_replace("–", ' ', $a); + $a = str_replace("×", ' ', $a); + $a = preg_replace('/[[:punct:]]+/u', ' ', $a); + + $a = preg_replace('/[[:space:]]+/', ' ', $a); + $a = trim($a); + + return $a; } @@ -442,15 +605,30 @@ function relevanssi_prevent_default_request( $request, $query ) { if ($bbpress) { // this is a BBPress search; do not meddle return $request; - } + } $admin_search_ok = true; $admin_search_ok = apply_filters('relevanssi_admin_search_ok', $admin_search_ok, $query ); - + $prevent = true; $prevent = apply_filters('relevanssi_prevent_default_request', $prevent, $query ); - + + if (empty($query->query_vars['s'])) { + $prevent = false; + $admin_search_ok = false; + } + + if ( $query->is_admin && defined( 'DOING_AJAX' ) && DOING_AJAX ) { + $prevent = false; + $admin_search_ok = false; + } + + if ( $query->is_admin && $query->query_vars['post_type'] == 'page') { + $prevent = false; + $admin_search_ok = false; + } + if (!is_admin() && $prevent ) - $request = "SELECT * FROM $wpdb->posts WHERE 1=2"; + $request = "SELECT * FROM $wpdb->posts WHERE 1=2"; else if ('on' == get_option('relevanssi_admin_search') && $admin_search_ok ) $request = "SELECT * FROM $wpdb->posts WHERE 1=2"; } @@ -465,7 +643,7 @@ function relevanssi_tokenize($str, $remove_stops = true, $min_word_length = -1) } } if (is_array($str)) return $tokens; - + if ( function_exists('mb_internal_encoding') ) mb_internal_encoding("UTF-8"); @@ -473,7 +651,7 @@ function relevanssi_tokenize($str, $remove_stops = true, $min_word_length = -1) $stopword_list = relevanssi_fetch_stopwords(); } - if (function_exists('relevanssi_thousandsep')) { + if (function_exists('relevanssi_thousandsep')) { $str = relevanssi_thousandsep($str); } @@ -488,7 +666,8 @@ function relevanssi_tokenize($str, $remove_stops = true, $min_word_length = -1) while ($t !== false) { $t = strval($t); $accept = true; - if (strlen($t) < $min_word_length) { + + if (relevanssi_strlen($t) < $min_word_length) { $t = strtok("\n\t "); continue; } @@ -506,7 +685,7 @@ function relevanssi_tokenize($str, $remove_stops = true, $min_word_length = -1) if (RELEVANSSI_PREMIUM) { $t = apply_filters('relevanssi_premium_tokenizer', $t); } - + if ($accept) { $t = relevanssi_mb_trim($t); if (is_numeric($t)) $t = " $t"; // $t ends up as an array index, and numbers just don't work there @@ -517,7 +696,7 @@ function relevanssi_tokenize($str, $remove_stops = true, $min_word_length = -1) $tokens[$t]++; } } - + $t = strtok("\n\t "); } return $tokens; @@ -525,7 +704,7 @@ function relevanssi_tokenize($str, $remove_stops = true, $min_word_length = -1) function relevanssi_get_post_status($id) { global $relevanssi_post_array; - + $type = substr($id, 0, 2); if ($type == '**') { return 'publish'; @@ -533,7 +712,7 @@ function relevanssi_get_post_status($id) { if ($type == 'u_') { return 'publish'; } - + if (isset($relevanssi_post_array[$id])) { $status = $relevanssi_post_array[$id]->post_status; if ('inherit' == $status) { @@ -554,7 +733,7 @@ function relevanssi_get_post_status($id) { function relevanssi_get_post_type($id) { global $relevanssi_post_array; - + if (isset($relevanssi_post_array[$id])) { return $relevanssi_post_array[$id]->post_type; } @@ -590,7 +769,7 @@ function relevanssi_get_term_tax_id($field, $id, $taxonomy) { */ function relevanssi_add_synonyms($q) { if (empty($q)) return $q; - + $synonym_data = get_option('relevanssi_synonyms'); if ($synonym_data) { $synonyms = array(); @@ -602,6 +781,7 @@ function relevanssi_add_synonyms($q) { } $pairs = explode(";", $synonym_data); foreach ($pairs as $pair) { + if (empty($pair)) continue; // skip empty rows $parts = explode("=", $pair); $key = strval(trim($parts[0])); $value = trim($parts[1]); @@ -611,8 +791,9 @@ function relevanssi_add_synonyms($q) { $new_terms = array(); $terms = array_keys(relevanssi_tokenize($q, false)); // remove stopwords is false here if (!in_array($q, $terms)) $terms[] = $q; - + foreach ($terms as $term) { + $term = trim($term); if (in_array(strval($term), array_keys($synonyms))) { // strval, otherwise numbers cause problems if (isset($synonyms[strval($term)])) { // necessary, otherwise terms like "02" can cause problems $new_terms = array_merge($new_terms, array_keys($synonyms[strval($term)])); @@ -632,13 +813,9 @@ function relevanssi_add_synonyms($q) { /* Helper function that does mb_stripos, falls back to mb_strpos and mb_strtoupper * if that cannot be found, and falls back to just strpos if even that is not possible. */ -function relevanssi_stripos($content, $term, $offset) { - if (function_exists('mb_strlen')) { - if ($offset > mb_strlen($content)) return false; - } - else { - if ($offset > strlen($content)) return false; - } +function relevanssi_stripos($content, $term, $offset = 0) { + if ($offset > relevanssi_strlen($content)) return false; + if (function_exists('mb_stripos')) { $pos = ("" == $content) ? false : mb_stripos($content, $term, $offset); } @@ -672,30 +849,48 @@ function relevanssi_close_tags($html) { } } return $html; -} +} /* Prints out post title with highlighting. */ -function relevanssi_the_title() { +function relevanssi_the_title($echo = true) { global $post; if (empty($post->post_highlighted_title)) $post->post_highlighted_title = $post->post_title; - echo $post->post_highlighted_title; + if ($echo) echo $post->post_highlighted_title; + return $post->post_highlighted_title; } /* Returns the post title with highlighting. */ function relevanssi_get_the_title($post_id) { - $post = get_post($post_id); + $post = relevanssi_get_post($post_id); if (empty($post->post_highlighted_title)) $post->post_highlighted_title = $post->post_title; return $post->post_highlighted_title; } function relevanssi_update_doc_count( $values, $post ) { - $D = get_option( 'relevanssi_doc_count'); - $count = count($values); - if ($values && $count > 0) { - update_option( 'relevanssi_doc_count', $D + $count); - } + global $wpdb, $relevanssi_variables; + $relevanssi_table = $relevanssi_variables['relevanssi_table']; + $D = $wpdb->get_var("SELECT COUNT(DISTINCT(relevanssi.doc)) FROM $relevanssi_table AS relevanssi"); + update_option( 'relevanssi_doc_count', $D); return $values; } -?> + +/* Uses mb_strlen() if available, otherwise falls back to strlen(). +*/ +function relevanssi_strlen($s) { + if ( function_exists( 'mb_strlen' ) ) return mb_strlen( $s ); + return strlen( $s ); +} + +/* If WP_CLI is available, print out the debug notice as a WP_CLI::log(), otherwise + * just echo. + */ +function relevanssi_debug_echo($s) { + if ( defined( 'WP_CLI' ) && WP_CLI ) { + WP_CLI::log($s); + } + else { + echo $s . "\n"; + } +} diff --git a/mu-plugins/relevanssi/lib/excerpts-highlights.php b/mu-plugins/relevanssi/lib/excerpts-highlights.php index fd9b11b3..3d06771d 100644 --- a/mu-plugins/relevanssi/lib/excerpts-highlights.php +++ b/mu-plugins/relevanssi/lib/excerpts-highlights.php @@ -18,25 +18,30 @@ function relevanssi_do_excerpt($t_post, $query) { if ($post != NULL) $old_global_post = $post; $post = $t_post; - $remove_stopwords = false; + $remove_stopwords = true; $terms = relevanssi_tokenize($query, $remove_stopwords, -1); // These shortcodes cause problems with Relevanssi excerpts - remove_shortcode('layerslider'); - + $problem_shortcodes = apply_filters('relevanssi_disable_shortcodes_excerpt', + array('layerslider', 'responsive-flipbook', 'breadcrumb', 'maxmegamenu', 'robogallery') + ); + foreach ($problem_shortcodes as $shortcode) { + remove_shortcode($shortcode); + } + $content = apply_filters('relevanssi_pre_excerpt_content', $post->post_content, $post, $query); $content = apply_filters('the_content', $content); $content = apply_filters('relevanssi_excerpt_content', $content, $post, $query); - + $content = relevanssi_strip_invisibles($content); // removes , &c with content $content = preg_replace('/(<\/[^>]+?>)(<[^>\/][^>]*?>)/', '$1 $2', $content); // add spaces between tags to avoid getting words stuck together $content = strip_tags($content, get_option('relevanssi_excerpt_allowable_tags', '')); // this removes the tags, but leaves the content - + $content = preg_replace("/\n\r|\r\n|\n|\r/", " ", $content); // $content = trim(preg_replace("/\s\s+/", " ", $content)); - + $query = relevanssi_add_synonyms($query); - + $excerpt_data = relevanssi_create_excerpt($content, $terms, $query); if (get_option("relevanssi_index_comments") != 'none') { @@ -60,18 +65,21 @@ function relevanssi_do_excerpt($t_post, $query) { } } } - + $start = $excerpt_data[2]; - $excerpt = $excerpt_data[0]; + $excerpt = $excerpt_data[0]; $excerpt = trim($excerpt); $excerpt = apply_filters('relevanssi_excerpt', $excerpt); + if (empty($excerpt) && !empty($post->post_excerpt)) $excerpt = $post->post_excerpt; + $excerpt == $post->post_content ? $whole_post_excerpted = true : $whole_post_excerpted = false; + $ellipsis = apply_filters('relevanssi_ellipsis', '...'); $highlight = get_option('relevanssi_highlight'); if ("none" != $highlight) { - if (!is_admin()) { + if ( !is_admin() || ( defined( 'DOING_AJAX' ) && DOING_AJAX ) ) { $query = relevanssi_add_synonyms($query); $excerpt = relevanssi_highlight_terms($excerpt, $query); } @@ -79,13 +87,15 @@ function relevanssi_do_excerpt($t_post, $query) { $excerpt = relevanssi_close_tags($excerpt); - if (!$start && !empty($excerpt)) { - $excerpt = $ellipsis . $excerpt; - // do not add three dots to the beginning of the post - } + if (!$whole_post_excerpted) { + if (!$start && !empty($excerpt)) { + $excerpt = $ellipsis . $excerpt; + // do not add three dots to the beginning of the post + } - if (!empty($excerpt)) - $excerpt = $excerpt . $ellipsis; + if (!empty($excerpt)) + $excerpt = $excerpt . $ellipsis; + } if (relevanssi_s2member_level($post->ID) == 1) $excerpt = $post->post_excerpt; @@ -108,6 +118,7 @@ function relevanssi_create_excerpt($content, $terms, $query) { $best_excerpt_term_hits = -1; $excerpt = ""; + $content = preg_replace('/\s+/u', ' ', $content); $content = " $content"; $phrases = relevanssi_extract_phrases(stripslashes($query)); @@ -120,160 +131,44 @@ function relevanssi_create_excerpt($content, $terms, $query) { $non_phrase_terms[] = $term; } } - + $terms = $non_phrase_terms; $terms[$phrase] = 1; } + // longest search terms first, because those are generally more significant uksort($terms, 'relevanssi_strlen_sort'); - + $start = false; if ("chars" == $type) { - $term_positions = array(); - foreach (array_keys($terms) as $term) { - $term = trim($term); - $term_key = $term; - get_option('relevanssi_fuzzy') != 'none' ? $term = "$term" : $term = " $term"; - - $pos = 0; - $n = 0; - while (false !== $pos) { - $pos = relevanssi_stripos($content, $term, $pos); - if (false !== $pos) { - $term_positions[$pos] = $term_key; - function_exists('mb_strlen') ? $pos = $pos + mb_strlen($term) : $pos = $pos + strlen(utf8_decode($term)); - } - } - } - ksort($term_positions); - $positions = array_keys($term_positions); - $best_position = 0; - $best_position_hits = 0; - $quarter = floor($excerpt_length/4); // adjustment, so the excerpt doesn't start with the search term - for ($i = 0; $i < count($positions); $i++) { - $key = $positions[$i]; - $orig_key = $key; - $key = $key - $quarter; - if ($key < 0) $key = 0; - - $j = $i + 1; - - $this_excerpt_terms = array(); - - if (isset($term_positions[$orig_key])) $this_excerpt_terms[$term_positions[$orig_key]] = true; - - while (isset($positions[$j])) { - if (isset($positions[$j])) { - $next_key = $positions[$j]; - } - - if ($key + $excerpt_length > $next_key) { - $this_excerpt_terms[$term_positions[$next_key]] = true; - } - else { - break; // farther than the excerpt length - } - $j++; - } - - if (count($this_excerpt_terms) > $best_position_hits) { - $best_position_hits = count($this_excerpt_terms); - $best_position = $key; - } - } - - if ($best_position + $excerpt_length < strlen($content)) { - if (function_exists('mb_substr')) - $excerpt = mb_substr($content, $best_position, $excerpt_length); - else - $excerpt = substr($content, $best_position, $excerpt_length); - } - else { - $fixed_position = strlen($content) - $excerpt_length; - if ($fixed_position > 0) { - if (function_exists('mb_substr')) - $excerpt = mb_substr($content, $fixed_position, $excerpt_length); - else - $excerpt = substr($content, $fixed_position, $excerpt_length); - } - } - - if ($best_position == 0) $start = true; - - - if ("" == $excerpt) { - if (function_exists('mb_substr')) - $excerpt = mb_substr($content, 0, $excerpt_length); - else - $excerpt = substr($content, 0, $excerpt_length); - $start = true; - } + $prev_count = floor($excerpt_length / 2); + list($excerpt, $best_excerpt_term_hits, $start) = relevanssi_extract_relevant(array_keys($terms), $content, $excerpt_length, $prev_count); } else { $words = explode(' ', $content); $i = 0; - + while ($i < count($words)) { if ($i + $excerpt_length > count($words)) { $i = count($words) - $excerpt_length; if ($i < 0) $i = 0; } - + $excerpt_slice = array_slice($words, $i, $excerpt_length); $excerpt_slice = implode(' ', $excerpt_slice); $excerpt_slice = " $excerpt_slice"; $term_hits = 0; - foreach (array_keys($terms) as $term) { - $term = " $term"; - if (function_exists('mb_stripos')) { - $pos = ("" == $excerpt_slice) ? false : mb_stripos($excerpt_slice, $term); - // To avoid "empty haystack" warnings - } - else if (function_exists('mb_strpos')) { - $pos = mb_strpos($excerpt_slice, $term); - if (false === $pos) { - if (function_exists('mb_strtoupper') && function_exists('mb_strpos') && function_exists('mb_substr')) { - $titlecased = mb_strtoupper(mb_substr($term, 0, 1)) . mb_substr($term, 1); - $pos = mb_strpos($excerpt_slice, $titlecased); - if (false === $pos) { - $pos = mb_strpos($excerpt_slice, mb_strtoupper($term)); - } - } - else { - $titlecased = strtoupper(substr($term, 0, 1)) . substr($term, 1); - $pos = strpos($excerpt_slice, $titlecased); - if (false === $pos) { - $pos = strpos($excerpt_slice, strtoupper($term)); - } - } - } - } - else { - $pos = strpos($excerpt_slice, $term); - if (false === $pos) { - $titlecased = strtoupper(substr($term, 0, 1)) . substr($term, 1); - $pos = strpos($excerpt_slice, $titlecased); - if (false === $pos) { - $pos = strpos($excerpt_slice, strtoupper($term)); - } - } - } - - if (false !== $pos) { - $term_hits++; - if (0 == $i) $start = true; - - if ($term_hits > $best_excerpt_term_hits) { - $best_excerpt_term_hits = $term_hits; - $excerpt = $excerpt_slice; - } - } + $count = relevanssi_count_matches(array_keys($terms), $excerpt_slice); + + if ($count > 0 && $count > $best_excerpt_term_hits) { + $best_excerpt_term_hits = $count; + $excerpt = $excerpt_slice; } - + $i += $excerpt_length; } - + if ("" == $excerpt) { $excerpt = explode(' ', $content, $excerpt_length); array_pop($excerpt); @@ -294,15 +189,16 @@ function relevanssi_highlight_in_docs($content) { $referrer = preg_replace('@(http|https)://@', '', stripslashes(urldecode($_SERVER['HTTP_REFERER']))); $args = explode('?', $referrer); $query = array(); - + if ( count( $args ) > 1 ) parse_str( $args[1], $query ); - - if (stripos($referrer, $_SERVER['SERVER_NAME']) !== false) { + + if (stripos($referrer, $_SERVER['SERVER_NAME']) !== false) { // Local search if (isset($query['s'])) { $q = relevanssi_add_synonyms($query['s']); - $highlighted_content = relevanssi_highlight_terms($content, $q); + $in_docs = true; + $highlighted_content = relevanssi_highlight_terms($content, $q, $in_docs); if (!empty($highlighted_content)) $content = $highlighted_content; // Sometimes the content comes back empty; until I figure out why, this tries to be a solution. } @@ -312,16 +208,16 @@ function relevanssi_highlight_in_docs($content) { } } } - + return $content; } -function relevanssi_highlight_terms($excerpt, $query) { +function relevanssi_highlight_terms($excerpt, $query, $in_docs = false) { $type = get_option("relevanssi_highlight"); if ("none" == $type) { return $excerpt; } - + switch ($type) { case "mark": // thanks to Jeff Byrnes $start_emp = ""; @@ -362,15 +258,21 @@ function relevanssi_highlight_terms($excerpt, $query) { default: return $excerpt; } - - $start_emp_token = "**["; - $end_emp_token = "]**"; + + $start_emp_token = "**{}["; + $end_emp_token = "]}**"; if ( function_exists('mb_internal_encoding') ) mb_internal_encoding("UTF-8"); - - $terms = array_keys(relevanssi_tokenize($query, $remove_stopwords = true, $min_word_length = -1)); - + + do_action('relevanssi_highlight_tokenize'); + + // Setting min_word_length to 2, in order to avoid 1-letter highlights. + $min_word_length = 2; + if (apply_filters('relevanssi_allow_one_letter_highlights', false)) $min_word_length = 1; + + $terms = array_keys(relevanssi_tokenize($query, $remove_stopwords = true, $min_word_length)); + if (is_array($query)) $query = implode(' ', $query); // just in case $phrases = relevanssi_extract_phrases(stripslashes($query)); @@ -392,20 +294,25 @@ function relevanssi_highlight_terms($excerpt, $query) { foreach ($terms as $term) { // $pr_term = relevanssi_replace_punctuation(preg_quote($term, '/')); $pr_term = preg_quote($term, '/'); - + $pr_term = relevanssi_add_accent_variations($pr_term); + $undecoded_excerpt = $excerpt; - $excerpt = html_entity_decode($excerpt); - + $excerpt = html_entity_decode($excerpt, ENT_QUOTES, 'UTF-8'); + if ($word_boundaries) { - get_option('relevanssi_fuzzy') != 'none' ? $regex = "/($pr_term)(?!(^&+)?(;))/iu" : $regex = "/(\b$pr_term|$pr_term\b)(?!(^&+)?(;))/iu"; +// get_option('relevanssi_fuzzy') != 'none' ? $regex = "/($pr_term)(?!(^&+)?(;))/iu" : $regex = "/(\b$pr_term|$pr_term\b)(?!(^&+)?(;))/iu"; +// get_option('relevanssi_fuzzy') != 'none' ? $regex = "/(\b$pr_term|$pr_term\b)(?!(^&+)?(;))/iu" : $regex = "/(\b$pr_term\b)(?!(^&+)?(;))/iu"; + get_option('relevanssi_fuzzy') != 'none' ? $regex = "/(\b$pr_term|$pr_term\b)/iu" : $regex = "/(\b$pr_term\b)/iu"; + $excerpt = preg_replace($regex, $start_emp_token . '\\1' . $end_emp_token, $excerpt); if (empty($excerpt)) $excerpt = preg_replace($regex, $start_emp_token . '\\1' . $end_emp_token, $undecoded_excerpt); } else { - $excerpt = preg_replace("/($pr_term)(?!(^&+)?(;))/iu", $start_emp_token . '\\1' . $end_emp_token, $excerpt); - if (empty($excerpt)) $excerpt = preg_replace("/($pr_term)(?!(^&+)?(;))/iu", $start_emp_token . '\\1' . $end_emp_token, $undecoded_excerpt); +// $excerpt = preg_replace("/($pr_term)(?!(^&+)?(;))/iu", $start_emp_token . '\\1' . $end_emp_token, $excerpt); + $excerpt = preg_replace("/($pr_term)/iu", $start_emp_token . '\\1' . $end_emp_token, $excerpt); + if (empty($excerpt)) $excerpt = preg_replace("/($pr_term)/iu", $start_emp_token . '\\1' . $end_emp_token, $undecoded_excerpt); } - + $preg_start = preg_quote($start_emp_token); $preg_end = preg_quote($end_emp_token); @@ -418,6 +325,15 @@ function relevanssi_highlight_terms($excerpt, $query) { } } + if (preg_match_all('/&.*;/U', $excerpt, $matches) > 0) { + // Remove highlights from inside HTML entities + foreach ($matches as $match) { + $new_match = str_replace($start_emp_token, '', $match); + $new_match = str_replace($end_emp_token, '', $new_match); + $excerpt = str_replace($match, $new_match, $excerpt); + } + } + if (preg_match_all('/<(style|script|object|embed)>.*<\/(style|script|object|embed)>/U', $excerpt, $matches) > 0) { // Remove highlights in style, object, embed and script tags foreach ($matches as $match) { @@ -427,13 +343,9 @@ function relevanssi_highlight_terms($excerpt, $query) { } } } - - $excerpt = relevanssi_remove_nested_highlights($excerpt, $start_emp_token, $end_emp_token); -/* - $excerpt = htmlentities($excerpt, ENT_QUOTES, 'UTF-8'); - // return the HTML entities that were stripped before -*/ + $excerpt = relevanssi_remove_nested_highlights($excerpt, $start_emp_token, $end_emp_token); + $excerpt = relevanssi_fix_entities($excerpt, $in_docs); $excerpt = str_replace($start_emp_token, $start_emp, $excerpt); $excerpt = str_replace($end_emp_token, $end_emp, $excerpt); @@ -452,15 +364,101 @@ function relevanssi_replace_punctuation($a) { return $a; } +function relevanssi_fix_entities($excerpt, $in_docs) { + if (!$in_docs) { + // For excerpts, use htmlentities() + $excerpt = htmlentities($excerpt, ENT_NOQUOTES, 'UTF-8'); // ENT_QUOTES or ENT_NOQUOTES? + + // Except for allowed tags, which are turned back into tags. + $tags = get_option('relevanssi_excerpt_allowable_tags', ''); + $tags = trim(str_replace("<", " <", $tags)); + $tags = explode(" ", $tags); + $closing_tags = relevanssi_generate_closing_tags($tags); + + $tags_entitied = htmlentities(implode(" ", $tags), ENT_NOQUOTES, 'UTF-8'); // ENT_QUOTES or ENT_NOQUOTES? + $tags_entitied = explode(" ", $tags_entitied); + + $closing_tags_entitied = htmlentities(implode(" ", $closing_tags), ENT_NOQUOTES, 'UTF-8'); // ENT_QUOTES or ENT_NOQUOTES? + $closing_tags_entitied = explode(" ", $closing_tags_entitied); + + $tags_entitied_regexped = array(); + $i = 0; + foreach ($tags_entitied as $tag) { + $tag = str_replace(">", "(.*?)>", $tag); + $pattern = "~$tag~"; + $tags_entitied_regexped[] = $pattern; + + $matching_tag = $tags[$i]; + $matching_tag = str_replace(">", '\1>', $matching_tag); + $tags[$i] = $matching_tag; + $i++; + } + + $closing_tags_entitied_regexped = array(); + foreach ($closing_tags_entitied as $tag) { + $pattern = "~" . preg_quote($tag) . "~"; + $closing_tags_entitied_regexped[] = $pattern; + } + + $tags = array_merge($tags, $closing_tags); + $tags_entitied = array_merge($tags_entitied_regexped, $closing_tags_entitied_regexped); + + $excerpt = preg_replace($tags_entitied, $tags, $excerpt); + + // In case there are attributes. This is the easiest solution, as + // using quotes and apostrophes un-entitied can't really break + // anything. + $excerpt = str_replace('"', '"', $excerpt); + $excerpt = str_replace(''', "'", $excerpt); + } + else { + // Running htmlentities() for whole posts tends to ruin things. + // However, we want to run htmlentities() for anything inside + //
 and  tags.
+		$excerpt = relevanssi_entities_inside($excerpt, "code");
+		$excerpt = relevanssi_entities_inside($excerpt, "pre");
+	}
+	return $excerpt;
+}
+
+function relevanssi_entities_inside($excerpt, $tag) {
+	$hits = preg_match_all('/<' . $tag . '>(.*?)<\/' . $tag . '>/im', $excerpt, $matches);
+	if ($hits > 0) {
+		$replacements = array();
+		foreach ($matches[1] as $match) {
+			if (!empty($match))	$replacements[] = "" . htmlentities($match, ENT_QUOTES, 'UTF-8') . "";
+		}
+		if (!empty($replacements)) {
+			for ($i = 0; $i < count($replacements); $i++) {
+				$patterns[] = "/<" . $tag . ">(.*?)<\/" . $tag . ">/im";
+			}
+			$excerpt = preg_replace($patterns, $replacements, $excerpt, 1);
+		}
+		$excerpt = str_replace("xxx" . $tag, $tag, $excerpt);
+	}
+	return $excerpt;
+}
+
+function relevanssi_generate_closing_tags($tags) {
+	$closing_tags = array();
+	foreach ($tags as $tag) {
+		$a = str_replace("<", "", "/>", $tag);
+		$closing_tags[] = $a;
+		$closing_tags[] = $b;
+	}
+	return $closing_tags;
+}
+
 function relevanssi_remove_nested_highlights($s, $a, $b) {
 	$offset = 0;
 	$string = "";
-	$bits = explode($a, $s);	
+	$bits = explode($a, $s);
 	$new_bits = array($bits[0]);
 	$in = false;
 	for ($i = 1; $i < count($bits); $i++) {
 		if ($bits[$i] == '') continue;
-		
+
 		if (!$in) {
 			array_push($new_bits, $a);
 			$in = true;
@@ -483,8 +481,139 @@ function relevanssi_remove_nested_highlights($s, $a, $b) {
 		array_push($new_bits, $bits[$i]);
 	}
 	$whole = implode('', $new_bits);
-	
+
 	return $whole;
 }
 
+/******
+ * This code originally written by Ben Boyter
+ * http://www.boyter.org/2013/04/building-a-search-result-extract-generator-in-php/
+ */
+
+// find the locations of each of the words
+// Nothing exciting here. The array_unique is required
+// unless you decide to make the words unique before passing in
+function relevanssi_extract_locations($words, $fulltext) {
+    $locations = array();
+    foreach($words as $word) {
+        $wordlen = relevanssi_strlen($word);
+        $loc = relevanssi_stripos($fulltext, $word, 0);
+        while($loc !== FALSE) {
+            $locations[] = $loc;
+            $loc = relevanssi_stripos($fulltext, $word, $loc + $wordlen);
+        }
+    }
+    $locations = array_unique($locations);
+    sort($locations);
+
+    return $locations;
+}
+
+function relevanssi_count_matches($words, $fulltext) {
+	$count = 0;
+	foreach( $words as $word ) {
+		$word = relevanssi_add_accent_variations($word);
+
+		if (get_option('relevanssi_fuzzy') == 'never') {
+			$pattern = '/([\s,\.:;\?!\']'.$word.'[\s,\.:;\?!\'])/i';
+			if (preg_match($pattern, $fulltext, $matches, PREG_OFFSET_CAPTURE)) {
+				$count += count($matches) - 1;
+			}
+		}
+		else {
+			$pattern = '/([\s,\.:;\?!\']'.$word.')/i';
+			if (preg_match($pattern, $fulltext, $matches, PREG_OFFSET_CAPTURE)) {
+				$count += count($matches) - 1;
+			}
+			$pattern = '/('.$word.'[\s,\.:;\?!\'])/i';
+			if (preg_match($pattern, $fulltext, $matches, PREG_OFFSET_CAPTURE)) {
+				$count += count($matches) - 1;
+			}
+		}
+	}
+	return $count;
+}
+
+// Work out which is the most relevant portion to display
+// This is done by looping over each match and finding the smallest distance between two found
+// strings. The idea being that the closer the terms are the better match the snippet would be.
+// When checking for matches we only change the location if there is a better match.
+// The only exception is where we have only two matches in which case we just take the
+// first as will be equally distant.
+function relevanssi_determine_snip_location($locations, $prevcount) {
+    if (!is_array($locations) || empty($locations)) return 0;
+
+    // If we only have 1 match we dont actually do the for loop so set to the first
+    $startpos = $locations[0];
+    $loccount = count($locations);
+    $smallestdiff = PHP_INT_MAX;
+
+    // If we only have 2 skip as its probably equally relevant
+    if(count($locations) > 2) {
+        // skip the first as we check 1 behind
+        for($i=1; $i < $loccount; $i++) {
+            if($i == $loccount-1) { // at the end
+                $diff = $locations[$i] - $locations[$i-1];
+            }
+            else {
+                $diff = $locations[$i+1] - $locations[$i];
+            }
+
+            if($smallestdiff > $diff) {
+                $smallestdiff = $diff;
+                $startpos = $locations[$i];
+            }
+        }
+    }
+
+    $startpos = $startpos > $prevcount ? $startpos - $prevcount : 0;
+    return $startpos;
+}
+
+// 1/6 ratio on prevcount tends to work pretty well and puts the terms
+// in the middle of the extract
+function relevanssi_extract_relevant($words, $fulltext, $rellength=300, $prevcount=50) {
+	$textlength = relevanssi_strlen($fulltext);
+
+	if($textlength <= $rellength) {
+        return array($fulltext, 1, 0);
+    }
+
+    $locations = relevanssi_extract_locations($words, $fulltext);
+    $startpos  = relevanssi_determine_snip_location($locations,$prevcount);
+
+    // if we are going to snip too much...
+    if($textlength-$startpos < $rellength) {
+        $startpos = $startpos - ($textlength-$startpos)/2;
+    }
+
+    function_exists('mb_substr') ? $substr = 'mb_substr' : $substr = 'substr';
+    function_exists('mb_strrpos') ? $strrpos = 'mb_strrpos' : $strrpos = 'strrpos';
+
+	$reltext = call_user_func($substr, $fulltext, $startpos, $rellength);
+
+    // check to ensure we dont snip the last word if thats the match
+    if( $startpos + $rellength < $textlength) {
+        $reltext = call_user_func($substr, $reltext, 0, call_user_func($strrpos, $reltext, " ")); // remove last word
+    }
+
+	$start = false;
+    if($startpos == 0) $start = true;
+
+	$besthits = count(relevanssi_extract_locations($words, $reltext));
+
+    return array($reltext, $besthits, $start);
+}
+
+function relevanssi_add_accent_variations($word) {
+    $replacement_arrays = apply_filters('relevanssi_accents_replacement_arrays', array(
+        "from" => array('a','c','e','i','o','u','n','ss'),
+        "to" => array('(a|á|à|â)','(c|ç)', '(e|é|è|ê|ë)','(i|í|ì|î|ï)','(o|ó|ò|ô|õ)','(u|ú|ù|ü|û)','(n|ñ)','(ss|ß)'),
+    ));
+
+	$word = str_ireplace($replacement_arrays['from'], $replacement_arrays['to'], $word);
+
+   	return $word;
+}
+
 ?>
diff --git a/mu-plugins/relevanssi/lib/indexing.php b/mu-plugins/relevanssi/lib/indexing.php
index 85bc950c..df6a3f3f 100644
--- a/mu-plugins/relevanssi/lib/indexing.php
+++ b/mu-plugins/relevanssi/lib/indexing.php
@@ -1,21 +1,22 @@
  0) {
 		$restriction = " AND post.post_type IN (" . implode(', ', $post_types) . ') ';
 	}
@@ -35,13 +36,13 @@ function relevanssi_build_index($extend = false) {
 		// this really should never happen
 		$valid_status = "'publish', 'draft', 'private', 'pending', 'future'";
 	}
-	
+
 	$n = 0;
 	$size = 0;
-	
+
 	if (!$extend) {
 		// truncate table first
-		$wpdb->query("TRUNCATE TABLE $relevanssi_table");
+		relevanssi_truncate_index();
 
 		if (function_exists('relevanssi_index_taxonomies')) {
 			if (get_option('relevanssi_index_taxonomies') == 'on') {
@@ -55,6 +56,13 @@ function relevanssi_build_index($extend = false) {
 			}
 		}
 
+		// if post limit parameter is present, numeric and > 0, use that
+		$limit = "";
+		if (isset($post_limit) && is_numeric($post_limit) && $post_limit > 0) {
+			$size = $post_limit;
+			$limit = " LIMIT $post_limit";
+		}
+
         $q = "SELECT post.ID
 		FROM $wpdb->posts post
 		LEFT JOIN $wpdb->posts parent ON (post.post_parent=parent.ID)
@@ -67,13 +75,17 @@ function relevanssi_build_index($extend = false) {
 					OR (post.post_parent=0)
 				)
 			))
-		$restriction";
+		$restriction $limit";
 
 		update_option('relevanssi_index', '');
 	}
 	else {
 		// extending, so no truncate and skip the posts already in the index
 		$limit = get_option('relevanssi_index_limit', 200);
+
+		// if post limit parameter is present, numeric and > 0, use that
+		if (isset($post_limit) && is_numeric($post_limit) && $post_limit > 0) $limit = $post_limit;
+
 		if (is_numeric($limit) && $limit > 0) {
 			$size = $limit;
 			$limit = " LIMIT $limit";
@@ -104,27 +116,45 @@ function relevanssi_build_index($extend = false) {
 
 	do_action('relevanssi_pre_indexing_query');
 	$content = $wpdb->get_results($q);
-	
+
+	if ( defined( 'WP_CLI' ) && WP_CLI && function_exists('relevanssi_generate_progress_bar') ) $progress = relevanssi_generate_progress_bar( 'Indexing posts', count($content) );
 	foreach ($content as $post) {
-		$n += relevanssi_index_doc($post->ID, false, $custom_fields, true);
-		// n calculates the number of insert queries
+		$result = relevanssi_index_doc($post->ID, false, $custom_fields, true);
+		if (is_numeric($result) && $result > 0) $n++;
+		// n calculates the number of posts indexed
 		// $bypassglobalpost set to true, because at this point global $post should be NULL, but in some cases it is not
+
+		if ( defined( 'WP_CLI' ) && WP_CLI && $progress ) $progress->tick();
 	}
-	
+	if ( defined( 'WP_CLI' ) && WP_CLI && $progress ) $progress->finish();
+
 	$wpdb->query("ANALYZE TABLE $relevanssi_table");
 	// To prevent empty indices
-	
-    echo '

' - . __((($size == 0) || (count($content) < $size)) ? "Indexing complete!" : "More to index...", "relevanssi") - . '

'; + + $complete = false; + if ($verbose) { + if (($size == 0) || (count($content) < $size)) { + $message = __("Indexing complete!", "relevanssi"); + } + else { + $message = __("More to index...", "relevanssi"); + } + echo '

' . $message . '

'; + } + else { + if (($size == 0) || (count($content) < $size)) $complete = true; + } + update_option('relevanssi_indexed', 'done'); - // We always want to run this on init, if the index is finishd building. + // We always want to run this on init, if the index is finished building. $D = $wpdb->get_var("SELECT COUNT(DISTINCT(relevanssi.doc)) FROM $relevanssi_table AS relevanssi"); update_option( 'relevanssi_doc_count', $D); - if (function_exists('wp_suspend_cache_addition')) + if (function_exists('wp_suspend_cache_addition')) wp_suspend_cache_addition(false); // Thanks to Julien Mession + + return array($complete, $n); } // BEGIN modified by renaissancehack @@ -135,14 +165,14 @@ function relevanssi_build_index($extend = false) { - Build index: global $post is NULL, $indexpost is a post object. - + - Update post: global $post has the original $post, $indexpost is the ID of revision. - + - Quick edit: global $post is an array, $indexpost is the ID of current revision. */ -function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields = false, $bypassglobalpost = false) { +function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields = false, $bypassglobalpost = false, $debug = false) { global $wpdb, $post, $relevanssi_variables; $relevanssi_table = $relevanssi_variables['relevanssi_table']; $post_was_null = false; @@ -164,7 +194,7 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields if (is_array($post)) { $post = get_post($post['ID']); } - + if (empty($post)) { // No $post set, so we need to use $indexpost, if it's a post object $post_was_null = true; @@ -180,23 +210,24 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields $previous_post = $post; } } - + if ($post == NULL) { // At this point we should have something in $post; if not, quit. if ($post_was_null) $post = null; if ($previous_post) $post = $previous_post; - return; + return -1; } - + // Finally fetch the post again by ID. Complicated, yes, but unless we do this, we might end // up indexing the post before the updates come in. $post = get_post($post->ID); if (function_exists('relevanssi_hide_post')) { if (relevanssi_hide_post($post->ID)) { + if ($debug) relevanssi_debug_echo("relevanssi_hide_post() returned true."); if ($post_was_null) $post = null; if ($previous_post) $post = $previous_post; - return; + return "hide"; } } @@ -209,8 +240,7 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields if (true == apply_filters('relevanssi_do_not_index', false, $post->ID)) { // filter says no - if ($post_was_null) $post = null; - if ($previous_post) $post = $previous_post; + if ($debug) relevanssi_debug_echo("relevanssi_do_not_index returned true."); $index_this_post = false; } @@ -220,33 +250,35 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields if (function_exists('relevanssi_remove_item')) { relevanssi_remove_item($post->ID, 'post'); } + if ($debug) relevanssi_debug_echo("Removed the post from the index."); } // This needs to be here, after the call to relevanssi_remove_doc(), because otherwise - // a post that's in the index but shouldn't be there won't get removed. A remote chance, - // I mean who ever flips exclude_from_search between true and false once it's set, but - // I'd like to cover all bases. + // a post that's in the index but shouldn't be there won't get removed. if (!$index_this_post) { if ($post_was_null) $post = null; if ($previous_post) $post = $previous_post; - return; + return "donotindex"; } - $n = 0; + $n = 0; - $post = apply_filters('relevanssi_post_to_index', $post); + // The second parameter is useless here, but used elsewhere + $post = apply_filters('relevanssi_post_to_index', $post, $post); $min_word_length = get_option('relevanssi_min_word_length', 3); $insert_data = array(); //Added by OdditY - INDEX COMMENTS of the POST -> if ("none" != get_option("relevanssi_index_comments")) { + if ($debug) relevanssi_debug_echo("Indexing comments."); $pcoms = relevanssi_get_comments($post->ID); if ($pcoms != "") { $pcoms = relevanssi_strip_invisibles($pcoms); $pcoms = preg_replace('/<[a-zA-Z\/][^>]*>/', ' ', $pcoms); $pcoms = strip_tags($pcoms); - $pcoms = relevanssi_tokenize($pcoms, true, $min_word_length); + if ($debug) relevanssi_debug_echo("Comment content: $pcoms"); + $pcoms = relevanssi_tokenize($pcoms, true, $min_word_length); if (count($pcoms) > 0) { foreach ($pcoms as $pcom => $count) { $n++; @@ -261,42 +293,54 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields // Then process all taxonomies, if any. foreach ($taxonomies as $taxonomy) { + if ($debug) relevanssi_debug_echo("Indexing taxonomy terms for $taxonomy"); $insert_data = relevanssi_index_taxonomy_terms($post, $taxonomy, $insert_data); } - + // index author if ("on" == get_option("relevanssi_index_author")) { $auth = $post->post_author; $display_name = $wpdb->get_var("SELECT display_name FROM $wpdb->users WHERE ID=$auth"); $names = relevanssi_tokenize($display_name, false, $min_word_length); + if ($debug) relevanssi_debug_echo("Indexing post author as: " . implode(" ", array_keys($names))); foreach($names as $name => $count) { isset($insert_data[$name]['author']) ? $insert_data[$name]['author'] += $count : $insert_data[$name]['author'] = $count; } } - if ($custom_fields) { - $remove_underscore_fields = false; - if ($custom_fields == 'all') - $custom_fields = get_post_custom_keys($post->ID); - if ($custom_fields == 'visible') { - $custom_fields = get_post_custom_keys($post->ID); - $remove_underscore_fields = true; - } - $custom_fields = apply_filters('relevanssi_index_custom_fields', $custom_fields); - if (is_array($custom_fields)) { - foreach ($custom_fields as $field) { - if ($remove_underscore_fields) { - if (substr($field, 0, 1) == '_') continue; - } - $values = get_post_meta($post->ID, $field, false); - if ("" == $values) continue; - foreach ($values as $value) { - $value_tokens = relevanssi_tokenize($value, true, $min_word_length); - foreach ($value_tokens as $token => $count) { - isset($insert_data[$token]['customfield']) ? $insert_data[$token]['customfield'] += $count : $insert_data[$token]['customfield'] = $count; - if (function_exists('relevanssi_customfield_detail')) { - $insert_data = relevanssi_customfield_detail($insert_data, $token, $count, $field); - } + $remove_underscore_fields = false; + if (isset($custom_fields) && $custom_fields == 'all') + $custom_fields = get_post_custom_keys($post->ID); + if (isset($custom_fields) && $custom_fields == 'visible') { + $custom_fields = get_post_custom_keys($post->ID); + $remove_underscore_fields = true; + } + $custom_fields = apply_filters('relevanssi_index_custom_fields', $custom_fields); + + if (is_array($custom_fields)) { + if ($debug) relevanssi_debug_echo("Custom fields to index: " . implode(", ", $custom_fields)); + $custom_fields = array_unique($custom_fields); // no reason to index duplicates + + $repeater_fields = array(); + if (function_exists('relevanssi_add_repeater_fields')) relevanssi_add_repeater_fields($custom_fields, $post->ID); + + foreach ($custom_fields as $field) { + if ($remove_underscore_fields) { + if (substr($field, 0, 1) == '_') continue; + } + $values = get_post_meta($post->ID, $field, false); + if ("" == $values) continue; + foreach ($values as $value) { + // Quick hack : allow indexing of PODS relationship custom fields // TMV + if (is_array($value) && isset($value['post_title'])) $value = $value['post_title']; + relevanssi_index_acf($insert_data, $post->ID, $field, $value); + if ($debug) relevanssi_debug_echo("\tKey: " . $field . " – value: " . $value); + + $value_tokens = relevanssi_tokenize($value, true, $min_word_length); + foreach ($value_tokens as $token => $count) { + isset($insert_data[$token]['customfield']) ? $insert_data[$token]['customfield'] += $count : $insert_data[$token]['customfield'] = $count; + if (function_exists('relevanssi_customfield_detail')) { + $insert_data = relevanssi_customfield_detail($insert_data, $token, $count, $field); } } } @@ -304,6 +348,7 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields } if (isset($post->post_excerpt) && ("on" == get_option("relevanssi_index_excerpt") || "attachment" == $post->post_type)) { // include excerpt for attachments which use post_excerpt for captions - modified by renaissancehack + if ($debug) relevanssi_debug_echo("Indexing post excerpt: $post->post_excerpt"); $excerpt_tokens = relevanssi_tokenize($post->post_excerpt, true, $min_word_length); foreach ($excerpt_tokens as $token => $count) { isset($insert_data[$token]['excerpt']) ? $insert_data[$token]['excerpt'] += $count : $insert_data[$token]['excerpt'] = $count; @@ -311,35 +356,44 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields } if (function_exists('relevanssi_index_mysql_columns')) { + if ($debug) relevanssi_debug_echo("Indexing MySQL columns."); $insert_data = relevanssi_index_mysql_columns($insert_data, $post->ID); } $index_titles = true; - if (apply_filters('relevanssi_index_titles', $index_titles)) { - $filtered_title = apply_filters('relevanssi_post_title_before_tokenize', $post->post_title); - $titles = relevanssi_tokenize(apply_filters('the_title', $filtered_title)); - - if (count($titles) > 0) { - foreach ($titles as $title => $count) { - $n++; - isset($insert_data[$title]['title']) ? $insert_data[$title]['title'] += $count : $insert_data[$title]['title'] = $count; + if (!empty($post->post_title)) { + if (apply_filters('relevanssi_index_titles', $index_titles)) { + if ($debug) relevanssi_debug_echo("Indexing post title."); + $filtered_title = apply_filters('relevanssi_post_title_before_tokenize', $post->post_title, $post); + $titles = relevanssi_tokenize(apply_filters('the_title', $filtered_title, $post->ID), apply_filters('relevanssi_remove_stopwords_in_titles', true), $min_word_length); + if ($debug) relevanssi_debug_echo("\tTitle, tokenized: " . implode(" ", array_keys($titles))); + + if (count($titles) > 0) { + foreach ($titles as $title => $count) { + $n++; + isset($insert_data[$title]['title']) ? $insert_data[$title]['title'] += $count : $insert_data[$title]['title'] = $count; + } } } } - + $index_content = true; if (apply_filters('relevanssi_index_content', $index_content)) { + if ($debug) relevanssi_debug_echo("Indexing post content."); remove_shortcode('noindex'); add_shortcode('noindex', 'relevanssi_noindex_shortcode_indexing'); $contents = apply_filters('relevanssi_post_content', $post->post_content, $post); - + if ($debug) relevanssi_debug_echo("\tPost content after relevanssi_post_content:\n$contents"); + // Allow user to add extra content for Relevanssi to index // Thanks to Alexander Gieg $additional_content = trim(apply_filters('relevanssi_content_to_index', '', $post)); - if ('' != $additional_content) - $contents .= ' '.$additional_content; - + if ('' != $additional_content) { + $contents .= ' '.$additional_content; + if ($debug) relevanssi_debug_echo("\tAdditional content from relevanssi_content_to_index:\n$contents"); + } + if ('on' == get_option('relevanssi_expand_shortcodes')) { if (function_exists("do_shortcode")) { // WP Table Reloaded support @@ -348,7 +402,12 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields $My_WP_Table_Reloaded = new WP_Table_Reloaded_Controller_Frontend(); } // TablePress support - if ( defined( 'TABLEPRESS_ABSPATH' ) ) { + if (defined('TABLEPRESS_ABSPATH')) { + if (!isset(TablePress::$model_options)) { + include_once(TABLEPRESS_ABSPATH . 'classes/class-model.php'); + include_once(TABLEPRESS_ABSPATH . 'models/model-options.php'); + TablePress::$model_options = new TablePress_Options_Model(); + } $My_TablePress_Controller = TablePress::load_controller( 'frontend' ); $My_TablePress_Controller->init_shortcodes(); } @@ -364,11 +423,46 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields remove_shortcode('avatar_upload'); // WP User Avatar is incompatible remove_shortcode('product_categories'); // A problematic WooCommerce shortcode remove_shortcode('recent_products'); // A problematic WooCommerce shortcode - + remove_shortcode('php'); // PHP Code for Posts + remove_shortcode('watupro'); // Watu PRO doesn't co-operate + remove_shortcode('starbox'); // Starbox shortcode breaks Relevanssi + remove_shortcode('cfdb-save-form-post'); // Contact Form DB + remove_shortcode('cfdb-datatable'); + remove_shortcode('cfdb-table'); + remove_shortcode('cfdb-json'); + remove_shortcode('cfdb-value'); + remove_shortcode('cfdb-count'); + remove_shortcode('cfdb-html'); + remove_shortcode('woocommerce_cart'); // WooCommerce + remove_shortcode('woocommerce_checkout'); + remove_shortcode('woocommerce_order_tracking'); + remove_shortcode('woocommerce_my_account'); + remove_shortcode('woocommerce_edit_account'); + remove_shortcode('woocommerce_change_password'); + remove_shortcode('woocommerce_view_order'); + remove_shortcode('woocommerce_logout'); + remove_shortcode('woocommerce_pay'); + remove_shortcode('woocommerce_thankyou'); + remove_shortcode('woocommerce_lost_password'); + remove_shortcode('woocommerce_edit_address'); + remove_shortcode('tc_process_payment'); + remove_shortcode('maxmegamenu'); // Max Mega Menu + remove_shortcode('searchandfilter'); // Search and Filter + remove_shortcode('downloads'); // Easy Digital Downloads + remove_shortcode('download_history'); + remove_shortcode('purchase_history'); + remove_shortcode('download_checkout'); + remove_shortcode('purchase_link'); + remove_shortcode('download_cart'); + remove_shortcode('edd_profile_editor'); + remove_shortcode('edd_login'); + remove_shortcode('edd_register'); + remove_shortcode('swpm_protected'); // Simple Membership Partially Protected content + $post_before_shortcode = $post; $contents = do_shortcode($contents); $post = $post_before_shortcode; - + if (defined('TABLEPRESS_ABSPATH')) { unset($My_TablePress_Controller); } @@ -378,26 +472,26 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields } } else { - if (function_exists("strip_shortcodes")) { - // WP 2.5 doesn't have the function - $contents = strip_shortcodes($contents); - } + $contents = strip_shortcodes($contents); } - + remove_shortcode('noindex'); add_shortcode('noindex', 'relevanssi_noindex_shortcode'); $contents = relevanssi_strip_invisibles($contents); - + if (function_exists('relevanssi_process_internal_links')) { $contents = relevanssi_process_internal_links($contents, $post->ID); } $contents = preg_replace('/<[a-zA-Z\/][^>]*>/', ' ', $contents); $contents = strip_tags($contents); + if (function_exists('wp_encode_emoji')) $contents = wp_encode_emoji($contents); $contents = apply_filters('relevanssi_post_content_before_tokenize', $contents, $post); $contents = relevanssi_tokenize($contents, true, $min_word_length); - + + if ($debug) relevanssi_debug_echo("\tContent, tokenized:\n" . implode(" ", array_keys($contents))); + if (count($contents) > 0) { foreach ($contents as $content => $count) { $n++; @@ -405,10 +499,10 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields } } } - + $type = 'post'; if ($post->post_type == 'attachment') $type = 'attachment'; - + $insert_data = apply_filters('relevanssi_indexing_data', $insert_data, $post); $values = array(); @@ -435,13 +529,14 @@ function relevanssi_index_doc($indexpost, $remove_first = false, $custom_fields array_push($values, $value); } - + $values = apply_filters('relevanssi_indexing_values', $values, $post); - + if (!empty($values)) { $values = implode(', ', $values); $query = "INSERT IGNORE INTO $relevanssi_table (doc, term, term_reverse, content, title, comment, tag, link, author, category, excerpt, taxonomy, customfield, type, taxonomy_detail, customfield_detail, mysqlcolumn) VALUES $values"; + if ($debug) relevanssi_debug_echo("Final indexing query:\n\t$query"); $wpdb->query($query); } @@ -468,22 +563,22 @@ function relevanssi_index_taxonomy_terms($post = null, $taxonomy = "", $insert_d if (null == $post) return $insert_data; if ("" == $taxonomy) return $insert_data; - + $min_word_length = get_option('relevanssi_min_word_length', 3); $ptagobj = get_the_terms($post->ID, $taxonomy); - if ($ptagobj !== FALSE) { + if ($ptagobj !== FALSE) { $tagstr = ""; foreach ($ptagobj as $ptag) { if (is_object($ptag)) { $tagstr .= $ptag->name . ' '; } - } - $tagstr = trim($tagstr); - $ptags = relevanssi_tokenize($tagstr, true, $min_word_length); + } + $tagstr = apply_filters('relevanssi_tag_before_tokenize', trim($tagstr)); + $ptags = relevanssi_tokenize($tagstr, true, $min_word_length); if (count($ptags) > 0) { foreach ($ptags as $ptag => $count) { $n++; - + if ('post_tags' == $taxonomy) { $insert_data[$ptag]['tag'] = $count; } @@ -512,7 +607,7 @@ function relevanssi_index_taxonomy_terms($post = null, $taxonomy = "", $insert_d } $insert_data[$ptag]['taxonomy_detail'] = serialize($tax_detail); } - } + } } return $insert_data; } @@ -532,6 +627,7 @@ function relevanssi_update_child_posts($new_status, $old_status, $post) { || (in_array($post->post_type, array('attachment', 'revision')))) { return; } + $q = "SELECT * FROM $wpdb->posts WHERE post_parent=$post->ID AND post_type!='revision'"; $child_posts = $wpdb->get_results($q); if ($child_posts) { @@ -579,7 +675,7 @@ function relevanssi_delete($post) { function relevanssi_publish($post, $bypassglobalpost = false) { global $relevanssi_publish_doc; - + $post_status = get_post_status($post); if ('auto-draft' == $post_status) return; @@ -612,7 +708,7 @@ function relevanssi_insert_edit($post_id) { } } -//Added by OdditY -> +//Added by OdditY -> function relevanssi_comment_edit($comID) { relevanssi_comment_index($comID,$action="update"); } @@ -625,10 +721,10 @@ function relevanssi_comment_index($comID,$action="add") { global $wpdb; $comtype = get_option("relevanssi_index_comments"); switch ($comtype) { - case "all": + case "all": // all (incl. customs, track-&pingbacks) break; - case "normal": + case "normal": // normal (excl. customs, track-&pingbacks) $restriction=" AND comment_type='' "; break; @@ -637,28 +733,28 @@ function relevanssi_comment_index($comID,$action="add") { return ; } switch ($action) { - case "update": + case "update": //(update) comment status changed: $cpostID = $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID='$comID'".$restriction); break; - case "remove": + case "remove": //(remove) approved comment will be deleted (if not approved, its not in index): $cpostID = $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID='$comID' AND comment_approved='1'".$restriction); if($cpostID!=NULL) { //empty comment_content & reindex, then let WP delete the empty comment $wpdb->query("UPDATE $wpdb->comments SET comment_content='' WHERE comment_ID='$comID'"); - } + } break; default: // (add) new comment: $cpostID = $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments WHERE comment_ID='$comID' AND comment_approved='1'".$restriction); break; } - if($cpostID!=NULL) relevanssi_publish($cpostID); + if($cpostID!=NULL) relevanssi_publish($cpostID); } //Added by OdditY END <- -function relevanssi_get_comments($postID) { +function relevanssi_get_comments($postID) { global $wpdb; if (apply_filters('relevanssi_index_comments_exclude', false, $postID)) @@ -668,10 +764,10 @@ function relevanssi_get_comments($postID) { $restriction = ""; $comment_string = ""; switch ($comtype) { - case "all": + case "all": // all (incl. customs, track- & pingbacks) break; - case "normal": + case "normal": // normal (excl. customs, track- & pingbacks) $restriction=" AND comment_type='' "; break; @@ -687,9 +783,9 @@ function relevanssi_get_comments($postID) { $sql = "SELECT comment_ID, comment_content, comment_author FROM $wpdb->comments WHERE comment_post_ID = '$postID' - AND comment_approved = '1' + AND comment_approved = '1' ".$restriction." - LIMIT $from, $to"; + LIMIT $from, $to"; $comments = $wpdb->get_results($sql); if (sizeof($comments) == 0) break; foreach($comments as $comment) { @@ -697,8 +793,39 @@ function relevanssi_get_comments($postID) { } $from += $to; } - + return $comment_string; } +/** + * Indexes the human-readable value of "choice" options list ACF + * Droz Raphaël, June 2016 + */ +function relevanssi_index_acf(&$insert_data, $post_id, $field_name, $field_value) { + if (!is_admin() ) include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); // otherwise is_plugin_active will cause a fatal error + if (!is_plugin_active('advanced-custom-fields/acf.php') && + !is_plugin_active('advanced-custom-fields-pro/acf.php')) return; + + if (!function_exists('get_field_object')) return; // ACF is active, but not loaded. + + $field_object = get_field_object($field_name, $post_id); + if (!isset($field_object['choices'])) return; // not a "select" field + if (is_array($field_value)) return; // not handled (currently) + if (!isset($field_object['choices'][$field_value])) return; // value does not exist + + if ( ($value = $field_object['choices'][$field_value]) ) { + if (!isset($insert_data[$value]['customfield']) ) $insert_data[$value]['customfield'] = 0; + $insert_data[$value]['customfield']++; + } +} + +/** + * Truncates the Relevanssi index. + */ +function relevanssi_truncate_index() { + global $wpdb, $relevanssi_variables; + $relevanssi_table = $relevanssi_variables['relevanssi_table']; + return $wpdb->query("TRUNCATE TABLE $relevanssi_table"); +} + ?> diff --git a/mu-plugins/relevanssi/lib/init.php b/mu-plugins/relevanssi/lib/init.php index e9a65ff5..1f969c9d 100644 --- a/mu-plugins/relevanssi/lib/init.php +++ b/mu-plugins/relevanssi/lib/init.php @@ -1,10 +1,10 @@

" - . __('You do not have an index! Remember to build the index (click the "Build the index" button), otherwise searching won\'t work.') + . __('You do not have an index! Remember to build the index (click the "Build the index" button), otherwise searching won\'t work.', 'relevanssi') . "

"; } if ( 'options-general.php' == $pagenow and isset( $_GET['page'] ) and plugin_basename($relevanssi_variables['file']) == $_GET['page'] ) { @@ -50,12 +50,11 @@ function relevanssi_warning() { update_option( 'relevanssi_doc_count', $D); } } - + if (!function_exists('mb_internal_encoding')) { function relevanssi_mb_warning() { echo "

" - . "Multibyte string functions are not available. Relevanssi may not work well without them. " - . "Please install (or ask your host to install) the mbstring extension." + . __("Multibyte string functions are not available. Relevanssi may not work well without them. Please install (or ask your host to install) the mbstring extension.", 'relevanssi') . "

"; } if ( 'options-general.php' == $pagenow and isset( $_GET['page'] ) and plugin_basename($relevanssi_variables['file']) == $_GET['page'] ) @@ -102,8 +101,8 @@ function relevanssi_query_vars($qv) { function relevanssi_create_database_tables($relevanssi_db_version) { global $wpdb; - - require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); + + require_once(ABSPATH . 'wp-admin/includes/upgrade.php'); $charset_collate_bin_column = ''; $charset_collate = ''; @@ -120,8 +119,8 @@ function relevanssi_create_database_tables($relevanssi_db_version) { $charset_collate_bin_column .= " COLLATE utf8_bin"; } } - - $relevanssi_table = $wpdb->prefix . "relevanssi"; + + $relevanssi_table = $wpdb->prefix . "relevanssi"; $relevanssi_stopword_table = $wpdb->prefix . "relevanssi_stopwords"; $relevanssi_log_table = $wpdb->prefix . "relevanssi_log"; @@ -133,28 +132,28 @@ function relevanssi_create_database_tables($relevanssi_db_version) { } delete_option('relevanssi_indexed'); } - - $sql = "CREATE TABLE " . $relevanssi_table . " (doc bigint(20) NOT NULL DEFAULT '0', - term varchar(50) NOT NULL DEFAULT '0', + + $sql = "CREATE TABLE " . $relevanssi_table . " (doc bigint(20) NOT NULL DEFAULT '0', + term varchar(50) NOT NULL DEFAULT '0', term_reverse varchar(50) NOT NULL DEFAULT '0', - content mediumint(9) NOT NULL DEFAULT '0', - title mediumint(9) NOT NULL DEFAULT '0', - comment mediumint(9) NOT NULL DEFAULT '0', - tag mediumint(9) NOT NULL DEFAULT '0', - link mediumint(9) NOT NULL DEFAULT '0', - author mediumint(9) NOT NULL DEFAULT '0', - category mediumint(9) NOT NULL DEFAULT '0', - excerpt mediumint(9) NOT NULL DEFAULT '0', - taxonomy mediumint(9) NOT NULL DEFAULT '0', - customfield mediumint(9) NOT NULL DEFAULT '0', + content mediumint(9) NOT NULL DEFAULT '0', + title mediumint(9) NOT NULL DEFAULT '0', + comment mediumint(9) NOT NULL DEFAULT '0', + tag mediumint(9) NOT NULL DEFAULT '0', + link mediumint(9) NOT NULL DEFAULT '0', + author mediumint(9) NOT NULL DEFAULT '0', + category mediumint(9) NOT NULL DEFAULT '0', + excerpt mediumint(9) NOT NULL DEFAULT '0', + taxonomy mediumint(9) NOT NULL DEFAULT '0', + customfield mediumint(9) NOT NULL DEFAULT '0', mysqlcolumn mediumint(9) NOT NULL DEFAULT '0', taxonomy_detail longtext NOT NULL, customfield_detail longtext NOT NULL, mysqlcolumn_detail longtext NOT NULL, - type varchar(210) NOT NULL DEFAULT 'post', - item bigint(20) NOT NULL DEFAULT '0', + type varchar(210) NOT NULL DEFAULT 'post', + item bigint(20) NOT NULL DEFAULT '0', UNIQUE KEY doctermitem (doc, term, item)) $charset_collate"; - + dbDelta($sql); $sql = "SHOW INDEX FROM $relevanssi_table"; @@ -170,7 +169,7 @@ function relevanssi_create_database_tables($relevanssi_db_version) { if ($index->Key_name == 'docs') $docs_exists = true; if ($index->Key_name == 'typeitem') $typeitem_exists = true; } - + if (!$terms_exists) { $sql = "CREATE INDEX terms ON $relevanssi_table (term(20))"; $wpdb->query($sql); @@ -180,12 +179,12 @@ function relevanssi_create_database_tables($relevanssi_db_version) { $sql = "CREATE INDEX relevanssi_term_reverse_idx ON $relevanssi_table (term_reverse(10))"; $wpdb->query($sql); } - + if (!$docs_exists) { $sql = "CREATE INDEX docs ON $relevanssi_table (doc)"; $wpdb->query($sql); } - + if (!$typeitem_exists) { $sql = "CREATE INDEX typeitem ON $relevanssi_table (type, item)"; $wpdb->query($sql); @@ -196,7 +195,7 @@ function relevanssi_create_database_tables($relevanssi_db_version) { dbDelta($sql); - $sql = "CREATE TABLE " . $relevanssi_log_table . " (id bigint(9) NOT NULL AUTO_INCREMENT, + $sql = "CREATE TABLE " . $relevanssi_log_table . " (id bigint(9) NOT NULL AUTO_INCREMENT, query varchar(200) NOT NULL, hits mediumint(9) NOT NULL DEFAULT '0', time timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, @@ -205,11 +204,11 @@ function relevanssi_create_database_tables($relevanssi_db_version) { UNIQUE KEY id (id)) $charset_collate;"; dbDelta($sql); - + if (RELEVANSSI_PREMIUM && get_option('relevanssi_db_version') < 12) { $charset_collate_bin_column = ''; $charset_collate = ''; - + if (!empty($wpdb->charset)) { $charset_collate_bin_column = "CHARACTER SET $wpdb->charset"; $charset_collate = "DEFAULT $charset_collate_bin_column"; @@ -222,7 +221,7 @@ function relevanssi_create_database_tables($relevanssi_db_version) { $charset_collate_bin_column .= " COLLATE utf8_bin"; } } - + $sql = "ALTER TABLE $relevanssi_stopword_table MODIFY COLUMN stopword varchar(50) $charset_collate_bin_column NOT NULL"; $wpdb->query($sql); $sql = "ALTER TABLE $relevanssi_log_table ADD COLUMN user_id bigint(20) NOT NULL DEFAULT '0'"; @@ -230,7 +229,7 @@ function relevanssi_create_database_tables($relevanssi_db_version) { $sql = "ALTER TABLE $relevanssi_log_table ADD COLUMN ip varchar(40) NOT NULL DEFAULT ''"; $wpdb->query($sql); } - + if (get_option('relevanssi_db_version') < 16) { $sql = "ALTER TABLE $relevanssi_table ADD COLUMN term_reverse VARCHAR(50);"; $wpdb->query($sql); @@ -239,12 +238,25 @@ function relevanssi_create_database_tables($relevanssi_db_version) { $sql = "CREATE INDEX relevanssi_term_reverse_idx ON $relevanssi_table (term_reverse(10));"; $wpdb->query($sql); } - + update_option('relevanssi_db_version', $relevanssi_db_version); } - + if ($wpdb->get_var("SELECT COUNT(*) FROM $relevanssi_stopword_table WHERE 1") < 1) { relevanssi_populate_stopwords(); } } + +function relevanssi_action_links ($links) { + $root = "relevanssi"; + if (RELEVANSSI_PREMIUM) $root = "relevanssi-premium"; + $relevanssi_links = array( + '' . __('Settings', 'relevanssi') . '', + ); + if (!RELEVANSSI_PREMIUM) { + $relevanssi_links[] = '' . __('Go Premium!', 'relevanssi') . ''; + } + return array_merge($links, $relevanssi_links); +} + ?> diff --git a/mu-plugins/relevanssi/lib/interface.php b/mu-plugins/relevanssi/lib/interface.php index cd541d4b..dc20ca0c 100644 --- a/mu-plugins/relevanssi/lib/interface.php +++ b/mu-plugins/relevanssi/lib/interface.php @@ -15,13 +15,13 @@ function relevanssi_options() { check_admin_referer(plugin_basename($relevanssi_variables['file']), 'relevanssi_options'); update_relevanssi_options(); } - + if (isset($_REQUEST['index'])) { check_admin_referer(plugin_basename($relevanssi_variables['file']), 'relevanssi_options'); update_relevanssi_options(); relevanssi_build_index(); } - + if (isset($_REQUEST['index_extend'])) { check_admin_referer(plugin_basename($relevanssi_variables['file']), 'relevanssi_options'); update_relevanssi_options(); @@ -35,11 +35,11 @@ function relevanssi_options() { relevanssi_import_options($options); } } - + if (isset($_REQUEST['search'])) { relevanssi_search($_REQUEST['q']); } - + if (isset($_REQUEST['dowhat'])) { if ("add_stopword" == $_REQUEST['dowhat']) { if (isset($_REQUEST['term'])) { @@ -48,28 +48,29 @@ function relevanssi_options() { } } } - + if (isset($_REQUEST['addstopword'])) { check_admin_referer(plugin_basename($relevanssi_variables['file']), 'relevanssi_options'); relevanssi_add_stopword($_REQUEST['addstopword']); } - + if (isset($_REQUEST['removestopword'])) { check_admin_referer(plugin_basename($relevanssi_variables['file']), 'relevanssi_options'); relevanssi_remove_stopword($_REQUEST['removestopword']); } - + if (isset($_REQUEST['removeallstopwords'])) { check_admin_referer(plugin_basename($relevanssi_variables['file']), 'relevanssi_options'); relevanssi_remove_all_stopwords(); } } relevanssi_options_form(); - - relevanssi_common_words(); - + + if (apply_filters('relevanssi_display_common_words', true)) + relevanssi_common_words(25); + echo "
"; - + echo ""; } @@ -85,7 +86,8 @@ function relevanssi_search_stats() { check_admin_referer('relevanssi_reset_logs', '_relresnonce'); if (isset($_REQUEST['relevanssi_reset_code'])) { if ($_REQUEST['relevanssi_reset_code'] == 'reset') { - relevanssi_truncate_logs(); + $verbose = true; + relevanssi_truncate_logs($verbose); } } } @@ -107,22 +109,31 @@ function relevanssi_search_stats() { relevanssi_query_log(); } else { - echo "

Enable query logging to see stats here.

"; + echo "

" . __('Enable query logging to see stats here.', 'relevanssi') . "

"; } - + echo ""; - + if ('on' != $relevanssi_hide_branding ) relevanssi_sidebar(); } -function relevanssi_truncate_logs() { +function relevanssi_truncate_logs($verbose = true) { global $wpdb, $relevanssi_variables; - + $query = "TRUNCATE " . $relevanssi_variables['log_table']; - $wpdb->query($query); - - echo "
Logs clear!
"; + $result = $wpdb->query($query); + + if ($verbose) { + if ($result !== false) { + echo "
" . __('Logs clear!', 'relevanssi') . "
"; + } + else { + echo "
" . __('Clearing the logs failed.', 'relevanssi') . "
"; + } + } + + return $result; } function update_relevanssi_options() { @@ -212,7 +223,7 @@ function update_relevanssi_options() { update_option('relevanssi_excerpt_length', $value); } } - + if (isset($_REQUEST['relevanssi_synonyms'])) { $linefeeds = array("\r\n", "\n", "\r"); $value = str_replace($linefeeds, ";", $_REQUEST['relevanssi_synonyms']); @@ -234,7 +245,7 @@ function update_relevanssi_options() { foreach ($_REQUEST as $key => $value) { if (substr($key, 0, strlen('relevanssi_weight_')) == 'relevanssi_weight_') { $type = substr($key, strlen('relevanssi_weight_')); - $post_type_weights[$type] = $value; + $post_type_weights[$type] = floatval($value); } if (substr($key, 0, strlen('relevanssi_index_type_')) == 'relevanssi_index_type_') { $type = substr($key, strlen('relevanssi_index_type_')); @@ -249,7 +260,7 @@ function update_relevanssi_options() { if ('on' == $value) $index_terms_list[$type] = true; } } - + if (count($post_type_weights) > 0) { update_option('relevanssi_post_type_weights', $post_type_weights); } @@ -262,11 +273,11 @@ function update_relevanssi_options() { if (RELEVANSSI_PREMIUM) update_option('relevanssi_index_terms', array_keys($index_terms_list)); if (isset($_REQUEST['relevanssi_admin_search'])) update_option('relevanssi_admin_search', $_REQUEST['relevanssi_admin_search']); - if (isset($_REQUEST['relevanssi_excerpts'])) update_option('relevanssi_excerpts', $_REQUEST['relevanssi_excerpts']); - if (isset($_REQUEST['relevanssi_excerpt_type'])) update_option('relevanssi_excerpt_type', $_REQUEST['relevanssi_excerpt_type']); + if (isset($_REQUEST['relevanssi_excerpts'])) update_option('relevanssi_excerpts', $_REQUEST['relevanssi_excerpts']); + if (isset($_REQUEST['relevanssi_excerpt_type'])) update_option('relevanssi_excerpt_type', $_REQUEST['relevanssi_excerpt_type']); if (isset($_REQUEST['relevanssi_excerpt_allowable_tags'])) update_option('relevanssi_excerpt_allowable_tags', $_REQUEST['relevanssi_excerpt_allowable_tags']); - if (isset($_REQUEST['relevanssi_log_queries'])) update_option('relevanssi_log_queries', $_REQUEST['relevanssi_log_queries']); - if (isset($_REQUEST['relevanssi_log_queries_with_ip'])) update_option('relevanssi_log_queries_with_ip', $_REQUEST['relevanssi_log_queries_with_ip']); + if (isset($_REQUEST['relevanssi_log_queries'])) update_option('relevanssi_log_queries', $_REQUEST['relevanssi_log_queries']); + if (isset($_REQUEST['relevanssi_log_queries_with_ip'])) update_option('relevanssi_log_queries_with_ip', $_REQUEST['relevanssi_log_queries_with_ip']); if (isset($_REQUEST['relevanssi_highlight'])) update_option('relevanssi_highlight', $_REQUEST['relevanssi_highlight']); if (isset($_REQUEST['relevanssi_highlight_docs'])) update_option('relevanssi_highlight_docs', $_REQUEST['relevanssi_highlight_docs']); if (isset($_REQUEST['relevanssi_highlight_comments'])) update_option('relevanssi_highlight_comments', $_REQUEST['relevanssi_highlight_comments']); @@ -279,8 +290,8 @@ function update_relevanssi_options() { if (isset($_REQUEST['relevanssi_extag'])) update_option('relevanssi_extag', $_REQUEST['relevanssi_extag']); if (isset($_REQUEST['relevanssi_index_fields'])) update_option('relevanssi_index_fields', $_REQUEST['relevanssi_index_fields']); if (isset($_REQUEST['relevanssi_expst'])) update_option('relevanssi_exclude_posts', $_REQUEST['relevanssi_expst']); //added by OdditY - if (isset($_REQUEST['relevanssi_hilite_title'])) update_option('relevanssi_hilite_title', $_REQUEST['relevanssi_hilite_title']); //added by OdditY - if (isset($_REQUEST['relevanssi_index_comments'])) update_option('relevanssi_index_comments', $_REQUEST['relevanssi_index_comments']); //added by OdditY + if (isset($_REQUEST['relevanssi_hilite_title'])) update_option('relevanssi_hilite_title', $_REQUEST['relevanssi_hilite_title']); //added by OdditY + if (isset($_REQUEST['relevanssi_index_comments'])) update_option('relevanssi_index_comments', $_REQUEST['relevanssi_index_comments']); //added by OdditY if (isset($_REQUEST['relevanssi_index_author'])) update_option('relevanssi_index_author', $_REQUEST['relevanssi_index_author']); if (isset($_REQUEST['relevanssi_index_excerpt'])) update_option('relevanssi_index_excerpt', $_REQUEST['relevanssi_index_excerpt']); if (isset($_REQUEST['relevanssi_fuzzy'])) update_option('relevanssi_fuzzy', $_REQUEST['relevanssi_fuzzy']); @@ -291,7 +302,6 @@ function update_relevanssi_options() { if (isset($_REQUEST['relevanssi_disable_or_fallback'])) update_option('relevanssi_disable_or_fallback', $_REQUEST['relevanssi_disable_or_fallback']); if (isset($_REQUEST['relevanssi_respect_exclude'])) update_option('relevanssi_respect_exclude', $_REQUEST['relevanssi_respect_exclude']); if (isset($_REQUEST['relevanssi_throttle'])) update_option('relevanssi_throttle', $_REQUEST['relevanssi_throttle']); - if (isset($_REQUEST['relevanssi_throttle_limit'])) update_option('relevanssi_throttle_limit', $_REQUEST['relevanssi_throttle_limit']); if (isset($_REQUEST['relevanssi_wpml_only_current'])) update_option('relevanssi_wpml_only_current', $_REQUEST['relevanssi_wpml_only_current']); if (isset($_REQUEST['relevanssi_word_boundaries'])) update_option('relevanssi_word_boundaries', $_REQUEST['relevanssi_word_boundaries']); if (isset($_REQUEST['relevanssi_default_orderby'])) update_option('relevanssi_default_orderby', $_REQUEST['relevanssi_default_orderby']); @@ -304,10 +314,10 @@ function update_relevanssi_options() { function relevanssi_add_stopword($term) { global $wpdb; if ('' == $term) return; // do not add empty $term to stopwords - added by renaissancehack - + $n = 0; $s = 0; - + $terms = explode(',', $term); if (count($terms) > 1) { foreach($terms as $term) { @@ -321,12 +331,12 @@ function relevanssi_add_stopword($term) { else { // add to stopwords $success = relevanssi_add_single_stopword($term); - + if ($success) { - printf(__("

Term '%s' added to stopwords!

", "relevanssi"), $term); + printf(__("

Term '%s' added to stopwords!

", "relevanssi"), stripslashes($term)); } else { - printf(__("

Couldn't add term '%s' to stopwords!

", "relevanssi"), $term); + printf(__("

Couldn't add term '%s' to stopwords!

", "relevanssi"), stripslashes($term)); } } } @@ -335,18 +345,20 @@ function relevanssi_add_single_stopword($term) { global $wpdb, $relevanssi_variables; if ('' == $term) return; + $term = stripslashes($term); + if (method_exists($wpdb, 'esc_like')) { - $term = $wpdb->esc_like(esc_sql($term)); + $term = esc_sql($wpdb->esc_like($term)); } else { // Compatibility for pre-4.0 WordPress - $term = like_escape(esc_sql($term)); + $term = esc_sql(like_escape($term)); } $q = $wpdb->prepare("INSERT INTO " . $relevanssi_variables['stopword_table'] . " (stopword) VALUES (%s)", $term); // Clean: escaped. $success = $wpdb->query($q); - + if ($success) { // remove from index $q = $wpdb->prepare("DELETE FROM " . $relevanssi_variables['relevanssi_table'] . " WHERE term=%s", $term); @@ -360,39 +372,54 @@ function relevanssi_add_single_stopword($term) { function relevanssi_remove_all_stopwords() { global $wpdb, $relevanssi_variables; - + $success = $wpdb->query("TRUNCATE " . $relevanssi_variables['stopword_table']); - + printf(__("

Stopwords removed! Remember to re-index.

", "relevanssi"), $term); } -function relevanssi_remove_stopword($term) { +function relevanssi_remove_stopword($term, $verbose = true) { global $wpdb, $relevanssi_variables; - + $q = $wpdb->prepare("DELETE FROM " . $relevanssi_variables['stopword_table'] . " WHERE stopword=%s", $term); $success = $wpdb->query($q); - + if ($success) { - printf(__("

Term '%s' removed from stopwords! Re-index to get it back to index.

", "relevanssi"), $term); + if ($verbose) { + echo "

"; + printf(__("Term '%s' removed from stopwords! Re-index to get it back to index.", "relevanssi"), stripslashes($term)); + echo "

"; + } + else { + return true; + } } else { - printf(__("

Couldn't remove term '%s' from stopwords!

", "relevanssi"), $term); + if ($verbose) { + echo "

"; + printf(__("Couldn't remove term '%s' from stopwords!", "relevanssi"), stripslashes($term)); + echo "

"; + } + else { + return false; + } } } -function relevanssi_common_words() { +function relevanssi_common_words($limit = 25, $wp_cli = false) { global $wpdb, $relevanssi_variables, $wp_version; - + RELEVANSSI_PREMIUM ? $plugin = 'relevanssi-premium' : $plugin = 'relevanssi'; - - echo "
"; - - echo "

" . __("25 most common words in the index", 'relevanssi') . "

"; - - echo "

" . __("These words are excellent stopword material. A word that appears in most of the posts in the database is quite pointless when searching. This is also an easy way to create a completely new stopword list, if one isn't available in your language. Click the icon after the word to add the word to the stopword list. The word will also be removed from the index, so rebuilding the index is not necessary.", 'relevanssi') . "

"; - - $words = $wpdb->get_results("SELECT COUNT(DISTINCT(doc)) as cnt, term - FROM " . $relevanssi_variables['relevanssi_table'] . " GROUP BY term ORDER BY cnt DESC LIMIT 25"); + + if (!is_numeric($limit)) $limit = 25; + + $words = $wpdb->get_results("SELECT COUNT(*) as cnt, term FROM " . $relevanssi_variables['relevanssi_table'] . " GROUP BY term ORDER BY cnt DESC LIMIT $limit"); + // Clean: $limit is numeric. + + if (!$wp_cli) { + echo "
"; + echo "

" . __("25 most common words in the index", 'relevanssi') . "

"; + echo "

" . __("These words are excellent stopword material. A word that appears in most of the posts in the database is quite pointless when searching. This is also an easy way to create a completely new stopword list, if one isn't available in your language. Click the icon after the word to add the word to the stopword list. The word will also be removed from the index, so rebuilding the index is not necessary.", 'relevanssi') . "

"; ?>
@@ -401,34 +428,41 @@ function relevanssi_common_words() {
    ' )) { - $src = plugins_url('delete.png', $relevanssi_variables['file']); + if (function_exists("plugins_url")) { + if (version_compare($wp_version, '2.8dev', '>' )) { + $src = plugins_url('delete.png', $relevanssi_variables['file']); + } + else { + $src = plugins_url($plugin . '/delete.png'); + } } else { - $src = plugins_url($plugin . '/delete.png'); + // We can't check, so let's assume something sensible + $src = '/wp-content/plugins/' . $plugin . '/delete.png'; + } + + foreach ($words as $word) { + $stop = __('Add to stopwords', 'relevanssi'); + printf('
  • %s (%d)
  • ', $word->term, $word->cnt, $src, $stop, $word->term); } + echo "
\n
"; + + echo "
"; } else { - // We can't check, so let's assume something sensible - $src = '/wp-content/plugins/' . $plugin . '/delete.png'; - } - - foreach ($words as $word) { - $stop = __('Add to stopwords', 'relevanssi'); - printf('
  • %s (%d)
  • ', $word->term, $word->cnt, $src, $stop, $word->term); + // WP CLI gets the list of words + return $words; } - echo "\n"; - - echo "
    "; } function relevanssi_query_log() { global $wpdb; + $days30 = apply_filters('relevanssi_30days', 30); + echo '

    ' . __("Total Searches", 'relevanssi') . '

    '; - echo "
    "; + echo "
    "; relevanssi_total_queries( __("Totals", 'relevanssi') ); echo '
    '; @@ -436,37 +470,38 @@ function relevanssi_query_log() { echo '

    ' . __("Common Queries", 'relevanssi') . '

    '; - $lead = __("Here you can see the 20 most common user search queries, how many times those + $limit = apply_filters('relevanssi_user_searches_limit', 20); + $lead = __("Here you can see the %d most common user search queries, how many times those queries were made and how many results were found for those queries.", 'relevanssi'); - echo "

    $lead

    "; - - echo "
    "; + sprintf("

    " . $lead . "

    ", $limit); + + echo "
    "; relevanssi_date_queries(1, __("Today and yesterday", 'relevanssi')); echo '
    '; - echo "
    "; + echo "
    "; relevanssi_date_queries(7, __("Last 7 days", 'relevanssi')); echo '
    '; - echo "
    "; - relevanssi_date_queries(30, __("Last 30 days", 'relevanssi')); + echo "
    "; + relevanssi_date_queries($days30, sprintf(__("Last %d days", 'relevanssi'), $days30)); echo '
    '; echo '
    '; - + echo '

    ' . __("Unsuccessful Queries", 'relevanssi') . '

    '; - echo "
    "; + echo "
    "; relevanssi_date_queries(1, __("Today and yesterday", 'relevanssi'), 'bad'); echo '
    '; - echo "
    "; + echo "
    "; relevanssi_date_queries(7, __("Last 7 days", 'relevanssi'), 'bad'); echo '
    '; - echo "
    "; - relevanssi_date_queries(30, __("Last 30 days", 'relevanssi'), 'bad'); + echo "
    "; + relevanssi_date_queries($days30, sprintf(__("Last %d days", 'relevanssi'), $days30), 'bad'); echo '
    '; if ( current_user_can('manage_options') ) { @@ -476,7 +511,7 @@ function relevanssi_query_log() { echo '

    ' . __('Reset Logs', 'relevanssi') . "

    \n"; echo "
    \n$nonce"; echo "

    "; - printf(__('To reset the logs, type "reset" into the box here %s and click %s', 'relevanssi'), ' ', 'and click '); + printf(__('To reset the logs, type "reset" into the box here %s and click %s', 'relevanssi'), ' ', ' '); echo "

    "; } @@ -506,15 +541,17 @@ function relevanssi_total_queries( $title ) { function relevanssi_date_queries($d, $title, $version = 'good') { global $wpdb, $relevanssi_variables; $log_table = $relevanssi_variables['log_table']; - + + $limit = apply_filters('relevanssi_user_searches_limit', 20); + if ($version == 'good') $queries = $wpdb->get_results("SELECT COUNT(DISTINCT(id)) as cnt, query, hits FROM $log_table WHERE TIMESTAMPDIFF(DAY, time, NOW()) <= $d GROUP BY query ORDER BY cnt DESC - LIMIT 20"); - + LIMIT $limit"); + if ($version == 'bad') $queries = $wpdb->get_results("SELECT COUNT(DISTINCT(id)) as cnt, query, hits FROM $log_table @@ -522,7 +559,7 @@ function relevanssi_date_queries($d, $title, $version = 'good') { AND hits = 0 GROUP BY query ORDER BY cnt DESC - LIMIT 20"); + LIMIT $limit"); if (count($queries) > 0) { echo ""; @@ -537,7 +574,7 @@ function relevanssi_date_queries($d, $title, $version = 'good') { function relevanssi_options_form() { global $relevanssi_variables, $wpdb; - + wp_enqueue_style('dashboard'); wp_print_styles('dashboard'); wp_enqueue_script('dashboard'); @@ -546,9 +583,9 @@ function relevanssi_options_form() { $docs_count = $wpdb->get_var("SELECT COUNT(DISTINCT doc) FROM " . $relevanssi_variables['relevanssi_table']); $terms_count = $wpdb->get_var("SELECT COUNT(*) FROM " . $relevanssi_variables['relevanssi_table']); $biggest_doc = $wpdb->get_var("SELECT doc FROM " . $relevanssi_variables['relevanssi_table'] . " ORDER BY doc DESC LIMIT 1"); - + $serialize_options = array(); - + $title_boost = get_option('relevanssi_title_boost'); $serialize_options['relevanssi_title_boost'] = $title_boost; $comment_boost = get_option('relevanssi_comment_boost'); @@ -573,7 +610,7 @@ function relevanssi_options_form() { else { $excerpts = ''; } - + $excerpt_length = get_option('relevanssi_excerpt_length'); $serialize_options['relevanssi_excerpt_length'] = $excerpt_length; $excerpt_type = get_option('relevanssi_excerpt_type'); @@ -609,7 +646,7 @@ function relevanssi_options_form() { $log_queries_with_ip = ''; } - $hide_branding = get_option('relevanssi_hide_branding'); + $hide_branding = get_option('relevanssi_hide_branding'); $serialize_options['relevanssi_hide_branding'] = $hide_branding; if ('on' == $hide_branding) { $hide_branding = 'checked="checked"'; @@ -617,7 +654,7 @@ function relevanssi_options_form() { else { $hide_branding = ''; } - + $highlight = get_option('relevanssi_highlight'); $serialize_options['relevanssi_highlight'] = $highlight; $highlight_none = ""; @@ -654,7 +691,7 @@ function relevanssi_options_form() { $highlight_class = 'selected="selected"'; break; } - + $index_fields = get_option('relevanssi_index_fields'); $serialize_options['relevanssi_index_fields'] = $index_fields; @@ -666,14 +703,14 @@ function relevanssi_options_form() { $serialize_options['relevanssi_css'] = $css; $class = get_option('relevanssi_class'); $serialize_options['relevanssi_class'] = $class; - + $cat = get_option('relevanssi_cat'); $serialize_options['relevanssi_cat'] = $cat; $excat = get_option('relevanssi_excat'); $serialize_options['relevanssi_excat'] = $excat; $extag = get_option('relevanssi_extag'); $serialize_options['relevanssi_extag'] = $extag; - + $fuzzy = get_option('relevanssi_fuzzy'); $serialize_options['relevanssi_fuzzy'] = $fuzzy; $fuzzy_sometimes = ('sometimes' == $fuzzy ? 'selected="selected"' : ''); @@ -698,15 +735,15 @@ function relevanssi_options_form() { $omit_from_logs = get_option('relevanssi_omit_from_logs'); $serialize_options['relevanssi_omit_from_logs'] = $omit_from_logs; - + $synonyms = get_option('relevanssi_synonyms'); $serialize_options['relevanssi_synonyms'] = $synonyms; isset($synonyms) ? $synonyms = str_replace(';', "\n", $synonyms) : $synonyms = ""; - + //Added by OdditY -> - $expst = get_option('relevanssi_exclude_posts'); + $expst = get_option('relevanssi_exclude_posts'); $serialize_options['relevanssi_exclude_posts'] = $expst; - $hititle = ('on' == get_option('relevanssi_hilite_title') ? 'checked="checked"' : ''); + $hititle = ('on' == get_option('relevanssi_hilite_title') ? 'checked="checked"' : ''); $serialize_options['relevanssi_hilite_title'] = get_option('relevanssi_hilite_title'); $incom_type = get_option('relevanssi_index_comments'); $serialize_options['relevanssi_index_comments'] = $incom_type; @@ -725,31 +762,31 @@ function relevanssi_options_form() { break; }//added by OdditY END <- - $highlight_docs = ('on' == get_option('relevanssi_highlight_docs') ? 'checked="checked"' : ''); - $highlight_coms = ('on' == get_option('relevanssi_highlight_comments') ? 'checked="checked"' : ''); + $highlight_docs = ('on' == get_option('relevanssi_highlight_docs') ? 'checked="checked"' : ''); + $highlight_coms = ('on' == get_option('relevanssi_highlight_comments') ? 'checked="checked"' : ''); $serialize_options['relevanssi_highlight_docs'] = get_option('relevanssi_highlight_docs'); $serialize_options['relevanssi_highlight_comments'] = get_option('relevanssi_highlight_comments'); - $respect_exclude = ('on' == get_option('relevanssi_respect_exclude') ? 'checked="checked"' : ''); + $respect_exclude = ('on' == get_option('relevanssi_respect_exclude') ? 'checked="checked"' : ''); $serialize_options['relevanssi_respect_exclude'] = get_option('relevanssi_respect_exclude'); $min_word_length = get_option('relevanssi_min_word_length'); $serialize_options['relevanssi_min_word_length'] = $min_word_length; - $index_author = ('on' == get_option('relevanssi_index_author') ? 'checked="checked"' : ''); + $index_author = ('on' == get_option('relevanssi_index_author') ? 'checked="checked"' : ''); $serialize_options['relevanssi_index_author'] = get_option('relevanssi_index_author'); - $index_excerpt = ('on' == get_option('relevanssi_index_excerpt') ? 'checked="checked"' : ''); + $index_excerpt = ('on' == get_option('relevanssi_index_excerpt') ? 'checked="checked"' : ''); $serialize_options['relevanssi_index_excerpt'] = get_option('relevanssi_index_excerpt'); - + $show_matches = ('on' == get_option('relevanssi_show_matches') ? 'checked="checked"' : ''); $serialize_options['relevanssi_show_matches'] = get_option('relevanssi_show_matches'); $show_matches_text = stripslashes(get_option('relevanssi_show_matches_text')); $serialize_options['relevanssi_show_matches_text'] = get_option('relevanssi_show_matches_text'); - - $wpml_only_current = ('on' == get_option('relevanssi_wpml_only_current') ? 'checked="checked"' : ''); + + $wpml_only_current = ('on' == get_option('relevanssi_wpml_only_current') ? 'checked="checked"' : ''); $serialize_options['relevanssi_wpml_only_current'] = get_option('relevanssi_wpml_only_current'); - $word_boundaries = ('on' == get_option('relevanssi_word_boundaries') ? 'checked="checked"' : ''); + $word_boundaries = ('on' == get_option('relevanssi_word_boundaries') ? 'checked="checked"' : ''); $serialize_options['relevanssi_word_boundaries'] = get_option('relevanssi_word_boundaries'); $post_type_weights = get_option('relevanssi_post_type_weights'); @@ -767,8 +804,8 @@ function relevanssi_options_form() { $serialize_options['relevanssi_default_orderby'] = $orderby; $orderby_relevance = ('relevance' == $orderby ? 'selected="selected"' : ''); $orderby_date = ('post_date' == $orderby ? 'selected="selected"' : ''); - - if (RELEVANSSI_PREMIUM) { + + if (RELEVANSSI_PREMIUM) { $api_key = get_option('relevanssi_api_key'); $serialize_options['relevanssi_api_key'] = $api_key; @@ -781,59 +818,59 @@ function relevanssi_options_form() { $intlinks_nostrip = ('nostrip' == $intlinks ? 'selected="selected"' : ''); $intlinks_noindex = ('noindex' == $intlinks ? 'selected="selected"' : ''); - $highlight_docs_ext = ('on' == get_option('relevanssi_highlight_docs_external') ? 'checked="checked"' : ''); + $highlight_docs_ext = ('on' == get_option('relevanssi_highlight_docs_external') ? 'checked="checked"' : ''); $serialize_options['relevanssi_highlight_docs_external'] = get_option('relevanssi_highlight_docs_external'); - + $thousand_separator = get_option('relevanssi_thousand_separator'); $serialize_options['relevanssi_thousand_separator'] = $thousand_separator; $disable_shortcodes = get_option('relevanssi_disable_shortcodes'); $serialize_options['relevanssi_disable_shortcodes'] = $disable_shortcodes; - - $index_users = ('on' == get_option('relevanssi_index_users') ? 'checked="checked"' : ''); + + $index_users = ('on' == get_option('relevanssi_index_users') ? 'checked="checked"' : ''); $serialize_options['relevanssi_index_users'] = get_option('relevanssi_index_users'); - + $index_user_fields = get_option('relevanssi_index_user_fields'); $serialize_options['relevanssi_index_user_fields'] = $index_user_fields; - - $index_subscribers = ('on' == get_option('relevanssi_index_subscribers') ? 'checked="checked"' : ''); + + $index_subscribers = ('on' == get_option('relevanssi_index_subscribers') ? 'checked="checked"' : ''); $serialize_options['relevanssi_index_subscribers'] = get_option('relevanssi_index_subscribers'); - $index_synonyms = ('on' == get_option('relevanssi_index_synonyms') ? 'checked="checked"' : ''); + $index_synonyms = ('on' == get_option('relevanssi_index_synonyms') ? 'checked="checked"' : ''); $serialize_options['relevanssi_index_synonyms'] = get_option('relevanssi_index_synonyms'); - - $index_taxonomies = ('on' == get_option('relevanssi_index_taxonomies') ? 'checked="checked"' : ''); + + $index_taxonomies = ('on' == get_option('relevanssi_index_taxonomies') ? 'checked="checked"' : ''); $serialize_options['relevanssi_index_taxonomies'] = get_option('relevanssi_index_taxonomies'); $index_terms = get_option('relevanssi_index_terms'); if (empty($index_terms)) $index_terms = array(); $serialize_options['relevanssi_index_terms'] = $index_terms; - - $hide_post_controls = ('on' == get_option('relevanssi_hide_post_controls') ? 'checked="checked"' : ''); + + $hide_post_controls = ('on' == get_option('relevanssi_hide_post_controls') ? 'checked="checked"' : ''); $serialize_options['relevanssi_hide_post_controls'] = get_option('relevanssi_hide_post_controls'); $recency_bonus_array = get_option('relevanssi_recency_bonus'); $serialize_options['recency_bonus'] = $recency_bonus_array; $recency_bonus = $recency_bonus_array['bonus']; $recency_bonus_days = $recency_bonus_array['days']; - + $mysql_columns = get_option('relevanssi_mysql_columns'); $serialize_options['relevanssi_mysql_columns'] = $mysql_columns; - $serialized_options = serialize($serialize_options); + $serialized_options = json_encode($serialize_options); } echo "
    "; - if (RELEVANSSI_PREMIUM) { + if (RELEVANSSI_PREMIUM) { echo "
    "; } else { echo ""; } - + wp_nonce_field(plugin_basename($relevanssi_variables['file']), 'relevanssi_options'); ?> - +

    | | | @@ -848,16 +885,16 @@ function relevanssi_options_form() { echo '' . __("Import/export options", "relevanssi") . ''; } else { - echo '' . __('Buy Relevanssi Premium', 'relevanssi') . ''; + echo '' . __('Buy Relevanssi Premium', 'relevanssi') . ''; } ?>

    - ' class='button-primary' /> - - ,

    + ' class='button-primary' /> + + ,

    :
    :

    - +

    >
    - +


    - +

    $title
    " . __('Query', 'relevanssi') . "#" . __('Hits', 'relevanssi') . "
    @@ -966,7 +997,7 @@ function relevanssi_options_form() {
    - + @@ -985,18 +1016,18 @@ function relevanssi_options_form() {

    - +

    - + - + - +

    - + @@ -1014,18 +1045,17 @@ function relevanssi_options_form() { " . __("If you enable logs, you can see what your users are searching for. You can prevent your own searches from getting in the logs with the omit feature.", "relevanssi") . "

    "; - } - else { - echo "

    " . __("If you enable logs, you can see what your users are searching for. Logs are also needed to use the 'Did you mean?' feature. You can prevent your own searches from getting in the logs with the omit feature.", "relevanssi") . "

    "; + echo "

    " . __("If you enable logs, you can see what your users are searching for. You can prevent your own searches from getting in the logs with the omit feature.", "relevanssi"); + if (!RELEVANSSI_PREMIUM) { + echo " " . __("Logs are also needed to use the 'Did you mean?' feature.", "relevanssi"); } + echo "

    "; ?>

    - +
    <input type='hidden' name='cats' value='list of cats and tags' /> in your search form. The input field will overrun this setting.", 'relevanssi'); ?> @@ -1047,12 +1077,11 @@ function relevanssi_options_form() {
    " . __("Enter a comma-separated list of post/page IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there).", 'relevanssi'); if (RELEVANSSI_PREMIUM) { - echo "" . __("Enter a comma-separated list of post/page IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there). You can also use a checkbox on post/page edit pages to remove posts from index.", 'relevanssi') . ""; - } - else { - echo "" . __("Enter a comma-separated list of post/page IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there).", 'relevanssi') . ""; + echo " " . __("You can also use a checkbox on post/page edit pages to remove posts from index. This setting doesn't work in multisite searches, but the checkbox does.", 'relevanssi'); } + echo ""; ?>

    @@ -1062,13 +1091,13 @@ function relevanssi_options_form() {

    - +
    - +

    - + - +
    - +
    @@ -1129,70 +1158,70 @@ function relevanssi_options_form() {
    - +
    - +

    - +
    - +
    - +
    - +
    - +
    - +

    - - ' class='button button-primary' /> + + ' class='button button-primary' />

    - + - + '0')); $pt_2 = get_post_types(array('exclude_from_search' => false)); $public_types = array_merge($pt_1, $pt_2); - $post_types = get_post_types(); + $post_types = get_post_types(); foreach ($post_types as $type) { if ('nav_menu_item' == $type) continue; if ('revision' == $type) continue; @@ -1202,13 +1231,13 @@ function relevanssi_options_form() { else { $checked = ''; } - $label = sprintf(__("%s", 'relevanssi'), $type); - in_array($type, $public_types) ? $public = __('yes', 'relevanssi') : $public = __('no', 'relevanssi'); - + $label = sprintf("%s", $type); + in_array($type, $public_types) ? $public = __('no', 'relevanssi') : $public = __('yes', 'relevanssi'); + echo << + + + +
    - $label + $label @@ -1220,12 +1249,24 @@ function relevanssi_options_form() { EOH; } ?> +
    + Helpful little control field + + + + This is our little secret, just for you and me +
    - + +



    - + @@ -1245,14 +1286,14 @@ function relevanssi_options_form() { else { $checked = ''; } - $label = sprintf(__("%s", 'relevanssi'), $taxonomy->name); + $label = sprintf("%s", $taxonomy->name); $taxonomy->public ? $public = __('yes', 'relevanssi') : $public = __('no', 'relevanssi'); $type = $taxonomy->name; - + echo <<
    - $label + $label @@ -1265,11 +1306,11 @@ function relevanssi_options_form() { } ?>
    - +

    - +

    - +
    @@ -1294,10 +1335,10 @@ function relevanssi_options_form() {
    - +

    - +
    - +

    @@ -1320,26 +1361,26 @@ function relevanssi_options_form() { - ' class='button button-primary' /> + ' class='button button-primary' /> - ' class='button' /> + ' class='button' />

    - +

    - + - ' class='button' /> + ' class='button' />

    - + - - + + @@ -1353,13 +1394,15 @@ function relevanssi_show_stopwords() { RELEVANSSI_PREMIUM ? $plugin = 'relevanssi-premium' : $plugin = 'relevanssi'; - _e("

    Enter a word here to add it to the list of stopwords. The word will automatically be removed from the index, so re-indexing is not necessary. You can enter many words at the same time, separate words with commas.

    ", 'relevanssi'); + echo "

    "; + _e("Enter a word here to add it to the list of stopwords. The word will automatically be removed from the index, so re-indexing is not necessary. You can enter many words at the same time, separate words with commas.", 'relevanssi'); + echo "

    "; ?> -" class='button' />

    +

    Here's a list of stopwords in the database. Click a word to remove it from stopwords. Removing stopwords won't automatically return them to index, so you need to re-index all posts after removing stopwords to get those words back to index.", 'relevanssi'); + _e("Here's a list of stopwords in the database. Click a word to remove it from stopwords. Removing stopwords won't automatically return them to index, so you need to re-index all posts after removing stopwords to get those words back to index.", 'relevanssi'); if (function_exists("plugins_url")) { if (version_compare($wp_version, '2.8dev', '>' )) { @@ -1373,23 +1416,23 @@ function relevanssi_show_stopwords() { // We can't check, so let's assume something sensible $src = '/wp-content/plugins/' . $plugin . '/delete.png'; } - - echo "

      "; + + echo "

        "; $results = $wpdb->get_results("SELECT * FROM " . $relevanssi_variables['stopword_table']); $exportlist = array(); foreach ($results as $stopword) { - $sw = $stopword->stopword; + $sw = stripslashes($stopword->stopword); printf('
      • ', esc_attr($sw)); array_push($exportlist, $sw); } echo "
      "; - + ?> -

      +

      diff --git a/mu-plugins/relevanssi/lib/search.php b/mu-plugins/relevanssi/lib/search.php index b06fc1df..12eba961 100644 --- a/mu-plugins/relevanssi/lib/search.php +++ b/mu-plugins/relevanssi/lib/search.php @@ -5,182 +5,104 @@ function relevanssi_query($posts, $query = false) { ($admin_search == 'on') ? $admin_search = true : $admin_search = false; global $relevanssi_active; - global $wp_query; + + if (!$query) return $posts; $search_ok = true; // we will search! - if (!is_search()) { + if (!$query->is_search()) { + $search_ok = false; // no, we can't + } + if (!$query->is_main_query()) { $search_ok = false; // no, we can't } // Uses $wp_query->is_admin instead of is_admin() to help with Ajax queries that // use 'admin_ajax' hook (which sets is_admin() to true whether it's an admin search // or not. - if (is_search() && $wp_query->is_admin) { + if ($query->is_search() && $query->is_admin) { $search_ok = false; // but if this is an admin search, reconsider if ($admin_search) $search_ok = true; // yes, we can search! } - if ($wp_query->is_admin && empty($wp_query->query_vars['s'])) { + if ($query->is_admin && empty($query->query_vars['s'])) { $search_ok = false; } // Disable search in media library search if ($search_ok) { - if ($wp_query->query_vars['post_type'] == 'attachment' && $wp_query->query_vars['post_status'] == 'inherit,private') { + if ($query->query_vars['post_type'] == 'attachment' && $query->query_vars['post_status'] == 'inherit,private') { $search_ok = false; } } $search_ok = apply_filters('relevanssi_search_ok', $search_ok); - + if ($relevanssi_active) { $search_ok = false; // Relevanssi is already in action } if ($search_ok) { - $wp_query = apply_filters('relevanssi_modify_wp_query', $wp_query); - $posts = relevanssi_do_query($wp_query); + $query = apply_filters('relevanssi_modify_wp_query', $query); + $posts = relevanssi_do_query($query); } return $posts; } + // This is my own magic working. function relevanssi_search($args) { global $wpdb, $relevanssi_variables; $relevanssi_table = $relevanssi_variables['relevanssi_table']; - + $filtered_args = apply_filters( 'relevanssi_search_filters', $args ); - extract($filtered_args); - + $q = $filtered_args['q']; + $tax_query = $filtered_args['tax_query']; + $tax_query_relation = $filtered_args['tax_query_relation']; + $post_query = $filtered_args['post_query']; + $parent_query = $filtered_args['parent_query']; + $meta_query = $filtered_args['meta_query']; + $date_query = $filtered_args['date_query']; + $expost = $filtered_args['expost']; + $post_type = $filtered_args['post_type']; + $post_status = $filtered_args['post_status']; + $operator = $filtered_args['operator']; + $search_blogs = $filtered_args['search_blogs']; + $author = $filtered_args['author']; + $orderby = $filtered_args['orderby']; + $order = $filtered_args['order']; + $fields = $filtered_args['fields']; + $sentence = $filtered_args['sentence']; + $hits = array(); $query_restrictions = ""; if (!isset($tax_query_relation)) $tax_query_relation = "or"; $tax_query_relation = strtolower($tax_query_relation); $term_tax_id = array(); - $term_tax_ids = array(); - $not_term_tax_ids = array(); + $term_tax_ids = array(); + $not_term_tax_ids = array(); $and_term_tax_ids = array(); - + if (is_array($tax_query)) { + $is_sub_row = false; foreach ($tax_query as $row) { - if ($row['field'] == 'slug') { - $slug = $row['terms']; - $numeric_slugs = array(); - $slug_in = null; - if (is_array($slug)) { - $slugs = array(); - $term_id = array(); - foreach ($slug as $t_slug) { - $term = get_term_by('slug', $t_slug, $row['taxonomy']); - if (!$term && is_numeric($t_slug)) { - $numeric_slugs[] = "'$t_slug'"; - } - else { - $t_slug = sanitize_title($t_slug); - $term_id[] = $term->term_id; - $slugs[] = "'$t_slug'"; - } - } - if (!empty($slugs)) $slug_in = implode(',', $slugs); - } - else { - $term = get_term_by('slug', $slug, $row['taxonomy']); - if (!$term && is_numeric($slug)) { - $numeric_slugs[] = $slug; - } - else { - $term_id = $term->term_id; - $slug_in = "'$slug'"; - } - } - if (!empty($slug_in)) { - $row_taxonomy = sanitize_title($row['taxonomy']); - $tt_q = "SELECT tt.term_taxonomy_id - FROM $wpdb->term_taxonomy AS tt - LEFT JOIN $wpdb->terms AS t ON (tt.term_id=t.term_id) - WHERE tt.taxonomy = '$row_taxonomy' AND t.slug IN ($slug_in)"; - // Clean: $row_taxonomy is sanitized, each slug in $slug_in is sanitized - $term_tax_id = $wpdb->get_col($tt_q); - } - if (!empty($numeric_slugs)) $row['field'] = 'id'; - } - if ($row['field'] == 'id' || $row['field'] == 'term_id') { - $id = $row['terms']; - $term_id = $id; - if (is_array($id)) { - $numeric_values = array(); - foreach ($id as $t_id) { - if (is_numeric($t_id)) $numeric_values[] = $t_id; - } - $id = implode(',', $numeric_values); - } - $row_taxonomy = sanitize_title($row['taxonomy']); - $tt_q = "SELECT tt.term_taxonomy_id - FROM $wpdb->term_taxonomy AS tt - LEFT JOIN $wpdb->terms AS t ON (tt.term_id=t.term_id) - WHERE tt.taxonomy = '$row_taxonomy' AND t.term_id IN ($id)"; - // Clean: $row_taxonomy is sanitized, $id is checked to be numeric - $id_term_tax_id = $wpdb->get_col($tt_q); - if (!empty($term_tax_id) && is_array($term_tax_id)) { - $term_tax_id = array_unique(array_merge($term_tax_id, $id_term_tax_id)); - } - else { - $term_tax_id = $id_term_tax_id; - } - } - - if (!isset($row['include_children']) || $row['include_children'] == true) { - if (!is_array($term_id)) { - $term_id = array($term_id); - } - foreach ($term_id as $t_id) { - $kids = get_term_children($t_id, $row['taxonomy']); - foreach ($kids as $kid) { - $term = get_term_by('id', $kid, $row['taxonomy']); - $term_tax_id[] = relevanssi_get_term_tax_id('id', $kid, $row['taxonomy']); - } - } + if (isset($row['terms'])) { + list($query_restrictions, $term_tax_ids, $not_term_tax_ids, $and_term_tax_ids) = relevanssi_process_tax_query_row($row, $is_sub_row, $tax_query_relation, $query_restrictions, $tax_query_relation, $term_tax_ids, $not_term_tax_ids, $and_term_tax_ids); } - - $term_tax_id = array_unique($term_tax_id); - if (!empty($term_tax_id)) { - $n = count($term_tax_id); - $term_tax_id = implode(',', $term_tax_id); - - $tq_operator = 'IN'; - if (isset($row['operator'])) $tq_operator = strtoupper($row['operator']); - if ($tq_operator != 'IN' && $tq_operator != 'NOT IN' && $tq_operator != 'AND') $tq_operator = 'IN'; - if ($tax_query_relation == 'and') { - if ($tq_operator == 'AND') { - $query_restrictions .= " AND relevanssi.doc IN ( - SELECT ID FROM $wpdb->posts WHERE 1=1 - AND ( - SELECT COUNT(1) - FROM $wpdb->term_relationships AS tr - WHERE tr.term_taxonomy_id IN ($term_tax_id) - AND tr.object_id = $wpdb->posts.ID ) = $n - )"; - // Clean: $term_tax_id and $n are Relevanssi-generated - } - else { - $query_restrictions .= " AND relevanssi.doc $tq_operator (SELECT DISTINCT(tr.object_id) FROM $wpdb->term_relationships AS tr - WHERE tr.term_taxonomy_id IN ($term_tax_id))"; - // Clean: all variables are Relevanssi-generated + else { + $row_tax_query_relation = $tax_query_relation; + if (isset($row['relation'])) $row_tax_query_relation = strtolower($row['relation']); + foreach ($row as $subrow) { + $is_sub_row = true; + if (isset($subrow['terms'])) { + list($query_restrictions, $term_tax_ids, $not_term_tax_ids, $and_term_tax_ids) = relevanssi_process_tax_query_row($subrow, $is_sub_row, $tax_query_relation, $query_restrictions, $tax_query_relation, $term_tax_ids, $not_term_tax_ids, $and_term_tax_ids); + // For subrows, we only want the query_restrictions } } - else { - if ($tq_operator == 'IN') $term_tax_ids[] = $term_tax_id; - if ($tq_operator == 'NOT IN') $not_term_tax_ids[] = $term_tax_id; - if ($tq_operator == 'AND') $and_term_tax_ids[] = $term_tax_id; - } - } - else { - global $wp_query; - $wp_query->is_category = false; } } + if ($tax_query_relation == 'or') { $term_tax_ids = array_unique($term_tax_ids); if (count($term_tax_ids) > 0) { @@ -199,18 +121,18 @@ function relevanssi_search($args) { $and_term_tax_ids = implode(',', $and_term_tax_ids); $n = count(explode(',', $and_term_tax_ids)); $query_restrictions .= " AND relevanssi.doc IN ( - SELECT ID FROM $wpdb->posts WHERE 1=1 + SELECT ID FROM $wpdb->posts WHERE 1=1 AND ( - SELECT COUNT(1) + SELECT COUNT(1) FROM $wpdb->term_relationships AS tr - WHERE tr.term_taxonomy_id IN ($and_term_tax_ids) + WHERE tr.term_taxonomy_id IN ($and_term_tax_ids) AND tr.object_id = $wpdb->posts.ID ) = $n )"; // Clean: all variables are Relevanssi-generated } } } - + if (is_array($post_query)) { if (!empty($post_query['in'])) { $valid_values = array(); @@ -232,144 +154,84 @@ function relevanssi_search($args) { } } - if (is_array($meta_query)) { - isset($meta_query['relation']) ? $meta_relation = strtoupper($meta_query['relation']) : $meta_relation = strtoupper(apply_filters('relevanssi_default_meta_query_relation', 'AND')); - if ($meta_relation != 'AND' && $meta_relation != 'OR') $meta_relation = "AND"; - // legal values: AND and OR - - $meta_query_restrictions = ""; - foreach ($meta_query as $array_key => $meta) { - if ($array_key === 'relation') { - continue; - } - - if (!empty($meta['key'])) { - $key = "postmeta.meta_key = '" . esc_sql($meta['key']) . "'"; - } - else { - $key = ''; - } - - isset($meta['compare']) ? $compare = strtoupper($meta['compare']) : $compare = '='; - - if (isset($meta['type'])) { - if (strtoupper($meta['type']) == 'NUMERIC') $meta['type'] = "SIGNED"; - if (!in_array(strtoupper($meta['type']), array('NUMERIC', 'BINARY', 'CHAR', 'DATE', 'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', 'UNSIGNED'))) { - // illegal value - $meta_value = 'postmeta.meta_value'; - } - else { - // legal value - $meta_value = "CAST(postmeta.meta_value AS " . $meta['type'] . ")"; - } - } - else { - $meta_value = 'postmeta.meta_value'; - } - - if ($compare == 'BETWEEN' || $compare == 'NOT BETWEEN') { - if (!is_array($meta['value'])) continue; - if (count($meta['value']) < 2) continue; - $compare == 'BETWEEN' ? $compare = "IN" : $compare = "NOT IN"; - $low_value = esc_sql($meta['value'][0]); - $high_value = esc_sql($meta['value'][1]); - // No need to check that low is lower than high, because the meta query - // doesn't work, if the values are wrong. - - !empty($key) ? $and = " AND " : $and = ""; - $meta_query_restrictions .= " $meta_relation relevanssi.doc $compare ( - SELECT DISTINCT(postmeta.post_id) FROM $wpdb->postmeta AS postmeta - WHERE $key $and $meta_value BETWEEN $low_value AND $high_value)"; - // Clean: values either Relevanssi-generated or escaped - } - else if ($compare == 'EXISTS' || $compare == 'NOT EXISTS') { - $compare == 'EXISTS' ? $compare = "IN" : $compare = "NOT IN"; - $meta_query_restrictions .= " $meta_relation relevanssi.doc $compare ( - SELECT DISTINCT(postmeta.post_id) FROM $wpdb->postmeta AS postmeta - WHERE $key)"; - // Clean: values either Relevanssi-generated or escaped - } - else if ($compare == 'IN' || $compare == 'NOT IN') { - if (!is_array($meta['value'])) continue; - $values = array(); - foreach ($meta['value'] as $value) { - $value = esc_sql($value); - $values[] = "'$value'"; - } - $values = implode(',', $values); - !empty($key) ? $and = " AND " : $and = ""; - $meta_query_restrictions .= " $meta_relation relevanssi.doc IN ( - SELECT DISTINCT(postmeta.post_id) FROM $wpdb->postmeta AS postmeta - WHERE $key $and $meta_value $compare ($values))"; - // Clean: values either Relevanssi-generated or escaped - } - else if ($compare == 'LIKE') { - if (method_exists($wpdb, 'esc_like')) { - $escaped_value = $wpdb->esc_like($meta['value']); - } - else { - // Compatibility for pre-4.0 WordPress - $escaped_value = like_escape($meta['value']); - } - isset($meta['value']) ? $value = " " . esc_sql($meta_value) . " " . $meta['compare'] . " '%" . $escaped_value . "%' " : $value = ''; - (!empty($key) && !empty($value)) ? $and = " AND " : $and = ""; - if (empty($key) && empty($and) && empty($value)) { - // do nothing - } - else { - $meta_query_restrictions .= " $meta_relation relevanssi.doc IN ( - SELECT DISTINCT(postmeta.post_id) FROM $wpdb->postmeta AS postmeta - WHERE $key $and $value)"; - // Clean: values either Relevanssi-generated or escaped - } + if (is_array($parent_query)) { + if (!empty($parent_query['parent in'])) { + $valid_values = array(); + foreach($parent_query['parent in'] as $post_in_id) { + if (is_numeric($post_in_id)) $valid_values[] = $post_in_id; } - else { - isset($meta['value']) ? $value = " " . esc_sql($meta_value) . " " . $meta['compare'] . " '" . esc_sql($meta['value']) . "' " : $value = ''; - (!empty($key) && !empty($value)) ? $and = " AND " : $and = ""; - if (empty($key) && empty($and) && empty($value)) { - // do nothing - } - else { - $meta_query_restrictions .= " $meta_relation relevanssi.doc IN ( - SELECT DISTINCT(postmeta.post_id) FROM $wpdb->postmeta AS postmeta - WHERE $key $and $value)"; - // Clean: values either Relevanssi-generated or escaped - } + $posts = implode(',', $valid_values); + if (!empty($posts)) $query_restrictions .= " AND relevanssi.doc IN (SELECT ID FROM $wpdb->posts WHERE post_parent IN ($posts))"; + // Clean: $posts is checked to be integers + } + if (!empty($parent_query['parent not in'])) { + $valid_values = array(); + foreach($parent_query['parent not in'] as $post_not_in_id) { + if (is_numeric($post_not_in_id)) $valid_values[] = $post_not_in_id; } + $posts = implode(',', $valid_values); + if (!empty($posts)) $query_restrictions .= " AND relevanssi.doc NOT IN (SELECT ID FROM $wpdb->posts WHERE post_parent IN ($posts))"; + // Clean: $posts is checked to be integers } - - if ($meta_relation == 'OR') { - $meta_query_restrictions = substr($meta_query_restrictions, 3); // strip the first OR - $meta_query_restrictions = "AND (" . $meta_query_restrictions . ") "; + } + + if (is_array($meta_query)) { + $meta_query_restrictions = ""; + + $mq_vars = array('meta_query' => $meta_query ); + + $mq = new WP_Meta_Query(); + $mq->parse_query_vars( $mq_vars ); + $meta_sql = $mq->get_sql('post', 'relevanssi', 'doc'); + $meta_join = ""; + $meta_where = ""; + if ($meta_sql) { + $meta_join = $meta_sql['join']; + $meta_where = $meta_sql['where']; } - $query_restrictions .= $meta_query_restrictions; + + $query_restrictions .= $meta_where; } if (!empty($date_query)) { if (is_object($date_query) && method_exists($date_query, 'get_sql')) { - $sql = $date_query->get_sql(); // AND ( the query itself ) + $sql = $date_query->get_sql(); // AND ( the query itself ) $query_restrictions .= " AND relevanssi.doc IN ( SELECT DISTINCT(ID) FROM $wpdb->posts WHERE 1 $sql )"; // Clean: $sql generated by $date_query->get_sql() query } } - if (!$post_type && get_option('relevanssi_respect_exclude') == 'on') { - if (function_exists('get_post_types')) { - $pt_1 = get_post_types(array('exclude_from_search' => '0')); - $pt_2 = get_post_types(array('exclude_from_search' => false)); - $post_type = implode(',', array_merge($pt_1, $pt_2)); - } + // If $post_type is not set, see if there are post types to exclude from the search. + // If $post_type is set, there's no need to exclude, as we only include. + !$post_type ? $negative_post_type = relevanssi_get_negative_post_type() : $negative_post_type = NULL; + + $non_post_post_type = NULL; + $non_post_post_types_array = array(); + if (function_exists('relevanssi_get_non_post_post_types')) { + $non_post_post_types_array = relevanssi_get_non_post_post_types(); } if ($post_type) { if ($post_type == -1) $post_type = null; // Facetious sets post_type to -1 if not selected if (!is_array($post_type)) { - $post_types = esc_sql(explode(',', $post_type)); + $post_types = explode(',', $post_type); } else { - $post_types = esc_sql($post_type); + $post_types = $post_type; } - $post_type = count($post_types) ? "'" . implode( "', '", $post_types) . "'" : 'NULL'; + // This array will contain all regular post types involved in the search parameters. + $post_post_types = array_diff($post_types, $non_post_post_types_array); + + // This array has the non-post post types involved. + $non_post_post_types = array_intersect($post_types, $non_post_post_types_array); + + // Escape both for SQL queries, just in case. + $non_post_post_types = esc_sql($non_post_post_types); + $post_types = esc_sql($post_post_types); + + // Implode to a parameter string, or set to NULL if empty. + $non_post_post_type = count($non_post_post_types) ? "'" . implode( "', '", $non_post_post_types) . "'" : NULL; + $post_type = count($post_types) ? "'" . implode( "', '", $post_types) . "'" : NULL; } if ($post_status) { @@ -380,7 +242,7 @@ function relevanssi_search($args) { $post_statuses = esc_sql($post_status); } - $post_status = count($post_statuses) ? "'" . implode( "', '", $post_statuses) . "'" : 'NULL'; + $post_status = count($post_statuses) ? "'" . implode( "', '", $post_statuses) . "'" : NULL; } //Added by OdditY: @@ -394,7 +256,7 @@ function relevanssi_search($args) { $postex .= " AND relevanssi.doc != '$exid'"; // Clean: escaped } - } + } } // <- OdditY End @@ -402,7 +264,14 @@ function relevanssi_search($args) { $query_restrictions .= $postex; } - $remove_stopwords = true; + $remove_stopwords = apply_filters('relevanssi_remove_stopwords_in_titles', true); + if (function_exists('wp_encode_emoji')) $q = wp_encode_emoji($q); + + if ($sentence) { + $q = str_replace('"', '', $q); + $q = '"' . $q . '"'; + } + $phrases = relevanssi_recognize_phrases($q); if (function_exists('relevanssi_recognize_negatives')) { @@ -411,7 +280,7 @@ function relevanssi_search($args) { else { $negative_terms = false; } - + if (function_exists('relevanssi_recognize_positives')) { $positive_terms = relevanssi_recognize_positives($q); } @@ -427,13 +296,13 @@ function relevanssi_search($args) { } $terms = array_keys($terms); // don't care about tf in query - if ($negative_terms) { + if ($negative_terms) { $terms = array_diff($terms, $negative_terms); - if (count($terms) < 1) { +/* if (count($terms) < 1) { return $hits; } - } - +*/ } + // Go get the count from the options table, but keep running the full query if it's not available $D = get_option('relevanssi_doc_count'); if (!$D || $D < 1) { @@ -441,20 +310,22 @@ function relevanssi_search($args) { // Clean: no external inputs update_option('relevanssi_doc_count', $D); } - + $total_hits = 0; - + $title_matches = array(); $tag_matches = array(); $comment_matches = array(); $link_matches = array(); $body_matches = array(); + $category_matches = array(); + $taxonomy_matches = array(); $scores = array(); $term_hits = array(); $fuzzy = get_option('relevanssi_fuzzy'); - if (function_exists('relevanssi_negatives_positives')) { + if (function_exists('relevanssi_negatives_positives')) { $query_restrictions .= relevanssi_negatives_positives($negative_terms, $positive_terms, $relevanssi_table); // Clean: escaped in the function } @@ -484,21 +355,57 @@ function relevanssi_search($args) { // Clean: $authors is always just numbers } } - + if ($post_type) { - // the -1 is there to get user profiles and category pages - $query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts - WHERE posts.post_type IN ($post_type))) OR (doc = -1))"; + // A post type is set: add a restriction + $restriction = " AND ( + relevanssi.doc IN ( + SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts + WHERE posts.post_type IN ($post_type) + ) *np* + )"; // Clean: $post_type is escaped + + // There are post types involved that are taxonomies or users, so can't + // match to wp_posts. Add a relevanssi.type restriction. + if ($non_post_post_type) { + $restriction = str_replace('*np*', "OR (relevanssi.type IN ($non_post_post_type))", $restriction); + // Clean: $non_post_post_types is escaped + } else { + // No non-post post types, so remove the placeholder. + $restriction = str_replace('*np*', '', $restriction); + } + $query_restrictions .= $restriction; + } + else { + // No regular post types + if ($non_post_post_type) { + // But there is a non-post post type restriction. + $query_restrictions .= " AND (relevanssi.type IN ($non_post_post_type))"; + // Clean: $non_post_post_types is escaped + } } - if ($post_status) { - // the -1 is there to get user profiles and category pages + if ($negative_post_type) { $query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts - WHERE posts.post_status IN ($post_status))) OR (doc = -1))"; + WHERE posts.post_type NOT IN ($negative_post_type))) OR (doc = -1))"; + // Clean: $negative_post_type is escaped + } + + if ($post_status) { + global $wp_query; + if ($wp_query->is_admin) { + $query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts + WHERE posts.post_status IN ($post_status))))"; + } + else { + // the -1 is there to get user profiles and category pages + $query_restrictions .= " AND ((relevanssi.doc IN (SELECT DISTINCT(posts.ID) FROM $wpdb->posts AS posts + WHERE posts.post_status IN ($post_status))) OR (doc = -1))"; + } // Clean: $post_status is escaped } - + if ($phrases) { $query_restrictions .= " $phrases"; // Clean: $phrases is escaped earlier @@ -538,7 +445,9 @@ function relevanssi_search($args) { } $query_restrictions = apply_filters('relevanssi_where', $query_restrictions); // Charles St-Pierre - $query_join = apply_filters('relevanssi_join', ''); + $query_join = ""; + if (!empty($meta_join)) $query_join = $meta_join; + $query_join = apply_filters('relevanssi_join', $query_join); $no_matches = true; if ("always" == $fuzzy) { @@ -548,6 +457,11 @@ function relevanssi_search($args) { $o_term_cond = " relevanssi.term = '#term#' "; } + if (count($terms) < 1) { + $o_term_cond = " relevanssi.term = relevanssi.term "; + $terms[] = "term"; + } + $post_type_weights = get_option('relevanssi_post_type_weights'); if (function_exists('relevanssi_get_recency_bonus')) { list($recency_bonus, $recency_cutoff_date) = relevanssi_get_recency_bonus(); @@ -568,7 +482,7 @@ function relevanssi_search($args) { do { foreach ($terms as $term) { $term = trim($term); // numeric search terms will start with a space - if (strlen($term) < $min_length) continue; + if (apply_filters('relevanssi_block_one_letter_searches', relevanssi_strlen($term) < 2)) continue; $term = esc_sql($term); if (strpos($o_term_cond, 'LIKE') !== false) { @@ -581,20 +495,23 @@ function relevanssi_search($args) { $term = like_escape($term); } } - - $term_cond = str_replace('#term#', $term, $o_term_cond); - + + $term_cond = str_replace('#term#', $term, $o_term_cond); + !empty($post_type_weights['post_tag']) ? $tag = $post_type_weights['post_tag'] : $tag = $relevanssi_variables['post_type_weight_defaults']['post_tag']; !empty($post_type_weights['category']) ? $cat = $post_type_weights['category'] : $cat = $relevanssi_variables['post_type_weight_defaults']['category']; - $query = "SELECT relevanssi.*, relevanssi.title * $title_boost + relevanssi.content + relevanssi.comment * $comment_boost + relevanssi.tag * $tag + relevanssi.link * $link_boost + relevanssi.author + relevanssi.category * $cat + relevanssi.excerpt + relevanssi.taxonomy + relevanssi.customfield + relevanssi.mysqlcolumn AS tf - FROM $relevanssi_table AS relevanssi $query_join WHERE $term_cond $query_restrictions"; + $query = "SELECT DISTINCT(relevanssi.doc), relevanssi.*, relevanssi.title * $title_boost + + relevanssi.content + relevanssi.comment * $comment_boost + + relevanssi.tag * $tag + relevanssi.link * $link_boost + + relevanssi.author + relevanssi.category * $cat + relevanssi.excerpt + + relevanssi.taxonomy + relevanssi.customfield + relevanssi.mysqlcolumn AS tf + FROM $relevanssi_table AS relevanssi $query_join WHERE $term_cond $query_restrictions"; // Clean: $query_restrictions is escaped, $term_cond is escaped - - $query = apply_filters('relevanssi_query_filter', $query); + $query = apply_filters('relevanssi_query_filter', $query); $matches = $wpdb->get_results($query); - + if (count($matches) < 1) { continue; } @@ -607,35 +524,43 @@ function relevanssi_search($args) { $existing_ids[] = $match->doc; } $existing_ids = implode(',', $existing_ids); - $query = "SELECT relevanssi.*, relevanssi.title * $title_boost + relevanssi.content + relevanssi.comment * $comment_boost + relevanssi.tag * $tag + relevanssi.link * $link_boost + relevanssi.author + relevanssi.category * $cat + relevanssi.excerpt + relevanssi.taxonomy + relevanssi.customfield + relevanssi.mysqlcolumn AS tf - FROM $relevanssi_table AS relevanssi WHERE relevanssi.doc IN ($post_ids_to_add) AND relevanssi.doc NOT IN ($existing_ids) AND $term_cond"; + $query = "SELECT relevanssi.*, relevanssi.title * $title_boost + + relevanssi.content + relevanssi.comment * $comment_boost + + relevanssi.tag * $tag + relevanssi.link * $link_boost + + relevanssi.author + relevanssi.category * $cat + relevanssi.excerpt + + relevanssi.taxonomy + relevanssi.customfield + relevanssi.mysqlcolumn AS tf + FROM $relevanssi_table AS relevanssi WHERE relevanssi.doc IN ($post_ids_to_add) + AND relevanssi.doc NOT IN ($existing_ids) AND $term_cond"; // Clean: no unescaped user inputs $matches_to_add = $wpdb->get_results($query); $matches = array_merge($matches, $matches_to_add); } } - + relevanssi_populate_array($matches); global $relevanssi_post_types; $total_hits += count($matches); - - $query = "SELECT COUNT(DISTINCT(relevanssi.doc)) FROM $relevanssi_table AS relevanssi $query_join WHERE $term_cond $query_restrictions"; + + $query = "SELECT COUNT(DISTINCT(relevanssi.doc)) FROM $relevanssi_table AS relevanssi + $query_join WHERE $term_cond $query_restrictions"; // Clean: $query_restrictions is escaped, $term_cond is escaped $query = apply_filters('relevanssi_df_query_filter', $query); - + $df = $wpdb->get_var($query); - + if ($df < 1 && "sometimes" == $fuzzy) { - $query = "SELECT COUNT(DISTINCT(relevanssi.doc)) FROM $relevanssi_table AS relevanssi $query_join - WHERE (relevanssi.term LIKE '$term%' OR relevanssi.term_reverse LIKE CONCAT(REVERSE('$term), %')) $query_restrictions"; + $query = "SELECT COUNT(DISTINCT(relevanssi.doc)) FROM $relevanssi_table AS relevanssi + $query_join WHERE (relevanssi.term LIKE '$term%' + OR relevanssi.term_reverse LIKE CONCAT(REVERSE('$term), %')) $query_restrictions"; // Clean: $query_restrictions is escaped, $term is escaped $query = apply_filters('relevanssi_df_query_filter', $query); $df = $wpdb->get_var($query); } - + $idf = log($D + 1 / (1 + $df)); $idf = $idf * $idf; + if ($idf < 1) $idf = 1; foreach ($matches as $match) { if ('user' == $match->type) { $match->doc = 'u_' . $match->item; @@ -661,7 +586,7 @@ function relevanssi_search($args) { } } } - + $match->tf = $match->title * $title_boost + $match->content + @@ -687,7 +612,7 @@ function relevanssi_search($args) { $match->mysqlcolumn; $match->weight = $match->tf * $idf; - + if ($recency_bonus) { $post = relevanssi_get_post($match->doc); if (strtotime($post->post_date) > $recency_cutoff_date) @@ -698,20 +623,22 @@ function relevanssi_search($args) { isset($title_matches[$match->doc]) ? $title_matches[$match->doc] += $match->title : $title_matches[$match->doc] = $match->title; isset($link_matches[$match->doc]) ? $link_matches[$match->doc] += $match->link : $link_matches[$match->doc] = $match->link; isset($tag_matches[$match->doc]) ? $tag_matches[$match->doc] += $match->tag : $tag_matches[$match->doc] = $match->tag; + isset($category_matches[$match->doc]) ? $category_matches[$match->doc] += $match->category : $category_matches[$match->doc] = $match->category; + isset($taxonomy_matches[$match->doc]) ? $taxonomy_matches[$match->doc] += $match->taxonomy : $taxonomy_matches[$match->doc] = $match->taxonomy; isset($comment_matches[$match->doc]) ? $comment_matches[$match->doc] += $match->comment : $comment_matches[$match->doc] = $match->comment; - + isset($relevanssi_post_types[$match->doc]) ? $type = $relevanssi_post_types[$match->doc] : $type = null; if (!empty($post_type_weights[$type])) { $match->weight = $match->weight * $post_type_weights[$type]; } - $match = apply_filters('relevanssi_match', $match, $idf); + $match = apply_filters('relevanssi_match', $match, $idf, $term); if ($match->weight == 0) continue; // the filters killed the match $post_ok = true; $post_ok = apply_filters('relevanssi_post_ok', $post_ok, $match->doc); - + if ($post_ok) { $doc_terms[$match->doc][$term] = true; // count how many terms are matched to a doc isset($doc_weight[$match->doc]) ? $doc_weight[$match->doc] += $match->weight : $doc_weight[$match->doc] = $match->weight; @@ -725,7 +652,6 @@ function relevanssi_search($args) { } if (!isset($doc_weight)) $no_matches = true; - if ($no_matches) { if ($search_again) { // no hits even with fuzzy search! @@ -742,7 +668,7 @@ function relevanssi_search($args) { $search_again = false; } } while ($search_again); - + $strip_stops = true; $temp_terms_without_stops = array_keys(relevanssi_tokenize(implode(' ', $terms), $strip_stops)); $terms_without_stops = array(); @@ -765,8 +691,22 @@ function relevanssi_search($args) { continue; } - $hits[intval($i)] = relevanssi_get_post($doc); - $hits[intval($i)]->relevance_score = round($weight, 2); + if (!empty($fields)) { + if ($fields == 'ids') { + $hits[intval($i)] = $doc; + } + if ($fields == 'id=>parent') { + $object = new StdClass(); + $object->ID = $doc; + $object->post_parent = wp_get_post_parent_id($doc); + + $hits[intval($i)] = $object; + } + } + else { + $hits[intval($i)] = relevanssi_get_post($doc); + $hits[intval($i)]->relevance_score = round($weight, 2); + } $i++; } } @@ -775,30 +715,43 @@ function relevanssi_search($args) { if ($operator == "AND" AND get_option('relevanssi_disable_or_fallback') != 'on') { $or_args = $args; $or_args['operator'] = "OR"; + global $wp_query; + $wp_query->set("operator", "OR"); + $or_args['q'] = relevanssi_add_synonyms($q); $return = relevanssi_search($or_args); extract($return); } } - global $wp; + global $wp; $default_order = get_option('relevanssi_default_orderby', 'relevance'); if (empty($orderby)) $orderby = $default_order; // the sorting function checks for non-existing keys, cannot whitelist here - if (empty($order)) $order = 'desc'; - $order = strtolower($order); - $order_accepted_values = array('asc', 'desc'); - if (!in_array($order, $order_accepted_values)) $order = 'desc'; - - $orderby = apply_filters('relevanssi_orderby', $orderby); - $order = apply_filters('relevanssi_order', $order); - - if ($orderby != 'relevance') - relevanssi_object_sort($hits, $orderby, $order); + if (is_array($orderby)) { + $orderby = apply_filters('relevanssi_orderby', $orderby); + + relevanssi_object_sort($hits, $orderby); + } + else { + if (empty($order)) $order = 'desc'; + $order = strtolower($order); + $order_accepted_values = array('asc', 'desc'); + if (!in_array($order, $order_accepted_values)) $order = 'desc'; + + $orderby = apply_filters('relevanssi_orderby', $orderby); + $order = apply_filters('relevanssi_order', $order); + + if ($orderby != 'relevance') { + $orderby_array = array($orderby => $order); + relevanssi_object_sort($hits, $orderby_array); + } + } $return = array('hits' => $hits, 'body_matches' => $body_matches, 'title_matches' => $title_matches, - 'tag_matches' => $tag_matches, 'comment_matches' => $comment_matches, 'scores' => $scores, + 'tag_matches' => $tag_matches, 'category_matches' => $category_matches, 'taxonomy_matches' => $taxonomy_matches, + 'comment_matches' => $comment_matches, 'scores' => $scores, 'term_hits' => $term_hits, 'query' => $q, 'link_matches' => $link_matches); return $return; @@ -817,19 +770,87 @@ function relevanssi_do_query(&$query) { else $q = trim(stripslashes(strtolower($query->query_vars["s"]))); - if (isset($query->query_vars['searchblogs'])) { - $search_blogs = $query->query_vars['searchblogs']; + $search_multisite = false; + if (isset($query->query_vars['searchblogs']) && (string) get_current_blog_id() != $query->query_vars['searchblogs']) { + $search_multisite = true; + } + + if (isset($query->query_vars['searchblogs']) && $search_multisite) { + $multi_args['search_blogs'] = $query->query_vars['searchblogs']; + $multi_args['q'] = $q; $post_type = false; if (isset($query->query_vars["post_type"]) && $query->query_vars["post_type"] != 'any') { - $post_type = $query->query_vars["post_type"]; + $multi_args['post_type'] = $query->query_vars["post_type"]; } if (isset($query->query_vars["post_types"]) && $query->query_vars["post_types"] != 'any') { - $post_type = $query->query_vars["post_types"]; + $multi_args['post_type'] = $query->query_vars["post_types"]; } + $operator = ""; + if (function_exists('relevanssi_set_operator')) { + $operator = relevanssi_set_operator($query); + $operator = strtoupper($operator); // just in case + } + if ($operator != "OR" && $operator != "AND") $operator = get_option("relevanssi_implicit_operator"); + $multi_args['operator'] = $operator; + + $meta_query = array(); + if ( ! empty( $query->query_vars["meta_query"] ) ) { + $meta_query = $query->query_vars["meta_query"]; + } + + if ( isset( $query->query_vars["customfield_key"] ) ) { + $build_meta_query = array(); + + // Use meta key + $build_meta_query['key'] = $query->query_vars["customfield_key"]; + + /** + * Check the value is not empty for ordering purpose, + * Set it or not for the current meta query + */ + if ( ! empty( $query->query_vars["customfield_value"] ) ) { + $build_meta_query['value'] = $query->query_vars["customfield_value"]; + } + + // Set the compare + $build_meta_query['compare'] = '='; + + $meta_query[] = $build_meta_query; + } + + if ( ! empty($query->query_vars["meta_key"] ) || ! empty($query->query_vars["meta_value"] ) || ! empty( $query->query_vars["meta_value_num"] ) ) { + + $build_meta_query = array(); + + // Use meta key + $build_meta_query['key'] = $query->query_vars["meta_key"]; + + $value = null; + if ( ! empty( $query->query_vars["meta_value"] ) ) { + $value = $query->query_vars["meta_value"]; + } elseif ( ! empty( $query->query_vars["meta_value_num"] ) ) { + $value = $query->query_vars["meta_value_num"]; + } + + /** + * Check the meta value, as it could be not set for ordering purpose + * set it or not for the current meta query + */ + if ( ! empty( $value ) ) { + $build_meta_query['value'] = $value; + } + + // Set meta compare + $build_meta_query['compare'] = ! empty( $query->query_vars["meta_compare"] ) ? $query->query_vars["meta_compare"] : '='; + + $meta_query[] = $build_meta_query; + } + + $multi_args['meta_query'] = $meta_query; if (function_exists('relevanssi_search_multi')) { - $return = relevanssi_search_multi($q, $search_blogs, $post_type); + $return = relevanssi_search_multi($multi_args); } } else { @@ -942,14 +963,14 @@ function relevanssi_do_query(&$query) { if (isset($extag) && $extag != 0) { $tax_query[] = array('taxonomy' => 'post_tag', 'field' => 'id', 'terms' => $extag, 'operator' => 'NOT IN'); } - + if (isset($query->query_vars["taxonomy"])) { if (function_exists('relevanssi_process_taxonomies')) { $tax_query = relevanssi_process_taxonomies($query->query_vars["taxonomy"], $query->query_vars["term"], $tax_query); } else { if (!empty($query->query_vars["term"])) $term = $query->query_vars["term"]; - + $tax_query[] = array('taxonomy' => $query->query_vars["taxonomy"], 'field' => 'slug', 'terms' => $term); } } @@ -963,7 +984,7 @@ function relevanssi_do_query(&$query) { $author_object = get_user_by('slug', $query->query_vars["author_name"]); $author[] = $author_object->ID; } - + $post_query = array(); if (!empty($query->query_vars['p'])) { $post_query = array('in' => array($query->query_vars['p'])); @@ -978,40 +999,83 @@ function relevanssi_do_query(&$query) { $post_query = array('not in' => $query->query_vars['post__not_in']); } - $meta_query = array(); - $meta_query_relation = apply_filters('relevanssi_default_meta_query_relation', 'AND'); - - if (!empty($query->query_vars["meta_query"])) { - $meta_query = $query->query_vars["meta_query"]; + $parent_query = array(); + if (!empty($query->query_vars['post_parent'])) { + $parent_query = array('parent in' => array($query->query_vars['post_parent'])); } - if (isset($query->query_vars["customfield_key"])) { - isset($query->query_vars["customfield_value"]) ? $value = $query->query_vars["customfield_value"] : $value = null; - $meta_query[] = array('key' => $query->query_vars["customfield_key"], 'value' => $value, 'compare' => '='); + if (!empty($query->query_vars['post_parent__in'])) { + $parent_query = array('parent in' => $query->query_vars['post_parent__in']); } - if (!empty($query->query_vars["meta_key"]) || - !empty($query->query_vars["meta_value"]) || - !empty($query->query_vars["meta_value_num"])) { - $value = null; - if (!empty($query->query_vars["meta_value"])) $value = $query->query_vars["meta_value"]; - if (!empty($query->query_vars["meta_value_num"])) $value = $query->query_vars["meta_value_num"]; - !empty($query->query_vars["meta_compare"]) ? $compare = $query->query_vars["meta_compare"] : $compare = '='; - $meta_query[] = array('key' => $query->query_vars["meta_key"], 'value' => $value, 'compare' => $compare); + if (!empty($query->query_vars['post_parent__not_in'])) { + $parent_query = array('parent not in' => $query->query_vars['post_parent__not_in']); } - $date_query = false; - if (!empty($query->date_query)) { - if (is_object($query->date_query) && get_class($query->date_query) == 'WP_Date_Query') { // there is no is_WP_Date_Query_Object() function - $date_query = $query->date_query; - } else { - $date_query = new WP_Date_Query($query->date_query); - } + $meta_query_relation = apply_filters('relevanssi_default_meta_query_relation', 'AND'); + $meta_query = array(); + if ( ! empty( $query->query_vars["meta_query"] ) ) { + $meta_query = $query->query_vars["meta_query"]; + } + + if ( isset( $query->query_vars["customfield_key"] ) ) { + $build_meta_query = array(); + + // Use meta key + $build_meta_query['key'] = $query->query_vars["customfield_key"]; + + /** + * Check the value is not empty for ordering purpose, + * Set it or not for the current meta query + */ + if ( ! empty( $query->query_vars["customfield_value"] ) ) { + $build_meta_query['value'] = $query->query_vars["customfield_value"]; + } + + // Set the compare + $build_meta_query['compare'] = '='; + $meta_query[] = $build_meta_query; + } + + if ( ! empty($query->query_vars["meta_key"] ) || ! empty($query->query_vars["meta_value"] ) || ! empty( $query->query_vars["meta_value_num"] ) ) { + $build_meta_query = array(); + + // Use meta key + $build_meta_query['key'] = $query->query_vars["meta_key"]; + + $value = null; + if ( ! empty( $query->query_vars["meta_value"] ) ) { + $value = $query->query_vars["meta_value"]; + } elseif ( ! empty( $query->query_vars["meta_value_num"] ) ) { + $value = $query->query_vars["meta_value_num"]; + } + + /** + * Check the meta value, as it could be not set for ordering purpose + * set it or not for the current meta query + */ + if ( ! empty( $value ) ) { + $build_meta_query['value'] = $value; + } + + // Set meta compare + $build_meta_query['compare'] = ! empty( $query->query_vars["meta_compare"] ) ? $query->query_vars["meta_compare"] : '='; + + $meta_query[] = $build_meta_query; + } + + $date_query = false; + if (!empty($query->date_query)) { + if (is_object($query->date_query) && get_class($query->date_query) == 'WP_Date_Query') { // there is no is_WP_Date_Query_Object() function + $date_query = $query->date_query; + } else { + $date_query = new WP_Date_Query($query->date_query); + } } $search_blogs = false; if (isset($query->query_vars["search_blogs"])) { $search_blogs = $query->query_vars["search_blogs"]; } - + $post_type = false; if (isset($query->query_vars["post_type"]) && $query->query_vars["post_type"] != 'any') { $post_type = $query->query_vars["post_type"]; @@ -1019,46 +1083,63 @@ function relevanssi_do_query(&$query) { if (isset($query->query_vars["post_types"]) && $query->query_vars["post_types"] != 'any') { $post_type = $query->query_vars["post_types"]; } - + if ($post_type == -1) $post_type = false; - $post_status = false; + $post_status = false; if (isset($query->query_vars["post_status"]) && $query->query_vars["post_status"] != 'any') { $post_status = $query->query_vars["post_status"]; } $expost = get_option("relevanssi_exclude_posts"); - - if (is_admin()) { - // in admin search, search everything + + // In admin (and when not AJAX), search everything + if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) { $excat = null; $extag = null; $expost = null; } + $sentence = false; + if (isset($query->query_vars['sentence']) && !empty($query->query_vars['sentence'])) { + $sentence = true; + } + $operator = ""; if (function_exists('relevanssi_set_operator')) { $operator = relevanssi_set_operator($query); $operator = strtoupper($operator); // just in case } if ($operator != "OR" && $operator != "AND") $operator = get_option("relevanssi_implicit_operator"); - + $query->query_vars["operator"] = $operator; + isset($query->query_vars['orderby']) ? $orderby = $query->query_vars['orderby'] : $orderby = null; isset($query->query_vars['order']) ? $order = $query->query_vars['order'] : $order = null; - + + $fields = ""; + if (!empty($query->query_vars['fields'])) { + if ($query->query_vars['fields'] == 'ids') { + $fields = 'ids'; + } + if ($query->query_vars['fields'] == 'id=>parent') { + $fields = 'id=>parent'; + } + } + // Add synonyms // This is done here so the new terms will get highlighting if ("OR" == $operator) { // Synonyms are only used in OR queries $q = relevanssi_add_synonyms($q); } - + $search_params = array( 'q' => $q, 'tax_query' => $tax_query, - 'tax_query_relation' => $tax_query_relation, + 'tax_query_relation' => $tax_query_relation, 'post_query' => $post_query, - 'meta_query' => $meta_query, + 'parent_query' => $parent_query, + 'meta_query' => $meta_query, 'date_query' => $date_query, 'expost' => $expost, 'post_type' => $post_type, @@ -1067,8 +1148,10 @@ function relevanssi_do_query(&$query) { 'search_blogs' => $search_blogs, 'author' => $author, 'orderby' => $orderby, - 'order' => $order); - + 'order' => $order, + 'fields' => $fields, + 'sentence' => $sentence); + $return = relevanssi_search($search_params); } @@ -1077,10 +1160,12 @@ function relevanssi_do_query(&$query) { $filter_data = array($hits, $q); $hits_filters_applied = apply_filters('relevanssi_hits_filter', $filter_data); - $hits = $hits_filters_applied[0]; + $hits = array_values($hits_filters_applied[0]); + // array_values() to make sure the $hits array is indexed in numerical order + // Manipulating the array with array_unique() for example may mess with that. $query->found_posts = sizeof($hits); - if ($query->query_vars["posts_per_page"] == 0) { + if (!isset($query->query_vars["posts_per_page"]) || $query->query_vars["posts_per_page"] == 0) { // assume something sensible to prevent "division by zero error"; $query->query_vars["posts_per_page"] = -1; } @@ -1099,14 +1184,14 @@ function relevanssi_do_query(&$query) { $make_excerpts = get_option('relevanssi_excerpts'); if ($query->is_admin) $make_excerpts = false; - if ($query->query_vars['paged'] > 0) { + if (isset($query->query_vars['paged']) && $query->query_vars['paged'] > 0) { $wpSearch_low = ($query->query_vars['paged'] - 1) * $query->query_vars["posts_per_page"]; } else { $wpSearch_low = 0; } - if ($query->query_vars["posts_per_page"] == -1) { + if (!isset($query->query_vars["posts_per_page"]) || $query->query_vars["posts_per_page"] == -1) { $wpSearch_high = sizeof($hits); } else { @@ -1132,9 +1217,9 @@ function relevanssi_do_query(&$query) { // apparently sometimes you can get a null object continue; } - - //Added by OdditY - Highlight Result Title too -> - if("on" == get_option('relevanssi_hilite_title')){ + + //Added by OdditY - Highlight Result Title too -> + if("on" == get_option('relevanssi_hilite_title') && empty($fields)){ if (function_exists('qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage')) { $post->post_highlighted_title = strip_tags(qtrans_useCurrentLanguageIfNotFoundUseDefaultLanguage($post->post_title)); } @@ -1149,24 +1234,31 @@ function relevanssi_do_query(&$query) { } } // OdditY end <- - - if ('on' == $make_excerpts) { + + if ('on' == $make_excerpts && empty($fields)) { $post->original_excerpt = $post->post_excerpt; $post->post_excerpt = relevanssi_do_excerpt($post, $q); } - - if ('on' == get_option('relevanssi_show_matches')) { - $post->post_excerpt .= relevanssi_show_matches($return, $post->ID); + + if ('on' == get_option('relevanssi_show_matches') && empty($fields)) { + $post_id = $post->ID; + if ($post->post_type == 'user') { + $post_id = "u_" . $post->user_id; + } + else if (isset($post->term_id)) { + $post_id = '**' . $post->post_type . '**' . $post->term_id; + } + $post->post_excerpt .= relevanssi_show_matches($return, $post_id); } - - if (isset($return['scores'][$post->ID])) $post->relevance_score = round($return['scores'][$post->ID], 2); - + + if (empty($fields) && isset($return['scores'][$post->ID])) $post->relevance_score = round($return['scores'][$post->ID], 2); + $posts[] = $post; } $query->posts = $posts; $query->post_count = count($posts); - + return $posts; } @@ -1182,4 +1274,281 @@ function relevanssi_limit_filter($query) { } } +function relevanssi_get_negative_post_type() { + $negative_post_type = NULL; + + if (get_option('relevanssi_respect_exclude') == 'on') { + // If Relevanssi is set to respect exclude_from_search, find out which + // post types should be excluded from search. + if (function_exists('get_post_types')) { + $pt_1 = get_post_types(array('exclude_from_search' => '1')); + $pt_2 = get_post_types(array('exclude_from_search' => true)); + $negative_post_type_list = implode(',', array_merge($pt_1, $pt_2)); + } + + // Post types to exclude. + if ($negative_post_type_list) { + if (!is_array($negative_post_type_list)) { + $negative_post_types = esc_sql(explode(',', $negative_post_type_list)); + } + else { + $negative_post_types = esc_sql($negative_post_type_list); + } + $negative_post_type = count($negative_post_types) ? "'" . implode( "', '", $negative_post_types) . "'" : NULL; + } + } + + return $negative_post_type; +} + +function relevanssi_process_tax_query_row($row, $is_sub_row, $global_relation, $query_restrictions, $tax_query_relation, $term_tax_ids, $not_term_tax_ids, $and_term_tax_ids) { + global $wpdb; + + $local_term_tax_ids = array(); + $local_not_term_tax_ids = array(); + $local_and_term_tax_ids = array(); + + $using_term_tax_id = false; + if (!isset($row['field'])) $row['field'] = 'term_id'; // in case 'field' is not set, go with the WP default of "term_id" + if ($row['field'] == 'slug') { + $slug = $row['terms']; + $numeric_slugs = array(); + $slug_in = null; + if (is_array($slug)) { + $slugs = array(); + $term_id = array(); + foreach ($slug as $t_slug) { + $term = get_term_by('slug', $t_slug, $row['taxonomy']); + if (!$term && is_numeric($t_slug)) { + $numeric_slugs[] = "'$t_slug'"; + } + else { + if (isset($term->term_id)) { + $t_slug = sanitize_title($t_slug); + $term_id[] = $term->term_id; + $slugs[] = "'$t_slug'"; + } + } + } + if (!empty($slugs)) $slug_in = implode(',', $slugs); + } + else { + $term = get_term_by('slug', $slug, $row['taxonomy'], OBJECT); + if (!$term && is_numeric($slug)) { + $numeric_slugs[] = $slug; + } + else { + if (isset($term->term_id)) { + $slug = sanitize_title($slug); + $term_id = $term->term_id; + $slug_in = "'$slug'"; + } + } + } + if (!empty($slug_in)) { + $row_taxonomy = sanitize_text_field($row['taxonomy']); + $tt_q = "SELECT tt.term_taxonomy_id + FROM $wpdb->term_taxonomy AS tt + LEFT JOIN $wpdb->terms AS t ON (tt.term_id=t.term_id) + WHERE tt.taxonomy = '$row_taxonomy' AND t.slug IN ($slug_in)"; + // Clean: $row_taxonomy is sanitized, each slug in $slug_in is sanitized + $term_tax_id = $wpdb->get_col($tt_q); + } + if (!empty($numeric_slugs)) $row['field'] = 'term_id'; + } + if ($row['field'] == 'name') { + $name = $row['terms']; + $numeric_names = array(); + $name_in = null; + if (is_array($name)) { + $names = array(); + $term_id = array(); + foreach ($name as $t_name) { + $term = get_term_by('name', $t_name, $row['taxonomy']); + if (!$term && is_numeric($t_names)) { + $numeric_names[] = "'$t_name'"; + } + else { + if (isset($term->term_id)) { + $t_name = sanitize_title($t_name); + $term_id[] = $term->term_id; + $names[] = "'$t_name'"; + } + } + } + if (!empty($names)) $name_in = implode(',', $names); + } + else { + $term = get_term_by('name', $name, $row['taxonomy']); + if (!$term && is_numeric($name)) { + $numeric_slugs[] = $name; + } + else { + if (isset($term->term_id)) { + $name = sanitize_title($name); + $term_id = $term->term_id; + $name_in = "'$name'"; + } + } + } + if (!empty($name_in)) { + $row_taxonomy = sanitize_text_field($row['taxonomy']); + $tt_q = "SELECT tt.term_taxonomy_id + FROM $wpdb->term_taxonomy AS tt + LEFT JOIN $wpdb->terms AS t ON (tt.term_id=t.term_id) + WHERE tt.taxonomy = '$row_taxonomy' AND t.name IN ($name_in)"; + // Clean: $row_taxonomy is sanitized, each name in $name_in is sanitized + $term_tax_id = $wpdb->get_col($tt_q); + } + if (!empty($numeric_names)) $row['field'] = 'term_id'; + } + if ($row['field'] == 'id' || $row['field'] == 'term_id') { + $id = $row['terms']; + $term_id = $id; + if (is_array($id)) { + $numeric_values = array(); + foreach ($id as $t_id) { + if (is_numeric($t_id)) $numeric_values[] = $t_id; + } + $id = implode(',', $numeric_values); + } + $row_taxonomy = sanitize_text_field($row['taxonomy']); + $tt_q = "SELECT tt.term_taxonomy_id + FROM $wpdb->term_taxonomy AS tt + LEFT JOIN $wpdb->terms AS t ON (tt.term_id=t.term_id) + WHERE tt.taxonomy = '$row_taxonomy' AND t.term_id IN ($id)"; + // Clean: $row_taxonomy is sanitized, $id is checked to be numeric + $id_term_tax_id = $wpdb->get_col($tt_q); + if (!empty($term_tax_id) && is_array($term_tax_id)) { + $term_tax_id = array_unique(array_merge($term_tax_id, $id_term_tax_id)); + } + else { + $term_tax_id = $id_term_tax_id; + } + } + if ($row['field'] == 'term_taxonomy_id') { + $using_term_tax_id = true; + $id = $row['terms']; + $term_tax_id = $id; + if (is_array($id)) { + $numeric_values = array(); + foreach ($id as $t_id) { + if (is_numeric($t_id)) $numeric_values[] = $t_id; + } + $term_tax_id = implode(',', $numeric_values); + } + } + + if (!isset($row['include_children']) || $row['include_children'] == true) { + if (!$using_term_tax_id && isset($term_id)) { + if (!is_array($term_id)) { + $term_id = array($term_id); + } + } + else { + if (!is_array($term_tax_id)) { + $term_tax_id = array($term_tax_id); + $term_id = $term_tax_id; + } + } + if (empty($term_tax_id)) $term_tax_id = array(); + if (!is_array($term_tax_id)) $term_tax_id = array($term_tax_id); + if (isset($term_id) && is_array($term_id)) { + foreach ($term_id as $t_id) { + if ($using_term_tax_id) { + $t_term = get_term_by('term_taxonomy_id', $t_id, $row['taxonomy']); + $t_id = $t_term->ID; + } + $kids = get_term_children($t_id, $row['taxonomy']); + foreach ($kids as $kid) { + $term = get_term_by('id', $kid, $row['taxonomy']); + $kid_term_tax_id = relevanssi_get_term_tax_id('id', $kid, $row['taxonomy']); + $term_tax_id[] = $kid_term_tax_id; + } + } + } + } + + $term_tax_id = array_unique($term_tax_id); + if (!empty($term_tax_id)) { + $n = count($term_tax_id); + $term_tax_id = implode(',', $term_tax_id); + + $tq_operator = 'IN'; // Assuming the default operator "IN", unless something else is provided. + if (isset($row['operator'])) $tq_operator = strtoupper($row['operator']); + if ($tq_operator != 'IN' && $tq_operator != 'NOT IN' && $tq_operator != 'AND') $tq_operator = 'IN'; + if ($tax_query_relation == 'and') { + if ($tq_operator == 'AND') { + $query_restrictions .= " AND relevanssi.doc IN ( + SELECT ID FROM $wpdb->posts WHERE 1=1 + AND ( + SELECT COUNT(1) + FROM $wpdb->term_relationships AS tr + WHERE tr.term_taxonomy_id IN ($term_tax_id) + AND tr.object_id = $wpdb->posts.ID ) = $n + )"; + // Clean: $term_tax_id and $n are Relevanssi-generated + } + else { + $query_restrictions .= " AND relevanssi.doc $tq_operator (SELECT DISTINCT(tr.object_id) FROM $wpdb->term_relationships AS tr + WHERE tr.term_taxonomy_id IN ($term_tax_id))"; + // Clean: all variables are Relevanssi-generated + } + } + else { + if ($tq_operator == 'IN') $local_term_tax_ids[] = $term_tax_id; + if ($tq_operator == 'NOT IN') $local_not_term_tax_ids[] = $term_tax_id; + if ($tq_operator == 'AND') $local_and_term_tax_ids[] = $term_tax_id; + } + } + else { + global $wp_query; + $wp_query->is_category = false; + } + + if ($is_sub_row && $global_relation == 'and' && $tax_query_relation == 'or') { + $local_term_tax_ids = array_unique($local_term_tax_ids); + $local_not_term_tax_ids = array_unique($local_not_term_tax_ids); + $local_and_term_tax_ids = array_unique($local_and_term_tax_ids); + if (count($local_term_tax_ids) > 0) { + $local_term_tax_ids = implode(',', $local_term_tax_ids); + $query_restrictions .= " AND relevanssi.doc IN (SELECT DISTINCT(tr.object_id) FROM $wpdb->term_relationships AS tr + WHERE tr.term_taxonomy_id IN ($local_term_tax_ids))"; + // Clean: all variables are Relevanssi-generated + } + if (count($local_not_term_tax_ids) > 0) { + $local_not_term_tax_ids = implode(',', $local_not_term_tax_ids); + $query_restrictions .= " AND relevanssi.doc NOT IN (SELECT DISTINCT(tr.object_id) FROM $wpdb->term_relationships AS tr + WHERE tr.term_taxonomy_id IN ($local_not_term_tax_ids))"; + // Clean: all variables are Relevanssi-generated + } + if (count($local_and_term_tax_ids) > 0) { + $local_and_term_tax_ids = implode(',', $local_and_term_tax_ids); + $n = count(explode(',', $local_and_term_tax_ids)); + $query_restrictions .= " AND relevanssi.doc IN ( + SELECT ID FROM $wpdb->posts WHERE 1=1 + AND ( + SELECT COUNT(1) + FROM $wpdb->term_relationships AS tr + WHERE tr.term_taxonomy_id IN ($local_and_term_tax_ids) + AND tr.object_id = $wpdb->posts.ID ) = $n + )"; + // Clean: all variables are Relevanssi-generated + } + } + + $copy_term_tax_ids = false; + if (!$is_sub_row) $copy_term_tax_ids = true; + if ($is_sub_row && $global_relation == 'or') $copy_term_tax_ids = true; + + if ($copy_term_tax_ids) { + $term_tax_ids = array_merge($term_tax_ids, $local_term_tax_ids); + $not_term_tax_ids = array_merge($not_term_tax_ids, $local_not_term_tax_ids); + $and_term_tax_ids = array_merge($and_term_tax_ids, $local_and_term_tax_ids); + } + + return array($query_restrictions, $term_tax_ids, $not_term_tax_ids, $and_term_tax_ids); +} + + ?> diff --git a/mu-plugins/relevanssi/lib/shortcodes.php b/mu-plugins/relevanssi/lib/shortcodes.php index 6ff6d505..ba6bc795 100644 --- a/mu-plugins/relevanssi/lib/shortcodes.php +++ b/mu-plugins/relevanssi/lib/shortcodes.php @@ -29,7 +29,7 @@ function relevanssi_shortcode($atts, $content, $name) { function relevanssi_noindex_shortcode($atts, $content) { // When in general use, make the shortcode disappear. - return $content; + return do_shortcode($content); } function relevanssi_noindex_shortcode_indexing($atts, $content) { @@ -37,4 +37,4 @@ function relevanssi_noindex_shortcode_indexing($atts, $content) { return ''; } -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/lib/stopwords.php b/mu-plugins/relevanssi/lib/stopwords.php index 5408173e..7e7f0c3e 100644 --- a/mu-plugins/relevanssi/lib/stopwords.php +++ b/mu-plugins/relevanssi/lib/stopwords.php @@ -5,7 +5,7 @@ function relevanssi_populate_stopwords() { global $wpdb, $relevanssi_variables; $lang = get_option('WPLANG'); - if (empty($lang) && WPLANG != '') { + if (empty($lang) && defined('WPLANG') && WPLANG != '') { $lang = WPLANG; } if (empty($lang)) $lang = "en_GB"; @@ -37,4 +37,4 @@ function relevanssi_fetch_stopwords() { return $relevanssi_variables['stopword_list']; } -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/lib/uninstall.php b/mu-plugins/relevanssi/lib/uninstall.php index 97fff89a..3915671a 100644 --- a/mu-plugins/relevanssi/lib/uninstall.php +++ b/mu-plugins/relevanssi/lib/uninstall.php @@ -2,15 +2,15 @@ function relevanssi_clear_database_tables() { global $wpdb; - + if (defined('RELEVANSSI_PREMIUM')) return; // Relevanssi Premium exists, do not delete the tables - + wp_clear_scheduled_hook('relevanssi_truncate_cache'); - $relevanssi_table = $wpdb->prefix . "relevanssi"; + $relevanssi_table = $wpdb->prefix . "relevanssi"; $stopword_table = $wpdb->prefix . "relevanssi_stopwords"; $log_table = $wpdb->prefix . "relevanssi_log"; - + if($wpdb->get_var("SHOW TABLES LIKE '$stopword_table'") == $stopword_table) { $sql = "DROP TABLE $stopword_table"; $wpdb->query($sql); @@ -25,8 +25,6 @@ function relevanssi_clear_database_tables() { $sql = "DROP TABLE $log_table"; $wpdb->query($sql); } - - echo '

      ' . __("Data wiped clean, you can now delete the plugin.", "relevanssi") . '

      '; } ?> diff --git a/mu-plugins/relevanssi/readme.txt b/mu-plugins/relevanssi/readme.txt index 793ca36c..93a1e21e 100644 --- a/mu-plugins/relevanssi/readme.txt +++ b/mu-plugins/relevanssi/readme.txt @@ -1,10 +1,11 @@ === Relevanssi - A Better Search === Contributors: msaari -Donate link: http://www.relevanssi.com/buy-premium/ +Donate link: https://www.relevanssi.com/buy-premium/ Tags: search, relevance, better search -Requires at least: 3.3 -Tested up to: 4.1 -Stable tag: 3.3.8 +Requires at least: 4.0 +Tested up to: 4.9 +Requires PHP: 5.6 +Stable tag: 3.6.2.2 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -12,13 +13,9 @@ Relevanssi replaces the default search with a partial-match search that sorts re == Description == -Relevanssi replaces the standard WordPress search with a better search engine, with lots of features -and configurable options. You'll get better results, better presentation of results - your users -will thank you. +Relevanssi replaces the standard WordPress search with a better search engine, with lots of features and configurable options. You'll get better results, better presentation of results - your users will thank you. -This is the free version of Relevanssi. There's also Relevanssi Premium, which has added features, -including Multisite support. This free version does not work properly on Multisite. For more -information about Premium, see [Relevanssi.com](http://www.relevanssi.com/). +This is the free version of Relevanssi. There's also Relevanssi Premium, which has added features, including Multisite support. This free version does not work properly on Multisite. For more information about Premium, see [Relevanssi.com](https://www.relevanssi.com/). = Key features = * Search results sorted in the order of relevance, not by date. @@ -42,11 +39,7 @@ information about Premium, see [Relevanssi.com](http://www.relevanssi.com/). * Search result throttling to improve performance on large databases. * Disable indexing of post content and post titles with a simple filter hook. -Relevanssi is available in two versions, regular and Premium. Regular Relevanssi is and will remain -free to download and use. Relevanssi Premium comes with a cost, but will get all the new features. -Standard Relevanssi will be updated to fix bugs, but new features will mostly appear in Premium. -Also, support for standard Relevanssi depends very much on my mood and available time. Premium -pricing includes support. +Relevanssi is available in two versions, regular and Premium. Regular Relevanssi is and will remain free to download and use. Relevanssi Premium comes with a cost, but will get all the new features. Standard Relevanssi will be updated to fix bugs, but new features will mostly appear in Premium. Also, support for standard Relevanssi depends very much on my mood and available time. Premium pricing includes support. = Premium features (only in Relevanssi Premium) = * Improved spelling correction in "Did you mean?" suggestions. @@ -59,18 +52,15 @@ pricing includes support. * Let the user choose between AND and OR searches, use + and - operator (AND and NOT). * Highlighting search terms for visitors from external search engines. * Export and import settings. +* [WP CLI commands](https://www.relevanssi.com/user-manual/wp-cli/). = Relevanssi in Facebook = -You can find [Relevanssi in Facebook](http://www.facebook.com/relevanssi). -Become a fan to follow the development of the plugin, I'll post updates on bugs, new features and -new versions to the Facebook page. +You can find [Relevanssi in Facebook](https://www.facebook.com/relevanssi). Become a fan to follow the development of the plugin, I'll post updates on bugs, new features and new versions to the Facebook page. = Other search plugins = -Relevanssi owes a lot to [wpSearch](http://wordpress.org/extend/plugins/wpsearch/) by Kenny -Katzgrau. Relevanssi was built to replace wpSearch, when it started to fail. +Relevanssi owes a lot to [wpSearch](https://wordpress.org/extend/plugins/wpsearch/) by Kenny Katzgrau. Relevanssi was built to replace wpSearch, when it started to fail. -Search Unleashed is a popular search plugin, but it hasn't been updated since 2010. Relevanssi -is in active development and does what Search Unleashed does. +Search Unleashed is a popular search plugin, but it hasn't been updated since 2010. Relevanssi is in active development and does what Search Unleashed does. @@ -81,222 +71,140 @@ is in active development and does what Search Unleashed does. 1. Activate the plugin through the 'Plugins' menu in WordPress. 1. Go to the plugin settings and build the index following the instructions there. -To update your installation, simply overwrite the old files with the new, activate the new -version and if the new version has changes in the indexing, rebuild the index. +To update your installation, simply overwrite the old files with the new, activate the new version and if the new version has changes in the indexing, rebuild the index. = Note on updates = -If it seems the plugin doesn't work after an update, the first thing to try is deactivating and -reactivating the plugin. If there are changes in the database structure, those changes do not happen -without a deactivation, for some reason. +If it seems the plugin doesn't work after an update, the first thing to try is deactivating and reactivating the plugin. If there are changes in the database structure, those changes do not happen without a deactivation, for some reason. = Changes to templates = -None necessary! Relevanssi uses the standard search form and doesn't usually need any changes in -the search results template. +None necessary! Relevanssi uses the standard search form and doesn't usually need any changes in the search results template. -If the search does not bring any results, your theme probably has a query_posts() call in the -search results template. That throws Relevanssi off. For more information, see [The most -important Relevanssi debugging trick](http://www.relevanssi.com/knowledge-base/query_posts/). +If the search does not bring any results, your theme probably has a query_posts() call in the search results template. That throws Relevanssi off. For more information, see [The most important Relevanssi debugging trick](https://www.relevanssi.com/knowledge-base/query_posts/). = How to index = -Check the options to make sure they're to your liking, then click "Save indexing options and -build the index". If everything's fine, you'll see the Relevanssi options screen again with a -message "Indexing successful!" - -If something fails, usually the result is a blank screen. The most common problem is a timeout: -server ran out of time while indexing. The solution to that is simple: just return to Relevanssi -screen (do not just try to reload the blank page) and click "Continue indexing". Indexing will -continue. Most databases will get indexed in just few clicks of "Continue indexing". You can -follow the process in the "State of the Index": if the amount of documents is growing, the -indexing is moving along. - -If the indexing gets stuck, something's wrong. I've had trouble with some plugins, for example -Flowplayer video player stopped indexing. I had to disable the plugin, index and then activate -the plugin again. Try disabling plugins, especially those that use shortcodes, to see if that -helps. Relevanssi shows the highest post ID in the index - start troubleshooting from the post -or page with the next highest ID. Server error logs may be useful, too. +Check the options to make sure they're to your liking, then click "Save indexing options and build the index". If everything's fine, you'll see the Relevanssi options screen again with a message "Indexing successful!" + +If something fails, usually the result is a blank screen. The most common problem is a timeout: server ran out of time while indexing. The solution to that is simple: just return to Relevanssi screen (do not just try to reload the blank page) and click "Continue indexing". Indexing will continue. Most databases will get indexed in just few clicks of "Continue indexing". You can follow the process in the "State of the Index": if the amount of documents is growing, the indexing is moving along. + +If the indexing gets stuck, something's wrong. I've had trouble with some plugins, for example Flowplayer video player stopped indexing. I had to disable the plugin, index and then activate the plugin again. Try disabling plugins, especially those that use shortcodes, to see if that helps. Relevanssi shows the highest post ID in the index - start troubleshooting from the post or page with the next highest ID. Server error logs may be useful, too. = Using custom search results = -If you want to use the custom search results, make sure your search results template uses `the_excerpt()` -to display the entries, because the plugin creates the custom snippet by replacing the post excerpt. +If you want to use the custom search results, make sure your search results template uses `the_excerpt()` to display the entries, because the plugin creates the custom snippet by replacing the post excerpt. -If you're using a plugin that affects excerpts (like Advanced Excerpt), you may run into some -problems. For those cases, I've included the function `relevanssi_the_excerpt()`, which you can -use instead of `the_excerpt()`. It prints out the excerpt, but doesn't apply `wp_trim_excerpt()` -filters (it does apply `the_content()`, `the_excerpt()`, and `get_the_excerpt()` filters). +If you're using a plugin that affects excerpts (like Advanced Excerpt), you may run into some problems. For those cases, I've included the function `relevanssi_the_excerpt()`, which you can use instead of `the_excerpt()`. It prints out the excerpt, but doesn't apply `wp_trim_excerpt()` filters (it does apply `the_content()`, `the_excerpt()`, and `get_the_excerpt()` filters). To avoid trouble, use the function like this: `` -See Frequently Asked Questions for more instructions on what you can do with -Relevanssi. +See Frequently Asked Questions for more instructions on what you can do with Relevanssi. = The advanced hacker option = -If you're doing something unusual with your search and Relevanssi doesn't work, try -using `relevanssi_do_query()`. See [Knowledge Base](http://www.relevanssi.com/knowledge-base/relevanssi_do_query/). +If you're doing something unusual with your search and Relevanssi doesn't work, try using `relevanssi_do_query()`. See [Knowledge Base](https://www.relevanssi.com/knowledge-base/relevanssi_do_query/). = Uninstalling = -To uninstall the plugin remove the plugin using the normal WordPress plugin management tools -(from the Plugins page, first Deactivate, then Delete). If you remove the plugin files manually, -the database tables and options will remain. +To uninstall the plugin remove the plugin using the normal WordPress plugin management tools (from the Plugins page, first Deactivate, then Delete). If you remove the plugin files manually, the database tables and options will remain. = Combining with other plugins = -Relevanssi doesn't work with plugins that rely on standard WP search. Those plugins want to -access the MySQL queries, for example. That won't do with Relevanssi. [Search Light](http://wordpress.org/extend/plugins/search-light/), -for example, won't work with Relevanssi. +Relevanssi doesn't work with plugins that rely on standard WP search. Those plugins want to access the MySQL queries, for example. That won't do with Relevanssi. [Search Light](http://wordpress.org/extend/plugins/search-light/), for example, won't work with Relevanssi. -Some plugins cause problems when indexing documents. These are generally plugins that use shortcodes -to do something somewhat complicated. One such plugin is [MapPress Easy Google Maps](http://wordpress.org/extend/plugins/mappress-google-maps-for-wordpress/). -When indexing, you'll get a white screen. To fix the problem, disable either the offending plugin -or shortcode expansion in Relevanssi while indexing. After indexing, you can activate the plugin -again. +Some plugins cause problems when indexing documents. These are generally plugins that use shortcodes to do something somewhat complicated. One such plugin is [MapPress Easy Google Maps](http://wordpress.org/extend/plugins/mappress-google-maps-for-wordpress/). When indexing, you'll get a white screen. To fix the problem, disable either the offending plugin or shortcode expansion in Relevanssi while indexing. After indexing, you can activate the plugin again. == Frequently Asked Questions == = Knowledge Base = -You can find solutions and answers at the [Relevanssi Knowledge Base](http://www.relevanssi.com/category/knowledge-base/). +You can find solutions and answers at the [Relevanssi Knowledge Base](https://www.relevanssi.com/category/knowledge-base/). = Relevanssi doesn't work = -If you the results don't change after installing and activating Relevanssi, the most likely -reason is that you have a call to `query_posts()` on your search results template. This confuses -Relevanssi. Try removing the query_posts call and see what happens. +If you the results don't change after installing and activating Relevanssi, the most likely reason is that you have a call to `query_posts()` on your search results template. This confuses Relevanssi. Try removing the query_posts call and see what happens. = Searching for words with ampersands or hyphens doesn't work = -Please read [Words with punctuation can't be found](http://www.relevanssi.com/knowledge-base/words-ampersands-cant-found/). -This is a Relevanssi feature, but you can circumvent it with a simple filter function. +Please read [Words with punctuation can't be found](https://www.relevanssi.com/knowledge-base/words-ampersands-cant-found/). This is a Relevanssi feature, but you can circumvent it with a simple filter function. = Where are the user search logs? = -See the top of the admin menu. There's 'User searches'. There. If the logs are empty, please note -showing the results needs at least MySQL 5. +See the top of the admin menu. There's 'User searches'. There. If the logs are empty, please note showing the results needs at least MySQL 5. = Displaying the number of search results found = -The typical solution to showing the number of search results found does not work with Relevanssi. -However, there's a solution that's much easier: the number of search results is stored in a -variable within $wp_query. Just add the following code to your search results template: +The typical solution to showing the number of search results found does not work with Relevanssi. However, there's a solution that's much easier: the number of search results is stored in a variable within $wp_query. Just add the following code to your search results template: `found_posts . ' hits'; ?>` = Advanced search result filtering = -If you want to add extra filters to the search results, you can add them using a hook. -Relevanssi searches for results in the _relevanssi table, where terms and post_ids are listed. -The various filtering methods work by listing either allowed or forbidden post ids in the -query WHERE clause. Using the `relevanssi_where` hook you can add your own restrictions to -the WHERE clause. +If you want to add extra filters to the search results, you can add them using a hook. Relevanssi searches for results in the _relevanssi table, where terms and post_ids are listed. The various filtering methods work by listing either allowed or forbidden post ids in the query WHERE clause. Using the `relevanssi_where` hook you can add your own restrictions to the WHERE clause. -These restrictions must be in the general format of +These restrictions must be in the general format of ` AND doc IN (' . {a list of post ids, which could be a subquery} . ')` -For more details, see where the filter is applied in the `relevanssi_search()` function. This -is stricly an advanced hacker option for those people who're used to using filters and MySQL -WHERE clauses and it is possible to break the search results completely by doing something wrong -here. +For more details, see where the filter is applied in the `relevanssi_search()` function. This is stricly an advanced hacker option for those people who're used to using filters and MySQL WHERE clauses and it is possible to break the search results completely by doing something wrong here. -There's another filter hook, `relevanssi_hits_filter`, which lets you modify the hits directly. -The filter passes an array, where index 0 gives the list of hits in the form of an array of -post objects and index 1 has the search query as a string. The filter expects you to return an -array containing the array of post objects in index 0 (`return array($your_processed_hit_array)`). +There's another filter hook, `relevanssi_hits_filter`, which lets you modify the hits directly. The filter passes an array, where index 0 gives the list of hits in the form of an array of post objects and index 1 has the search query as a string. The filter expects you to return an array containing the array of post objects in index 0 (`return array($your_processed_hit_array)`). = Direct access to query engine = -Relevanssi can't be used in any situation, because it checks the presence of search with -the `is_search()` function. This causes some unfortunate limitations and reduces the general usability -of the plugin. +Relevanssi can't be used in any situation, because it checks the presence of search with the `is_search()` function. This causes some unfortunate limitations and reduces the general usability of the plugin. -You can now access the query engine directly. There's a new function `relevanssi_do_query()`, -which can be used to do search queries just about anywhere. The function takes a WP_Query object -as a parameter, so you need to store all the search parameters in the object (for example, put the -search terms in `$your_query_object->query_vars['s']`). Then just pass the WP_Query object to -Relevanssi with `relevanssi_do_query($your_wp_query_object);`. +You can now access the query engine directly. There's a new function `relevanssi_do_query()`, which can be used to do search queries just about anywhere. The function takes a WP_Query object as a parameter, so you need to store all the search parameters in the object (for example, put the search terms in `$your_query_object->query_vars['s']`). Then just pass the WP_Query object to Relevanssi with `relevanssi_do_query($your_wp_query_object);`. -Relevanssi will process the query and insert the found posts as `$your_query_object->posts`. The -query object is passed as reference and modified directly, so there's no return value. The posts -array will contain all results that are found. +Relevanssi will process the query and insert the found posts as `$your_query_object->posts`. The query object is passed as reference and modified directly, so there's no return value. The posts array will contain all results that are found. = Sorting search results = -If you want something else than relevancy ranking, you can use orderby and order parameters. Orderby -accepts $post variable attributes and order can be "asc" or "desc". The most relevant attributes -here are most likely "post_date" and "comment_count". +If you want something else than relevancy ranking, you can use orderby and order parameters. Orderby accepts $post variable attributes and order can be "asc" or "desc". The most relevant attributes here are most likely "post_date" and "comment_count". -If you want to give your users the ability to sort search results by date, you can just add a link -to http://www.yourblogdomain.com/?s=search-term&orderby=post_date&order=desc to your search result -page. +If you want to give your users the ability to sort search results by date, you can just add a link to http://www.yourblogdomain.com/?s=search-term&orderby=post_date&order=desc to your search result page. Order by relevance is either orderby=relevance or no orderby parameter at all. = Filtering results by date = -You can specify date limits on searches with `by_date` search parameter. You can use it your -search result page like this: http://www.yourblogdomain.com/?s=search-term&by_date=1d to offer -your visitor the ability to restrict their search to certain time limit (see -[RAPLIQ](http://www.rapliq.org/) for a working example). +You can specify date limits on searches with `by_date` search parameter. You can use it your search result page like this: http://www.yourblogdomain.com/?s=search-term&by_date=1d to offer your visitor the ability to restrict their search to certain time limit (see [RAPLIQ](http://www.rapliq.org/) for a working example). -The date range is always back from the current date and time. Possible units are hour (h), day (d), -week (w), month (m) and year (y). So, to see only posts from past week, you could use by_date=7d -or by_date=1w. +The date range is always back from the current date and time. Possible units are hour (h), day (d), week (w), month (m) and year (y). So, to see only posts from past week, you could use by_date=7d or by_date=1w. -Using wrong letters for units or impossible date ranges will lead to either defaulting to date -or no results at all, depending on case. +Using wrong letters for units or impossible date ranges will lead to either defaulting to date or no results at all, depending on case. Thanks to Charles St-Pierre for the idea. = Displaying the relevance score = -Relevanssi stores the relevance score it uses to sort results in the $post variable. Just add -something like +Relevanssi stores the relevance score it uses to sort results in the $post variable. Just add something like `echo $post->relevance_score` to your search results template inside a PHP code block to display the relevance score. = Did you mean? suggestions = -To use Google-style "did you mean?" suggestions, first enable search query logging. The -suggestions are based on logged queries, so without good base of logged queries, the -suggestions will be odd and not very useful. +To use Google-style "did you mean?" suggestions, first enable search query logging. The suggestions are based on logged queries, so without good base of logged queries, the suggestions will be odd and not very useful. -To use the suggestions, add the following line to your search result template, preferably -before the have_posts() check: +To use the suggestions, add the following line to your search result template, preferably before the have_posts() check: `Did you mean: ", "?

      ", 5); }?>` -The first parameter passes the search term, the second is the text before the result, -the third is the text after the result and the number is the amount of search results -necessary to not show suggestions. With the default value of 5, suggestions are not -shown if the search returns more than 5 hits. +The first parameter passes the search term, the second is the text before the result, the third is the text after the result and the number is the amount of search results necessary to not show suggestions. With the default value of 5, suggestions are not shown if the search returns more than 5 hits. + +Relevanssi Premium has a much better version of this feature. = Search shortcode = -Relevanssi also adds a shortcode to help making links to search results. That way users -can easily find more information about a given subject from your blog. The syntax is -simple: +Relevanssi also adds a shortcode to help making links to search results. That way users can easily find more information about a given subject from your blog. The syntax is simple: `[search]John Doe[/search]` -This will make the text John Doe a link to search results for John Doe. In case you -want to link to some other search term than the anchor text (necessary in languages -like Finnish), you can use: +This will make the text John Doe a link to search results for John Doe. In case you want to link to some other search term than the anchor text (necessary in languages like Finnish), you can use: `[search term="John Doe"]Mr. John Doe[/search]` Now the search will be for John Doe, but the anchor says Mr. John Doe. -One more parameter: setting `[search phrase="on"]` will wrap the search term in -quotation marks, making it a phrase. This can be useful in some cases. +One more parameter: setting `[search phrase="on"]` will wrap the search term in quotation marks, making it a phrase. This can be useful in some cases. = Restricting searches to categories and tags = -Relevanssi supports the hidden input field `cat` to restrict searches to certain categories (or -tags, since those are pretty much the same). Just add a hidden input field named `cat` in your -search form and list the desired category or tag IDs in the `value` field - positive numbers -include those categories and tags, negative numbers exclude them. +Relevanssi supports the hidden input field `cat` to restrict searches to certain categories (or tags, since those are pretty much the same). Just add a hidden input field named `cat` in your search form and list the desired category or tag IDs in the `value` field - positive numbers include those categories and tags, negative numbers exclude them. -This input field can only take one category or tag id (a restriction caused by WordPress, not -Relevanssi). If you need more, use `cats` and use a comma-separated list of category IDs. +This input field can only take one category or tag id (a restriction caused by WordPress, not Relevanssi). If you need more, use `cats` and use a comma-separated list of category IDs. The same works with post types. The input fields are called `post_type` and `post_types`. -You can also set the restriction from general plugin settings (and then override it in individual -search forms with the special field). This works with custom taxonomies as well, just replace `cat` -with the name of your taxonomy. +You can also set the restriction from general plugin settings (and then override it in individual search forms with the special field). This works with custom taxonomies as well, just replace `cat` with the name of your taxonomy. -If you want to restrict the search to categories using a dropdown box on the search form, use -a code like this: +If you want to restrict the search to categories using a dropdown box on the search form, use a code like this: `
      @@ -308,49 +216,31 @@ a code like this:
      ` -This produces a search form with a dropdown box for categories. Do note that this code won't work -when placed in a Text widget: either place it directly in the template or use a PHP widget plugin -to get a widget that can execute PHP code. +This produces a search form with a dropdown box for categories. Do note that this code won't work when placed in a Text widget: either place it directly in the template or use a PHP widget plugin to get a widget that can execute PHP code. = Restricting searches with taxonomies = -You can use taxonomies to restrict search results to posts and pages tagged with a certain -taxonomy term. If you have a custom taxonomy of "People" and want to search entries tagged -"John" in this taxonomy, just use `?s=keyword&people=John` in the URL. You should be able to use -an input field in the search form to do this, as well - just name the input field with the name -of the taxonomy you want to use. +You can use taxonomies to restrict search results to posts and pages tagged with a certain taxonomy term. If you have a custom taxonomy of "People" and want to search entries tagged "John" in this taxonomy, just use `?s=keyword&people=John` in the URL. You should be able to use an input field in the search form to do this, as well - just name the input field with the name of the taxonomy you want to use. -It's also possible to do a dropdown for custom taxonomies, using the same function. Just adjust -the arguments like this: +It's also possible to do a dropdown for custom taxonomies, using the same function. Just adjust the arguments like this: `wp_dropdown_categories(array('show_option_all' => 'All people', 'name' => 'people', 'taxonomy' => 'people'));` -This would do a dropdown box for the "People" taxonomy. The 'name' must be the keyword used in -the URL, while 'taxonomy' has the name of the taxonomy. +This would do a dropdown box for the "People" taxonomy. The 'name' must be the keyword used in the URL, while 'taxonomy' has the name of the taxonomy. = Automatic indexing = -Relevanssi indexes changes in documents as soon as they happen. However, changes in shortcoded -content won't be registered automatically. If you use lots of shortcodes and dynamic content, you -may want to add extra indexing. Here's how to do it: +Relevanssi indexes changes in documents as soon as they happen. However, changes in shortcoded content won't be registered automatically. If you use lots of shortcodes and dynamic content, you may want to add extra indexing. Here's how to do it: `if (!wp_next_scheduled('relevanssi_build_index')) { wp_schedule_event( time(), 'daily', 'relevanssi_build_index' ); }` -Add the code above in your theme functions.php file so it gets executed. This will cause -WordPress to build the index once a day. This is an untested and unsupported feature that may -cause trouble and corrupt index if your database is large, so use at your own risk. This was -presented at [forum](http://wordpress.org/support/topic/plugin-relevanssi-a-better-search-relevanssi-chron-indexing?replies=2). +Add the code above in your theme functions.php file so it gets executed. This will cause WordPress to build the index once a day. This is an untested and unsupported feature that may cause trouble and corrupt index if your database is large, so use at your own risk. This was presented at [forum](http://wordpress.org/support/topic/plugin-relevanssi-a-better-search-relevanssi-chron-indexing?replies=2). = Highlighting terms = -Relevanssi search term highlighting can be used outside search results. You can access the search -term highlighting function directly. This can be used for example to highlight search terms in -structured search result data that comes from custom fields and isn't normally highlighted by -Relevanssi. +Relevanssi search term highlighting can be used outside search results. You can access the search term highlighting function directly. This can be used for example to highlight search terms in structured search result data that comes from custom fields and isn't normally highlighted by Relevanssi. -Just pass the content you want highlighted through `relevanssi_highlight_terms()` function. The -content to highlight is the first parameter, the search query the second. The content with -highlights is then returned by the function. Use it like this: +Just pass the content you want highlighted through `relevanssi_highlight_terms()` function. The content to highlight is the first parameter, the search query the second. The content with highlights is then returned by the function. Use it like this: `if (function_exists('relevanssi_highlight_terms')) { echo relevanssi_highlight_terms($content, get_search_query()); @@ -359,20 +249,13 @@ else { echo $content; }` = What is tf * idf weighing? = -It's the basic weighing scheme used in information retrieval. Tf stands for *term frequency* -while idf is *inverted document frequency*. Term frequency is simply the number of times the term -appears in a document, while document frequency is the number of documents in the database where -the term appears. +It's the basic weighing scheme used in information retrieval. Tf stands for *term frequency* while idf is *inverted document frequency*. Term frequency is simply the number of times the term appears in a document, while document frequency is the number of documents in the database where the term appears. -Thus, the weight of the word for a document increases the more often it appears in the document and -the less often it appears in other documents. +Thus, the weight of the word for a document increases the more often it appears in the document and the less often it appears in other documents. = What are stop words? = -Each document database is full of useless words. All the little words that appear in just about -every document are completely useless for information retrieval purposes. Basically, their -inverted document frequency is really low, so they never have much power in matching. Also, -removing those words helps to make the index smaller and searching faster. +Each document database is full of useless words. All the little words that appear in just about every document are completely useless for information retrieval purposes. Basically, their inverted document frequency is really low, so they never have much power in matching. Also, removing those words helps to make the index smaller and searching faster. == Known issues and To-do's == * Known issue: In general, multiple Loops on the search page may cause surprising results. Please make sure the actual search results are the first loop. @@ -386,6 +269,156 @@ removing those words helps to make the index smaller and searching faster. == Changelog == += 3.6.2.2 = +* A bug in post sorting broke string sorting (mostly post title sorting). + += 3.6.2.1 = +* A bug was left in the post ordering code. That bug is now squashed. + += 3.6.2 = +* Simple Membership plugin is now supported automatically to restrict access to posts. +* Relevanssi can now handle orderby parameter in array format. +* Relevanssi now blocks Easy Digital Downloads shortcodes when indexing to improve compatibility with EDD. +* When using `fields` to only fetch post IDs, Relevanssi doesn't try to highlight post titles. +* New action: `relevanssi_update_options` lets you adjust Relevanssi options immediately after the defaults are set. +* Remove notices about duplicated database columns when installing the plugin. + += 3.6.1 = +* SECURITY: This version fixes a SQL injection vulnerability, where a site admin could theoretically inject SQL code into Relevanssi search queries. Doing this required access to Relevanssi settings page and in my tests, I couldn't do any damage, just break the Relevanssi search, but in any case, this vulnerability is now fixed. +* Search and Filter shortcode is added to the blacklist. +* Groups plugin is now supported automatically to restrict access to posts. +* The filter `relevanssi_index_custom_fields` now works even if the custom field setting is empty. +* The filter `relevanssi_post_to_index` now has a second parameter. For posts, it simply repeats the post object, but for taxonomy terms, it has the term object. + += 3.6.0 = +* Changed a bit how Relevanssi attaches itself to queries. Instead of the global $wp_query, Relevanssi now uses the query passed as the parameter to `the_posts` filter hook. This should improve compatibility in some cases, but may cause problems in some fringe cases. If you're doing something unusual with Relevanssi, try this out before deploying to public use. +* Some meta queries caused major problems with the Relevanssi weighting algorithm. This has now been fixed. +* Error notices caused by trying to use a non-existing taxonomy term have been removed. + += 3.5.12 = +* Post type exclusion didn't work as expected. +* Relevanssi couldn't handle nested tax queries (such as those generated by WooCommerce product visibility filtering) properly. + += 3.5.11.1 = +* New filter: `relevanssi_allow_one_letter_highlights` lets you allow one-letter highlights. Just make the filter function return `true`. +* New filter: `relevanssi_block_one_letter_searches` by default blocks one-letter searches. If you want to enable them, add a filter function that always returns `false`. +* Fixed an undefined variable notice. + += 3.5.11 = +* Synonym indexing failed if synonyms contained a forward slash. +* Highlighting HTML tags has been improved further. +* New filter: `relevanssi_tag_before_tokenize` allows you to access tag content before indexing. +* Relevanssi now actively blocks one-letter search terms, as they are generally pointless and can cause "out of memory" issues. One-letter search terms are no longer highlighted, either. These are usually caused by cases like "word's" being interpreted as "word s". +* New filter: `relevanssi_disable_shortcodes_excerpt` lets you add more shortcodes to be disabled before excerpts are built. + += 3.5.10 = +* Some users got a fatal parse error. That shouldn't happen anymore. +* FacetWP users ran into trouble, as `relevanssi_do_query()` started to explicitly expect a WP_Query object in version 1.15.0. That expectation is removed; it's still highly recommended for future compatibility that you use WP_Query objects. +* Small bug fix: `get_current_screen()` is now only used when it's available to avoid occasional fatal errors. +* Error messages from `DOING_AJAX` being undefined should be removed. + += 3.5.9.1 = +* WP.org plugin repo didn't like 3.5.9 for some reason, hoping to have better luck with this. + += 3.5.9 = +* Improved the way highlighting handles HTML tags, especially when highlighting on post pages. +* The throttle limit setting was removed from the settings page for causing trouble. If you need to change it, update `relevanssi_throttle_limit` option directly. +* Relevanssi didn't support tax_queries with `field` set to `name`. That works now. +* Much faster way of showing the 25 most common words in the index. If you've disabled this feature because it was so slow, try enabling it - you might be surprised! + += 3.5.8 = +* Did you mean function had a XSS vulnerability, which is now removed. +* Minimum word length wasn't applied to titles in indexing. It is now fixed. If you think this is a problem, rebuild the index. +* TablePress compatibility has been improved. +* Meta query handling has been improved, thanks to Maxime Culea. +* Improved WP_Query parameter support: setting query variable `sentence` to 1 forces phrase search. +* Improved ACF compatibility. + += 3.5.7.1 = +* Small fix for a bug that broke the settings page. + += 3.5.7 = +* An improved version of the sorting function will not throw notices when Intuitive Custom Post Order plugin is used. +* New filter: `relevanssi_missing_sort_key` can be used to adjust the result sorting when using keys that are not present in all posts (eg. menu_order). +* Czech translation and stopwords, thanks to Michael Kucera. +* Relevanssi broke the WP admin menu search when admin searches were enabled. +* Relevanssi broke the admin page search under WP 4.7. Relevanssi is now disabled in admin page searches. +* The way accented characters are handled in highlighting is improved. A new filter, `relevanssi_accents_replacement_arrays`, can be used to adjust the accent replacement. + += 3.5.6.1 = +* Fix for a fatal bug in 3.5.6. + += 3.5.6 = +* Relevanssi admin page had a vulnerability that allowed SQL injection attacks. That is now fixed. +* Relevanssi didn't like to highlight search terms that are followed by a ?, an ! or an apostrophe. +* New filter: `relevanssi_ok_to_log` lets you control whether search queries are logged or not. + += 3.5.5 = +* 500 errors caused by arrays in custom fields should be gone now. +* Improvements to the ACF "select" field support. +* Relevanssi will not break when frontend plugins insert posts. +* `relevanssi_match` filter has a new parameter, which contains the search term. +* Polylang support has been improved. +* WPML and Polylang filters work when "fields" is set to "ids". +* New filter: `relevanssi_log_get_user` gets passed the user object before Relevanssi decides if the query should be logged or not. + += 3.5.4 = +* Relevanssi had a bug that lead to inflated relevancy scores for posts. +* Relevanssi can now index the human-readable labels of ACF "select" fields. (Thanks to Raphaël Droz.) +* New filter: `relevanssi_30days` can be used to adjust the 30 day logs to a different number of days. +* Adding stopwords that contain apostrophes didn't work. +* Ensured PHP7 and WP 4.6 compatibility. +* Fixed a small glitch that could happen if a highlighted term is next to a starting square bracket. + += 3.5.3 = +* New filter `relevanssi_user_searches_limit` to adjust the number of user searches shown in the logs. +* Old data check is only done on Relevanssi settings page, not on all admin pages. That should improve admin performance. +* Fixed a fatal error when searching includes private posts. +* New filter: `relevanssi_remote_addr` can be used to modify the IP address logged to Relevanssi logs. +* Blocked CFDB and WooCommerce shortcodes that are causing problems with Relevanssi. + += 3.5.2 = +* Added correct support for `term_taxonomy_id` in the `fields` parameter in tax_queries. + += 3.5.1 = +* Fixed an error in the Did you mean function. +* Fixed an error if the search term was not found in content. +* Fixed an error when building excerpts from posts shorter than the excerpt length. +* Blocked the `[starpro]` shortcode that was causing problems with Relevanssi. +* New filter: `relevanssi_remove_stopwords_in_titles` allows you to include stopwords in titles. +* Added support for `term_tax_id` in the `fields` parameter in tax_queries. +* Excerpt-building failed if multibyte string operations were missing. It should work now. + += 3.5 = +* Tokenizer was using `strlen()` and not `mb_strlen()`, so word lengths were not calculated properly. If your site uses non-ASCII alphabet, rebuilding the index is a good idea. +* Small improvement to WPML multilanguage filtering. +* `relevanssi_the_title()` got a new parameter: if you don't want to echo the title, you can use it like `relevanssi_the_title(false)` to make it return the title. +* Relevanssi had `the_title` filter hook calls that were missing the second parameter; that's now fixed. +* The excerpt-building algorithm is completely rewritten based on work by Ben Boyter (http://www.boyter.org/). +* The `[watupro]` shortcode didn't work with Relevanssi, so Relevanssi will now bypass it. +* The plugin i18n features have been improved slightly. +* New filter: `relevanssi_didyoumean_suggestion` lets you modify the Did you mean? suggestion before it's displayed. +* `relevanssi_didyoumean()` has a new parameter: you can now choose whether the result is echoed out (the default value) or just returned. +* In the search results breakdown, you can now use %categories% and %taxonomies% to show the number of matches in categories and taxonomies other than tags and cats, respectively. +* Relevanssi supports `fields` parameter (both `ids` and `id=>parent`) to return only post IDs or post IDs and post parents. + += 3.4.2 = +* Empty lines on synonym settings caused problems. Fixed that. +* In WordPress 4.2 installations, emoji in will be handled better. Emoji in posts may cause problems with WordPress versions below 4.2, so please update! + += 3.4.1 = +* Removed a notice about an undefined variable. + += 3.4 = +* New filter: `relevanssi_valid_admin_status` can be used to adjust post statuses that Relevanssi will handle. +* If Relevanssi creates an empty excerpt for a post and there's a user-set excerpt for the post, that excerpt is used. +* No ellipsis is added to the post excerpt, if the post excerpt shows the whole post. +* The `relevanssi_post_title_before_tokenize` filter now has a second parameter that contains the post object. +* New filter: `relevanssi_display_common_words` can be used to disable the "25 most common words" listing on the settings page, if it's too heavy to load. +* Relevanssi was sanitizing taxonomy titles too aggressively. That is now toned down a bit. +* Relevanssi now supports `post_parent`, `post_parent__in` and `post_parent__not_in`, though you have to set them in `relevanssi_modify_wp_query` filter for them to work. +* Meta query support should now be perfect; there were some limitations with complicated meta queries before. + = 3.3.8 = * Fixed a bug that caused the results to change depending of the order of words in a multi-word search query. * Added `product_categories` and `recent_products` from WooCommerce to the list of blocked shortcodes. @@ -474,7 +507,7 @@ removing those words helps to make the index smaller and searching faster. * Phrases are now matched to excerpts. * Number of queries Relevanssi generates is much, much lower. * New filter: `relevanssi_didyoumean_url` lets you modify the URL generated by the did you mean feature. -* Better set of Russian stopwords. +* Better set of Russian stopwords. * Relevanssi now highlights search query synonyms as well in documents. = 3.1.9 = @@ -507,7 +540,7 @@ removing those words helps to make the index smaller and searching faster. * When search included user profiles or taxonomy terms, Relevanssi would generate lots of MySQL errors. Not anymore. * New filter: `relevanssi_valid_status` lets you modify the post statuses Relevanssi indexes. * New filter: `relevanssi_index_taxonomies_args` lets you modify the arguments passed to get_terms() when indexing taxonomies (for example to set 'hide_empty' to false). -* Searching by taxonomy ID could confuse two taxonomies with the same term_id. The search is now checking the taxonomy as well to see it's correct. +* Searching by taxonomy ID could confuse two taxonomies with the same term_id. The search is now checking the taxonomy as well to see it's correct. * Basic support for Polylang plugin. * Russian and Italian stopwords are now included, thanks to Flector and Valerio Vendrame. * Small fix in the way user meta fields are handled. @@ -617,7 +650,7 @@ removing those words helps to make the index smaller and searching faster. = 3.0.2 = * AFTER UPGRADING FROM 2.x: Make sure you deactivate and reactivate Relevanssi in order to make the database changes happen. * Fixed the "Cannot use a scalar value as an array" bug in indexing. -* Role-Scoper users: in order to make Relevanssi work with Role-Scoper, replace the Relevanssi helper file in Role-Scoper with [this file](http://www.relevanssi.com/relevanssi-helper-front_rs.txt). +* Role-Scoper users: in order to make Relevanssi work with Role-Scoper, replace the Relevanssi helper file in Role-Scoper with [this file](https://www.relevanssi.com/relevanssi-helper-front_rs.txt). * Removed an error message about set_time_limit() under safe_mode. * Jetpack Contact Form shortcode caused problems when indexing. Relevanssi will now simply remove the shortcode before indexing. * Fixed errors caused by / characters in highlighting. @@ -734,7 +767,7 @@ removing those words helps to make the index smaller and searching faster. * A call to a non-existing function in 2.9.2 made all sorts of mess. This release fixes all problems with broken loops. I'm sorry about the bug. = 2.9.2 = -* It's now possible to adjust the number of search results per page. See [Changing posts_per_page](http://www.relevanssi.com/knowledge-base/posts-per-page/) for instructions. +* It's now possible to adjust the number of search results per page. See [Changing posts_per_page](https://www.relevanssi.com/knowledge-base/posts-per-page/) for instructions. * Somebody reported revisions appearing in the search results. Added an extra check to prevent that. * Improved the indexing procedure to prevent MySQL errors from appearing and to streamline the process. * Improved the way custom post types can be handled in indexing. @@ -743,7 +776,7 @@ removing those words helps to make the index smaller and searching faster. = 2.9.1 = * It is now possible to change the default result order from relevance to post date. * Fixed a bug that caused wrong $post object to be set in indexing. -* Added a new hook `relevanssi_excerpt_content`; see [Knowledge Base](http://www.relevanssi.com/category/knowledge-base/) for details. +* Added a new hook `relevanssi_excerpt_content`; see [Knowledge Base](https://www.relevanssi.com/category/knowledge-base/) for details. = 2.9 = * Fixed a bug that caused Cyrillic searches in the log to get corrupted. @@ -1061,6 +1094,75 @@ removing those words helps to make the index smaller and searching faster. == Upgrade notice == += 3.6.2.2 = +* Fixes a bug in string sorting (for example post title ordering). + += 3.6.2.1 = +* Fixes a bug in the post sorting algorithm. + += 3.6.2 = +* Support for array orderby and other fine features. + += 3.6.1 = +* Fix for a security vulnerability where a site admin could inject SQL code into search queries. + += 3.6.0 = +* A big change in how Relevanssi works with queries. This should reduce compatibility issues, but may cause unexpected results. + += 3.5.11 = +* Improvements in excerpts, new filters. + += 3.5.10 = +* Prevented a fatal error for some users, small bug fixes. + += 3.5.9.1 = +* Improvements in highlighting and taxonomy searches. + += 3.5.9 = +* Improvements in highlighting and taxonomy searches. + += 3.5.8 = +* Fix for a XSS vulnerability. + += 3.5.7.1 = +* Fix for the broken settings page. + += 3.5.7 = +* Bug fixes and small improvements. + += 3.5.6.1 = +* Fix for a fatal error. + += 3.5.6 = +* Fix for a SQL injection vulnerability. + += 3.5.5 = +* Bug fixes and small improvements. + += 3.5.4 = +* Fix for a small bug that leads to inflated relevancy scores. + += 3.5.3 = +* New filters and a fix for a fatal error. + += 3.5.2 = +* Small fix: Relevanssi now supports term_taxonomy_id parameter in tax_queries + += 3.5.1 = +* Small bug fixes and a new filter. + += 3.5 = +* Improved excerpt-building, several bug fixes, couple of small updates. + += 3.4.2 = +* Better emoji support in WP 4.2, fixed issues with synonyms. + += 3.4.1 = +* Removed a notice about an undefined variable. + += 3.4 = +* Bug fixes, better meta_query support, better excerpt handling. + = 3.3.8 = * Bug fixes, fix for a possible XSS vulnerability, improved performance. @@ -1098,4 +1200,4 @@ removing those words helps to make the index smaller and searching faster. * WordPress 3.7 compatibility, couple of minor bug fixes. = 3.1.8 = -Recommended for users of WPML and BBpress. Category exclusions and restrictions are also fixed. +* Recommended for users of WPML and BBpress. Category exclusions and restrictions are also fixed. diff --git a/mu-plugins/relevanssi/relevanssi-cz_CZ.mo b/mu-plugins/relevanssi/relevanssi-cz_CZ.mo new file mode 100644 index 0000000000000000000000000000000000000000..5dd52bb64a077cd63ed29d89a079f0fae25b8ea6 GIT binary patch literal 29747 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 && n<=4) ? 1 : 2;\n" +"X-Generator: Poedit 1.8.11\n" +"Language: cs_CZ\n" +"Project-Id-Version: Plugins - Relevanssi - A Better Search - Stable (latest release)\n" +"POT-Creation-Date: \n" +"Last-Translator: \n" +"Language-Team: Mik013\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#. Author URI of the plugin/theme +msgid "http://www.mikkosaari.fi/" +msgstr "http://www.mikkosaari.fi/" + +#. Author of the plugin/theme +msgid "Mikko Saari" +msgstr "Mikko Saari" + +#. Description of the plugin/theme +msgid "This plugin replaces WordPress search with a relevance-sorting search." +msgstr "Tento plugin nahrazuje WordPress hledání s vyhledáváním a tříděním podle relevance." + +#. Plugin URI of the plugin/theme +msgid "http://www.relevanssi.com/" +msgstr "http://www.relevanssi.com/" + +#. Plugin Name of the plugin/theme +msgid "Relevanssi" +msgstr "Relevanssi" + +#: relevanssi.php:332 +msgid "Category weight:" +msgstr "Váha kategorie:" + +#: relevanssi.php:317 +msgid "Tag weight:" +msgstr "Váha tagu:" + +#: lib/uninstall.php:29 +msgid "Data wiped clean, you can now delete the plugin." +msgstr "Data vyčištěna dočista, plugin nyní můžete smazat." + +#: lib/interface.php:1395 +msgid "Here's a list of stopwords you can use to export the stopwords to another blog." +msgstr "Zde je seznam stopslov, který může být použít k exportu do jiného blogu." + +#: lib/interface.php:1389 +msgid "Remove all stopwords" +msgstr "Odstranit všechna stopslova" + +#: lib/interface.php:1363 +msgid "

      Here's a list of stopwords in the database. Click a word to remove it from stopwords. Removing stopwords won't automatically return them to index, so you need to re-index all posts after removing stopwords to get those words back to index." +msgstr "

      Zde je seznam stopslov v databázi. Kliknutím na slovo jej ze zakázaných odeberete. Po odebrání stopslov se tato automaticky nevrací do indexu, takže po odebrání stopslov je třeba re-indexovat všechny příspěvky, aby se tato slova dostala zpět do indexu." + +#: lib/interface.php:1360 +msgid "Add" +msgstr "Přidat" + +#: lib/interface.php:1359 +msgid "Stopword(s) to add: " +msgstr "Stopslova k přidání: " + +#: lib/interface.php:1357 +msgid "

      Enter a word here to add it to the list of stopwords. The word will automatically be removed from the index, so re-indexing is not necessary. You can enter many words at the same time, separate words with commas.

      " +msgstr "

      Sem zadejte slovo, které chcete přidat do negativního slovníku. Slovo bude automaticky odstraněno z indexu a re-indexování nebude nutné. Můžete zadat více slov najednou, jednotlivá slova oddělujte čárkami.

      " + +#: lib/interface.php:1332 +msgid "Add synonyms here in 'key = value' format. When searching with the OR operator, any search of 'key' will be expanded to include 'value' as well. Using phrases is possible. The key-value pairs work in one direction only, but you can of course repeat the same pair reversed." +msgstr "Zde přidejte synonyma formou 'klíč = hodnota\". Při vyhledávání s operátorem OR, budou všechna hledání \"klíče\" rozšířena také o \"hodnotu\". Také použití frází je možné. Dvojice klíč-hodnota fungují pouze v jednom směru, ale můžete samozřejmě uvést stejný pár opačně." + +#: lib/interface.php:1324 +msgid "Save indexing options, erase index and rebuild the index" +msgstr "Uložit nastavení indexování, smazat index a znovu vytvořit index" + +#: lib/interface.php:1314 +msgid "A comma-separated list of custom fields to include in the index. Set to 'visible' to index all visible custom fields and to 'all' to index all custom fields, also those starting with a '_' character." +msgstr "Seznam vlastních polí oddělený čárkami, které budou zahrnuty do indexu. Pro indexování všech viditelných vlastních polí nastavte na \"visible\" anebo \"vše\" pro indexaci všech vlastních polí, tedy i těch, které začínající znakem \"_\"." + +#: lib/interface.php:1312 +msgid "Custom fields to index:" +msgstr "Vlastní pole k indexování:" + +#: lib/interface.php:1308 +msgid "Relevanssi will index and search ALL (all comments including track- & pingbacks and custom comment types), NONE (no comments) or NORMAL (manually posted comments on your blog).
      Remember to rebuild the index if you change this option!" +msgstr "Relevanssi bude indexovat a prohledávat VŠE (všechny komentáře včetně track- & pingbacks a vlastní typy komentářů), NIC (žádné komentáře) nebo NORMÁLNÍ (ručně odeslané komentáře).
      Nezapomeňte znovu vytvořit index, pokud tuto možnost změníte!" + +#: lib/interface.php:1306 +msgid "all" +msgstr "vše" + +#: lib/interface.php:1305 +msgid "normal" +msgstr "normální" + +#: lib/interface.php:1304 +msgid "none" +msgstr "nic" + +#: lib/interface.php:1302 +msgid "Index and search these comments:" +msgstr "Indexovat a vyhledávat tyto komentáře:" + +#: lib/interface.php:1298 +msgid "If checked, Relevanssi will also index and search the excerpts of your posts.Remember to rebuild the index if you change this option!" +msgstr "Je-li zaškrtnuto, Relevanssi bude indexovat a hledat také Stručný obsah vašich příspěvků. Nezapomeňte znovu vytvořit index, pokud tuto možnost změníte!" + +#: lib/interface.php:1296 +msgid "Index and search post excerpts:" +msgstr "Indexovat a hledat Stručný obsah příspěvků:" + +#: lib/interface.php:1292 +msgid "If checked, Relevanssi will also index and search the authors of your posts. Author display name will be indexed. Remember to rebuild the index if you change this option!" +msgstr "Je-li zaškrtnuto, Relevanssi bude indexovat a hledat také autory vašich příspěvků. Zobrazované jméno autora bude indexováno. Nezapomeňte znovu vytvořit index, pokud tuto možnost změníte!" + +#: lib/interface.php:1290 +msgid "Index and search your posts' authors:" +msgstr "Indexovat a hledat vaše příspěvky autorů:" + +#: lib/interface.php:1284 +msgid "If checked, Relevanssi will expand shortcodes in post content before indexing. Otherwise shortcodes will be stripped. If you use shortcodes to include dynamic content, Relevanssi will not keep the index updated, the index will reflect the status of the shortcode content at the moment of indexing." +msgstr "Je-li zaškrtnuto, Relevanssi bude před indexováním vykonávat zkrácené kódy v obsahu příspěvků. Jinak by byly vynechány. Pokud používáte zkrácené kódy ke zobrazení dynamického obsahu, Relevanssi nebude udržovat index aktualizovaný, index bude odrážet pouze stav obsahu zkráceného kódu v okamžiku indexování." + +#: lib/interface.php:1282 +msgid "Expand shortcodes in post content:" +msgstr "Vykonávat zkrácené kódy v obsahu příspěvku:" + +#: lib/interface.php:1276 +msgid "Words shorter than this number will not be indexed." +msgstr "Slova kratší než tento počet nebudou indexována." + +#: lib/interface.php:1274 +msgid "Minimum word length to index" +msgstr "Minimální délka slova k indexování" + +#: lib/interface.php:1270 +msgid "If you check a taxonomy here, the terms for that taxonomy are indexed with the posts. If you for example choose \"post_tag\", searching for tags will find all posts that have the tag." +msgstr "Pokud zde zaškrtnete taxonomii, výrazy pro tuto taxonomii jsou indexovány spolu s příspěvky. Pokud například zvolíte \"post_tag\" hledal tagů najdete všechny příspěvky, které mají takový tag." + +#: lib/interface.php:1233 +msgid "Taxonomy" +msgstr "Taxonomie" + +#: lib/interface.php:1228 +msgid "Choose taxonomies to index:" +msgstr "Vyberte taxonomii k indexování:" + +#: lib/interface.php:1207 lib/interface.php:1250 +msgid "no" +msgstr "ne" + +#: lib/interface.php:1207 lib/interface.php:1250 +msgid "yes" +msgstr "ano" + +#: lib/interface.php:1206 lib/interface.php:1249 +msgid "%s" +msgstr "%s" + +#: lib/interface.php:1189 lib/interface.php:1235 +msgid "Public?" +msgstr "Veřejné?" + +#: lib/interface.php:1188 lib/interface.php:1234 +msgid "Index" +msgstr "Index" + +#: lib/interface.php:1187 +msgid "Type" +msgstr "Typ" + +#: lib/interface.php:1182 +msgid "Choose post types to index:" +msgstr "Vyberte typy příspěvků k indexování:" + +#: lib/interface.php:1178 lib/interface.php:1336 +msgid "Save the options" +msgstr "Uložit nastavení" + +#: lib/interface.php:1171 +msgid "Name a class here, search results will be wrapped in a <span> with the class" +msgstr "Uveďte třídu zde, výsledky vyhledávání budou zabaleny v <span> se třídou" + +#: lib/interface.php:1169 +msgid "CSS class for highlights:" +msgstr "CSS třída pro zvýraznění" + +#: lib/interface.php:1165 +msgid "You can use any CSS styling here, style will be inserted with a <span>" +msgstr "Zde můžete použít jakýkoli CSS styl , styl bude vložen pomocí <span>" + +#: lib/interface.php:1163 +msgid "CSS style for highlights:" +msgstr "CSS styl pro zvýraznění" + +#: lib/interface.php:1157 +msgid "Background color for highlights:" +msgstr "Barva pozadí pro zvýraznění" + +#: lib/interface.php:1153 lib/interface.php:1159 +msgid "Use HTML color codes (#rgb or #rrggbb)" +msgstr "Použijte HTML kódy barev (#rgb či #rrggbb)" + +#: lib/interface.php:1151 +msgid "Text color for highlights:" +msgstr "Barva textu pro zvýraznění" + +#: lib/interface.php:1147 +msgid "Then adjust the settings for your chosen type:" +msgstr "Poté upravte nastavení pro zvolený typ:" + +#: lib/interface.php:1142 +msgid "If you use non-ASCII characters (like Cyrillic alphabet) and the highlights don't work, uncheck this option to make highlights work." +msgstr "Pokud používáte jiné znaky než ASCII (např. azbuku) a zvýraznění nefungují, odškrtněte tuto volbu, aby zvýraznění začalo fungovat." + +#: lib/interface.php:1140 +msgid "Uncheck this if you use non-ASCII characters:" +msgstr "Odškrtněte tuto možnost, pokud používáte jiné znaky než ASCII:" + +#: lib/interface.php:1136 +msgid "Highlights hits in comments when user opens the post from search results." +msgstr "Zvýraznit shody v komentářích, když uživatel příspěvek otevře z výsledků vyhledávání." + +#: lib/interface.php:1134 +msgid "Highlight query terms in comments:" +msgstr "Zvýraznit hledané výrazy v komentářích:" + +#: lib/interface.php:1128 +msgid "Highlights hits when user opens the post from search results. This is based on HTTP referrer, so if that's blocked, there'll be no highlights." +msgstr "Zvýraznit shody, když uživatel příspěvek otevře z výsledků vyhledávání. To je založeno na HTTP referreru, takže pokud bude blokován, nic nebude zvýrazněno." + +#: lib/interface.php:1126 +msgid "Highlight query terms in documents from local searches:" +msgstr "Zvýraznit hledané výrazy v dokumentech z místního vyhledávání:" + +#: lib/interface.php:1120 +msgid "Highlight query terms in result titles too:" +msgstr "Zvýraznit hledané výrazy také v názvech výsledků:" + +#: lib/interface.php:1116 +msgid "Highlighting isn't available unless you use custom snippets" +msgstr "Zvýraznění není k dispozici, pokud budete používat vlastní úryvky" + +#: lib/interface.php:1114 +msgid "CSS Class" +msgstr "CSS Třída" + +#: lib/interface.php:1113 +msgid "CSS Style" +msgstr "CSS Kaskádový styl" + +#: lib/interface.php:1112 +msgid "Background color" +msgstr "Barva pozadí" + +#: lib/interface.php:1111 +msgid "Text color" +msgstr "Barva textu" + +#: lib/interface.php:1107 +msgid "No highlighting" +msgstr "Žádné zvýraznění" + +#: lib/interface.php:1105 +msgid "Highlight query terms in search results:" +msgstr "Zvýraznit hledané výrazy ve výsledcích vyhledávání:" + +#: lib/interface.php:1102 +msgid "First, choose the type of highlighting used:" +msgstr "Nejprve vyberte jaký typ zvýraznění používat:" + +#: lib/interface.php:1100 +msgid "Search hit highlighting" +msgstr "Zvýraznění nalezené shody" + +#: lib/interface.php:1098 +msgid "Use %body%, %title%, %tags% and %comments% to display the number of hits (in different parts of the post), %total% for total hits, %score% to display the document weight and %terms% to show how many hits each search term got. No double quotes (\") allowed!" +msgstr "Použijte %body%, %title%, %tags% a %comments% pro zobrazení počtu shod (v různých částech příspěvku), %total% pro součet shod, %score% pro zobrazení váhy dokumentu a %terms% pro zobrazení kolik měl hledaný výraz shod. Nejsou povoleny žádné uvozovky (\")!" + +#: lib/interface.php:1096 +msgid "The breakdown format:" +msgstr "Formát členění:" + +#: lib/interface.php:1092 +msgid "Check this to show more information on where the search hits were made. Requires custom snippets to work." +msgstr "Zaškrtněte, pro více informací o tom, kde došlo ke shodě při vyhledávaní. Pro správnou funkci jsou vyžadovány vlastní úryvky." + +#: lib/interface.php:1090 +msgid "Show breakdown of search hits in excerpts:" +msgstr "Zobrazit náhledy nalezených výsledků shod:" + +#: lib/interface.php:1086 +msgid "List all tags you want to allow in excerpts, without any whitespace. For example: '<p><a><strong>'." +msgstr "Vyjmenovat všechny tagy, které chcete povolit ve Stručných obsazích, a to bez jakékoliv mezery. Například: '<p><a><strong>'." + +#: lib/interface.php:1083 +msgid "Allowable tags in excerpts:" +msgstr "Přípustné tagy ve Stručných obsazích" + +#: lib/interface.php:1079 +msgid "This must be an integer." +msgstr "Zde musí být číslo." + +#: lib/interface.php:1077 +msgid "words" +msgstr "slov" + +#: lib/interface.php:1076 +msgid "characters" +msgstr "znaků" + +#: lib/interface.php:1073 +msgid "Length of the snippet:" +msgstr "Délka úryvku:" + +#: lib/interface.php:1071 +msgid "Note: Building custom excerpts can be slow. If you are not actually using the excerpts, make sure you disable the option." +msgstr "Poznámka: Vytváření vlastních stručných seznamů může být pomalé. Pokud vlastní stručné seznamy nepoužíváte, ujistěte se, že tato volba zůstane vypnutá." + +#: lib/interface.php:1069 +msgid "If checked, Relevanssi will create excerpts that contain the search term hits. To make them work, make sure your search result template uses the_excerpt() to display post excerpts." +msgstr "Je-li zaškrtnuto, Relevanssi vytvoří náhled, který obsahuje shodu hledaného výrazu. Pro správnou funkcionalitu se ujistěte, že vaše šablona výsledků vyhledávání používá the_excerpt() pro zobrazení stručných seznamů." + +#: lib/interface.php:1067 +msgid "Create custom search result snippets:" +msgstr "Vytvářet vlastní výsledky vyhledávání úryvků:" + +#: lib/interface.php:1065 +msgid "Custom excerpts/snippets" +msgstr "Vlastní Náhledy / úryvky" + +#: lib/interface.php:1063 +msgid "If checked, Relevanssi won't display posts of custom post types that have 'exclude_from_search' set to true. If not checked, Relevanssi will display anything that is indexed." +msgstr "Je-li zaškrtnuto, Relevanssi nezobrazí příspěvky vlastních typů, které mají nastaveno \"exclude_from_search\" na true. Pokud není zaškrtnuto, Relevanssi zobrazí vše, co je indexováno." + +#: lib/interface.php:1061 +msgid "Respect exclude_from_search for custom post types:" +msgstr "Respektovat exclude_from_search pro vlastní typy příspěvků:" + +#: lib/interface.php:1055 +msgid "Enter a comma-separated list of post/page IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there)." +msgstr "Zadejte seznam ID příspěvků / stránek oddělených čárkami, které mají být vyloučeny z výsledků vyhledávání. Toto funguje jen zde, nemůžete použít volbu u vstupního pole (WordPress tam nepovoluje vlastní parametry)." + +#: lib/interface.php:1052 +msgid "Enter a comma-separated list of post/page IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there). You can also use a checkbox on post/page edit pages to remove posts from index." +msgstr "Zadejte seznam ID příspěvků / stránek oddělených čárkami, které mají být vyloučeny z výsledků vyhledávání. Toto funguje jen zde, nemůžete použít volbu u vstupního pole (WordPress tam nepovoluje vlastní parametry). Můžete také použít zaškrtávací políčko na příspěvku / stránce při editaci - odstranit příspěvek z indexu." + +#: lib/interface.php:1048 +msgid "Exclude these posts/pages from search:" +msgstr "Vyloučit tyto příspěvky / stránky z vyhledávání:" + +#: lib/interface.php:1044 +msgid "Enter a comma-separated list of tag IDs that are excluded from search results." +msgstr "Zadejte seznam ID tagů oddělených čárkami, které mají být vyloučeny z výsledků vyhledávání." + +#: lib/interface.php:1042 +msgid "Exclude these tags from search:" +msgstr "Vyloučit tyto tagy z vyhledávání:" + +#: lib/interface.php:1038 +msgid "Enter a comma-separated list of category IDs that are excluded from search results." +msgstr "Zadejte seznam ID kategorií oddělených čárkami, které mají být vyloučeny z výsledků vyhledávání." + +#: lib/interface.php:1036 +msgid "Exclude these categories from search:" +msgstr "Vyloučit tyto kategorie z vyhledávání:" + +#: lib/interface.php:1032 +msgid "Enter a comma-separated list of category and tag IDs to restrict search to those categories or tags. You can also use <input type='hidden' name='cats' value='list of cats and tags' /> in your search form. The input field will \toverrun this setting." +msgstr "Zadejte seznam kategorií a ID tagů oddělený čárkami pro omezení vyhledávání na pouze na tyto kategorie nebo tagy. Můžete také použít <input type='hidden' name='cats' value='list of cats and tags' /> ve vyhledávacím formuláři. Vstupní pole bude převáží toto nastavení." + +#: lib/interface.php:1030 +msgid "Restrict search to these categories and tags:" +msgstr "Omezit vyhledávání pouze těchto kategorií a tagů:" + +#: lib/interface.php:1022 +msgid "If you enable logs, you can see what your users are searching for. Logs are also needed to use the 'Did you mean?' feature. You can prevent your own searches from getting in the logs with the omit feature." +msgstr "Pokud povolíte logování, můžete vidět, co vaši uživatelé hledají. Protokoly jsou zapotřebí také pro funkci \"Měli jste na mysli?\". Můžete však zabránit tomu, aby vaše vlastní vyhledávání byla logována." + +#: lib/interface.php:1019 +msgid "If you enable logs, you can see what your users are searching for. You can prevent your own searches from getting in the logs with the omit feature." +msgstr "Pokud povolíte logování, můžete vidět, co vaši uživatelé hledají. Můžete však zabránit tomu, aby vaše vlastní vyhledávání byla logována." + +#: lib/interface.php:1015 +msgid "Comma-separated list of numeric user IDs or user login names that will not be logged." +msgstr "Čárkou oddělený seznam uživatelských jmen, nebo jejich číselných ID, jejichž hledání nebude logováno." + +#: lib/interface.php:1013 +msgid "Don't log queries from these users:" +msgstr "Nelogovat dotazy od těchto uživatelů:" + +#: lib/interface.php:1009 +msgid "If checked, Relevanssi will log user's IP-Adress with the queries." +msgstr "Je-li zaškrtnuto, Relevanssi bude spolu s u6ivatelovými dotazy logovat i jeho IP adresu." + +#: lib/interface.php:1007 +msgid "Log the user's IP with the queries:" +msgstr "Spolu s dotazy logovat i uživatelovu IP:" + +#: lib/interface.php:1003 +msgid "If checked, Relevanssi will log user queries. The log appears in 'User searches' on the Dashboard admin menu." +msgstr "Je-li zaškrtnuto, Relevanssi bude logovat uživatelské dotazy. Log se objeví v \"Návštěvník vyhledává\" v admin menu Nástěnka." + +#: lib/interface.php:1001 +msgid "Keep a log of user queries:" +msgstr "Zachovat log uživatelských dotazů:" + +#: lib/interface.php:995 +msgid "If this option is checked, Relevanssi will only return results in the current active language. Otherwise results will include posts in every language." +msgstr "" + +#: lib/interface.php:993 +msgid "Limit results to current language:" +msgstr "Omezit výsledky pouze pro aktuální jazyk:" + +#: lib/interface.php:991 +msgid "WPML/Polylang compatibility" +msgstr "WPML kompatibilita" + +#: lib/interface.php:970 +msgid "Comment text" +msgstr "Text komentáře" + +#: lib/interface.php:958 +msgid "Post titles" +msgstr "Názvy příspěvků" + +#: lib/interface.php:953 +msgid "Default weight" +msgstr "Výchozí váha" + +#: lib/interface.php:952 +msgid "Weight" +msgstr "Váha" + +#: lib/interface.php:951 +msgid "Element" +msgstr "Prvek" + +#: lib/interface.php:946 +msgid "These values affect the weights of the documents. These are all multipliers, so 1 means no change in weight, less than 1 means less weight, and more than 1 means more weight. Setting something to zero makes that worthless. For example, if title weight is more than 1, words in titles are more significant than words elsewhere. If title weight is 0, words in titles won't make any difference to the search results." +msgstr "Tyto hodnoty ovlivňují váhu dokumentů. Všechno jsou to násobky, takže 1 znamená žádnou změnu váhy, menší než 1, znamená snížení váhy a více než 1 znamená větší váhu. Nastavení položky na nulu z ní udělá bezcennou. Například, pokud váha názvu je větší než 1, slova v názvech budou mnohem významnější než slova jinde. Pokud bude váha názvu 0, nebudou mít slova v názvech žádnou hodnotu pro výsledky vyhledávání." + +#: lib/interface.php:936 +msgid "For better performance, adjust the limit to a smaller number. Adjusting the limit to 100 or 200 should be safe for good results, and might bring a boost in search speed. DO NOT use this feature to limit the number of search results on search results pages, as that will lead to problems. For adjusting the number of search results displayed, see this knowledge base entry." +msgstr "Pro lepší výkon, nastavte limit na menší číslo. Nastavení limitu na 100 nebo 200 by mělo být bezpečné pro dobré výsledky, zároveň může přinést zvýšení rychlosti vyhledávání. NEPOUŽÍVEJTE tuto funkci pro omezení počtu výsledků na stránce výsledků vyhledávání, protože to povede k problémům. Pro nastavení počtu zobrazených výsledků vyhledávání na stránku si přečtěte článek v této znalostní bázi." + +#: lib/interface.php:934 +msgid "Limit:" +msgstr "Limit:" + +#: lib/interface.php:930 +msgid "If this option is checked, Relevanssi will limit search results to at most 500 results per term. This will improve performance, but may cause some relevant documents to go unfound. However, Relevanssi tries to prioritize the most relevant documents. This does not work well when sorting results by date. The throttle can end up cutting off recent posts to favour more relevant posts." +msgstr "Pokud je tato volba aktivní, Relevanssi omezí výsledky vyhledávání na maximálně 500 výsledků na výraz. Tím se zlepší výkon, ale může to způsobit, že některé relevantní dokumenty nebudou nalezeny. Nicméně, Relevanssi se snaží upřednostnit nejrelevantnější dokumenty. Což úplně neplatí, pokud jsou výsledky řazeny podle data. Nastavení tak může upřednostnit nedávné příspěvkz před jinak relevantnějšími." + +#: lib/interface.php:928 +msgid "Limit searches:" +msgstr "Limit hledání" + +#: lib/interface.php:920 +msgid "Straight search matches just the term. Fuzzy search matches everything that begins or ends with the search term." +msgstr "Přímé vyhledávání najde jen přesný výraz. Přibližné vyhledávání najde vše, co začíná nebo končí hledaným výrazem." + +#: lib/interface.php:918 +msgid "Don't use fuzzy search" +msgstr "Nepoužívat přibližné vyhledávání" + +#: lib/interface.php:917 +msgid "Always" +msgstr "Vždy" + +#: lib/interface.php:916 +msgid "When straight search gets no hits" +msgstr "Když přímé hledání nevrátí žádný výsledek" + +#: lib/interface.php:914 +msgid "When to use fuzzy matching?" +msgstr "Kdy použít přibližnou shodu?" + +#: lib/interface.php:910 +msgid "If you want date-based results, see the recent post bonus in the Weights section." +msgstr "Chcete-li výsledky na základě data vytvoření, přejděte na sekci Váhy." + +#: lib/interface.php:908 +msgid "Post date" +msgstr "Datum příspěvku" + +#: lib/interface.php:907 +msgid "Relevance (highly recommended)" +msgstr "Relevance (výrazně doporučeno)" + +#: lib/interface.php:905 +msgid "Default order for results:" +msgstr "Výchozí řazení výsledků" + +#: lib/interface.php:901 +msgid "If you don't want Relevanssi to fall back to OR search when AND search gets no hits, check this option. For most cases, leave this one unchecked." +msgstr "Pokud nechcete aby Relevanssi přešlo do hledání s OR, pokud hledání AND nenajde žádný výsledek, zaškrtněte tuto volbu. Ve většině případů ponechte nezaškrtnuté." + +#: lib/interface.php:899 +msgid "Disable OR fallback:" +msgstr "Zakázat automatické přepnutí na OR" + +#: lib/interface.php:895 +msgid "If you choose AND and the search finds no matches, it will automatically do an OR search." +msgstr "Zvolíte-li AND a hledání najde žádnou shodu, bude automaticky provedeno hledání s operátorem OR." + +#: lib/interface.php:893 +msgid "OR - any term present is enough" +msgstr "OR - výskyt jakéhokoli výrazu je dostatečný" + +#: lib/interface.php:892 +msgid "AND - require all terms" +msgstr "AND - vyžaduje všechny výrazy" + +#: lib/interface.php:890 +msgid "Default operator for the search?" +msgstr "Výchozí operátor pro vyhledávání?" + +#: lib/interface.php:886 +msgid "If checked, Relevanssi will be used for searches in the admin interface" +msgstr "Je-li zaškrtnuto, bude Relevanssi použito i pro vyhledávání v administrátorském rozhraní" + +#: lib/interface.php:884 +msgid "Use search for admin:" +msgstr "Použít vyhledávání pro admin:" + +#: lib/interface.php:875 +msgid "Highest post ID indexed" +msgstr "Nejvyšší ID zaindexovaného příspěvku" + +#: lib/interface.php:874 +msgid "Terms in the index" +msgstr "Výrazy v indexu" + +#: lib/interface.php:873 +msgid "Documents in the index" +msgstr "Dokumentů v indexu" + +#: lib/interface.php:871 +msgid "State of the Index" +msgstr "Stav indexu" + +#: lib/interface.php:869 +msgid "Use 'Build the index' to build the index with current indexing options. If you can't finish indexing with one go, use 'Continue indexing' to finish the job. You can change the number of documents to add until you find the largest amount you can add with one go. See 'State of the Index' below to find out how many documents actually go into the index." +msgstr "Použijte 'Vytvořit index' k vytvoření indexu s aktuálním nastavením indexování. Pokud nemůže dokončit indexování najednou, použijte \"Pokračovat v indexování\", pro dokončení úlohy. Můžete měnit počet dokumentů, které přidáváte, dokud nenajdete největší počet, který můžete zpracovat na jeden zátah. Viz \"Stav Indexu\" kde zjistíte, kolik dokumentů je skutečně zaindexováno." + +#: lib/interface.php:865 +msgid "WARNING: You've chosen no post types to index. Nothing will be indexed. Choose some post types to index." +msgstr "POZOR: Nevybrali jste žádný typ příspěvků k indexování. Nic nebude indexováno. Vyberte k indexování některé typy příspěvků." + +#: lib/interface.php:861 +msgid "documents." +msgstr "dokumentů." + +#: lib/interface.php:861 +msgid "add" +msgstr "přidat" + +#: lib/interface.php:861 lib/interface.php:1326 +msgid "Continue indexing" +msgstr "Pokračovat v indexování" + +#: lib/interface.php:860 +msgid "Build the index" +msgstr "Vytvořit index" + +#: lib/interface.php:859 +msgid "Save options" +msgstr "Uložit nastavení" + +#: lib/interface.php:857 +msgid "Quick tools" +msgstr "Rychlé nástroje" + +#: lib/interface.php:852 +msgid "Buy Relevanssi Premium" +msgstr "Koupit Relevanssi Premium" + +#: lib/interface.php:849 +msgid "Import/export options" +msgstr "Import/export nastavení" + +#: lib/interface.php:846 lib/interface.php:1338 +msgid "Stopwords" +msgstr "Stopslova" + +#: lib/interface.php:845 lib/interface.php:1328 +msgid "Synonyms" +msgstr "Synonyma" + +#: lib/interface.php:844 lib/interface.php:1180 +msgid "Indexing options" +msgstr "Možnosti indexování" + +#: lib/interface.php:843 +msgid "Highlighting search results" +msgstr "Zvýraznění výsledků hledání" + +#: lib/interface.php:842 +msgid "Custom excerpts" +msgstr "Vlastní náhledy" + +#: lib/interface.php:841 lib/interface.php:1028 +msgid "Exclusions and restrictions" +msgstr "Výjimky a omezení" + +#: lib/interface.php:840 lib/interface.php:999 +msgid "Logs" +msgstr "Logy" + +#: lib/interface.php:839 lib/interface.php:944 +msgid "Weights" +msgstr "Váhy" + +#: lib/interface.php:838 lib/interface.php:878 +msgid "Basic options" +msgstr "Základní nastavení" + +#: lib/interface.php:529 +msgid "Hits" +msgstr "Hity" + +#: lib/interface.php:529 +msgid "Query" +msgstr "Dotaz" + +#: lib/interface.php:499 +msgid "Searches" +msgstr "Vyhledávání" + +#: lib/interface.php:499 +msgid "When" +msgstr "Kdy" + +#: lib/interface.php:497 +msgid "Forever" +msgstr "Od počátku" + +#: lib/interface.php:480 +msgid "To reset the logs, type \"reset\" into the box here %s and click %s" +msgstr "Logy lze promazat zapsáním řetězce \"reset\" do tohoto pole %s a kliknutím na tlačítko %s" + +#: lib/interface.php:477 +msgid "Reset Logs" +msgstr "Vymazat logy" + +#: lib/interface.php:459 +msgid "Unsuccessful Queries" +msgstr "Neúspěšné vyhledávací dotazy" + +#: lib/interface.php:454 lib/interface.php:470 lib/interface.php:496 +msgid "Last 30 days" +msgstr "Posledních 30 dní" + +#: lib/interface.php:450 lib/interface.php:466 lib/interface.php:495 +msgid "Last 7 days" +msgstr "Posledních 7 dní" + +#: lib/interface.php:446 lib/interface.php:462 lib/interface.php:494 +msgid "Today and yesterday" +msgstr "Dnes a včera" + +#: lib/interface.php:440 +msgid "Here you can see the 20 most common user search queries, how many times those queries were made and how many results were found for those queries." +msgstr "Zde můžete vidět 20 nejčastěji vyhledávaných výrazů, kolikrát byly tyto, řetězce hledány a kolik výsledků bylo u těch dotazů nalezeno." + +#: lib/interface.php:438 +msgid "Common Queries" +msgstr "Často vyhledávané dotazy" + +#: lib/interface.php:433 +msgid "Totals" +msgstr "Celkem" + +#: lib/interface.php:430 +msgid "Total Searches" +msgstr "Souhrn vyhledávání" + +#: lib/interface.php:419 +msgid "Add to stopwords" +msgstr "Přidat do negativního slovníku" + +#: lib/interface.php:393 +msgid "These words are excellent stopword material. A word that appears in most of the posts in the database is quite pointless when searching. This is also an easy way to create a completely new stopword list, if one isn't available in your language. Click the icon after the word to add the word to the stopword list. The word will also be removed from the index, so rebuilding the index is not necessary." +msgstr "Tato slova jsou vynikající materiál pro negativní slovník. Slovo, které se objeví ve většině příspěvků, je v databázi zcela nesmyslné pro vyhledávání. Toto je také snadný způsob, jak vytvořit zcela nový negativní slovník, pokud už nějaký není k dispozici pro váš jazyk. Klikněte na ikonu za slovem a přidejte jej tak do negativního slovníku. Slovo bude také odstraněno z indexu, takže opětovné re-indexování není nutné." + +#: lib/interface.php:391 +msgid "25 most common words in the index" +msgstr "25 nejčastějších slov v indexu" + +#: lib/interface.php:380 +msgid "

      Couldn't remove term '%s' from stopwords!

      " +msgstr "

      Výraz nelze odebrat '%s' z negativního slovníku!

      " + +#: lib/interface.php:377 +msgid "

      Term '%s' removed from stopwords! Re-index to get it back to index.

      " +msgstr "

      Výraz '%s' byl odebrán z negativního slovníku! Pro jeho vrácení do indexu je nutno re-indexovat.

      " + +#: lib/interface.php:367 +msgid "

      Stopwords removed! Remember to re-index.

      " +msgstr "

      Stopslova byla odebrána! Nezapomeňte re-indexovat.

      " + +#: lib/interface.php:330 +msgid "

      Couldn't add term '%s' to stopwords!

      " +msgstr "

      Výraz '%s' se nepodařilo přidat do negativního slovníku!

      " + +#: lib/interface.php:327 +msgid "

      Term '%s' added to stopwords!

      " +msgstr "

      Výraz '%s' byl přidán do negativního slovníku!

      " + +#: lib/interface.php:320 +msgid "

      Successfully added %d/%d terms to stopwords!

      " +msgstr "

      %d/%d výrazů bylo úspěšně přidáno do negativního slovníku!

      " + +#: lib/interface.php:83 +msgid "Relevanssi User Searches" +msgstr "Relevanssi - Vyhledávání návštěvníků" + +#: lib/interface.php:81 +msgid "User Searches" +msgstr "Návštěvník vyhledává" + +#: lib/interface.php:9 +msgid "Relevanssi Search Options" +msgstr "Relevanssi možnosti vyhledávání" + +#: lib/interface.php:6 +msgid "Relevanssi Premium Search Options" +msgstr "Relevanssi možnosti vyhledávání Premium verze" + +#: lib/init.php:86 lib/init.php:87 +msgid "User searches" +msgstr "Návštěvník vyhledává" + +#: lib/init.php:41 +msgid "You do not have an index! Remember to build the index (click the \"Build the index\" button), otherwise searching won't work." +msgstr "Nemáte index! Nezapomeňte vytvořit index (kliknutím na tlačítko \"Vytvořit index\"), jinak nebude vyhledávání fungovat." + +#: lib/excerpts-highlights.php:11 +msgid "There is no excerpt because this is a protected post." +msgstr "Neexistuje žádný Stručný obsah, protože se jedná o chráněný příspěvek." diff --git a/mu-plugins/relevanssi/relevanssi-de_DE.mo b/mu-plugins/relevanssi/relevanssi-de_DE.mo new file mode 100644 index 0000000000000000000000000000000000000000..a73e1cd82588cf4b46216ab7bf222aa69bb1c070 GIT binary patch literal 30997 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 literal 0 HcmV?d00001 diff --git a/mu-plugins/relevanssi/relevanssi-de_DE.po b/mu-plugins/relevanssi/relevanssi-de_DE.po index 6d8f833b..c5a689e0 100644 --- a/mu-plugins/relevanssi/relevanssi-de_DE.po +++ b/mu-plugins/relevanssi/relevanssi-de_DE.po @@ -3,986 +3,959 @@ msgstr "" "Project-Id-Version: Relevanssi v3.1.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2013-09-18 14:31:32+0000\n" -"Last-Translator: jlund \n" +"PO-Revision-Date: 2016-05-11 06:11+0300\n" +"Last-Translator: Mikko Saari \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: CSL v1.x\n" -"X-Poedit-Language: German\n" -"X-Poedit-Country: GERMANY\n" +"X-Generator: Poedit 1.8.7\n" "X-Poedit-SourceCharset: utf-8\n" -"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;\n" -"X-Poedit-Basepath: \n" -"X-Poedit-Bookmarks: \n" +"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n" +"X-Textdomain-Support: yes\n" +"Language: de_DE\n" "X-Poedit-SearchPath-0: .\n" -"X-Textdomain-Support: yes" +# @ default #: lib/excerpts-highlights.php:11 -#@ default msgid "There is no excerpt because this is a protected post." msgstr "Es gibt keinen Auszug, da dies eine geschütze Seite ist." +# @ default #: lib/init.php:40 #, php-format -#@ default msgid "" "Relevanssi needs attention: Remember to build the index (you can do it at the\n" "\t\t\t settings page), otherwise searching won't work." msgstr "Relevanssi benötigt Ihre Aufmerksamkeit. Bitte denken Sie daran, den Index aufzubauen. (Unter Einstellungen). Andernfalls funktioniert die Suche nicht." -#: lib/init.php:84 -#: lib/init.php:85 -#@ relevanssi +# @ relevanssi +#: lib/init.php:84 lib/init.php:85 msgid "User searches" msgstr "Suchanfragen" +# @ relevanssi #: lib/interface.php:6 -#@ relevanssi msgid "Relevanssi Premium Search Options" msgstr "Relevanssi Premium Such-Einstellungen" +# @ relevanssi #: lib/interface.php:9 -#@ relevanssi msgid "Relevanssi Search Options" msgstr "Relevanssi Such-Einstellungen" +# @ relevanssi #: lib/interface.php:86 -#@ relevanssi msgid "User Searches" msgstr "Suchanfragen" +# @ relevanssi #: lib/interface.php:88 -#@ relevanssi msgid "Relevanssi User Searches" msgstr "Relevanssi Suchanfragen" +# @ relevanssi #: lib/interface.php:335 #, php-format -#@ relevanssi msgid "

      Successfully added %d/%d terms to stopwords!

      " msgstr "

      %d/%d erfolgreich zur Stoppwort-Liste hinzugefügt!

      " +# @ relevanssi #: lib/interface.php:342 #, php-format -#@ relevanssi msgid "

      Term '%s' added to stopwords!

      " msgstr "

      Begriff '%s' zur Stoppwort-Liste hinzugefügt!

      " +# @ relevanssi #: lib/interface.php:345 #, php-format -#@ relevanssi msgid "

      Couldn't add term '%s' to stopwords!

      " msgstr "

      Konnte Begriff '%s' nicht zur Stoppwort-Liste hinzufügen!

      " +# @ relevanssi #: lib/interface.php:374 -#@ relevanssi msgid "

      Stopwords removed! Remember to re-index.

      " msgstr "

      Stoppwörter entfernt! Bitte den Index neu erstellen.

      " +# @ relevanssi #: lib/interface.php:384 #, php-format -#@ relevanssi msgid "

      Term '%s' removed from stopwords! Re-index to get it back to index.

      " msgstr "

      Begriff '%s' aus aus der Stoppwort-Liste entfernt! Bitte den Index neu erstellen, um es in den Suchindex aufzunehmen.

      " +# @ relevanssi #: lib/interface.php:387 #, php-format -#@ relevanssi msgid "

      Couldn't remove term '%s' from stopwords!

      " msgstr "

      Konnte Begriff '%s' nicht aus der Stoppwort-Liste entfernen!

      " +# @ relevanssi #: lib/interface.php:398 -#@ relevanssi msgid "25 most common words in the index" msgstr "Die 25 häufigsten Begriffe im Index" +# @ relevanssi #: lib/interface.php:400 -#@ relevanssi msgid "These words are excellent stopword material. A word that appears in most of the posts in the database is quite pointless when searching. This is also an easy way to create a completely new stopword list, if one isn't available in your language. Click the icon after the word to add the word to the stopword list. The word will also be removed from the index, so rebuilding the index is not necessary." msgstr "Diese Wörter bilden hervorragendes Stoppwort-Material. Ein Wort, das auf den meisten Ihrer Seiten erscheint, ist für die Suche nutzlos. Auf diese Weise können Sie außerdem eine neue Stoppwort-Liste erstellen, falls in Ihrer Sprache keine solche Liste vorhanden ist. Klicken Sie auf das Icon hinter dem Wort um ein Wort in die Stoppwort-Liste aufzunehmen. Das Wort wird danach auch aus dem Index entfernt, daher müssen Sie den Such-Index nicht neu erstellen." +# @ relevanssi #: lib/interface.php:426 -#@ relevanssi msgid "Add to stopwords" msgstr "Zu den Stoppwörtern hinzufügen" +# @ relevanssi #: lib/interface.php:437 -#@ relevanssi msgid "Total Searches" msgstr "Alle Suchanfragen" +# @ relevanssi #: lib/interface.php:440 -#@ relevanssi msgid "Totals" msgstr "Summe" +# @ relevanssi #: lib/interface.php:445 -#@ relevanssi msgid "Common Queries" msgstr "Häufige Suchbegriffe" +# @ relevanssi #: lib/interface.php:447 -#@ relevanssi msgid "" "Here you can see the 20 most common user search queries, how many times those \n" "\t\tqueries were made and how many results were found for those queries." msgstr "Hier sehen Sie die 20 häufigsten Suchanfragen Ihrer Besucher, wie oft diese ausgeführt wurden, und wieviele Ergebnisse dafür gefunden wurden." -#: lib/interface.php:453 -#: lib/interface.php:469 -#: lib/interface.php:501 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:453 lib/interface.php:469 lib/interface.php:501 msgid "Today and yesterday" msgstr "Heute und gestern" -#: lib/interface.php:457 -#: lib/interface.php:473 -#: lib/interface.php:502 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:457 lib/interface.php:473 lib/interface.php:502 msgid "Last 7 days" msgstr "Die letzten 7 Tage" -#: lib/interface.php:461 -#: lib/interface.php:477 -#: lib/interface.php:503 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:461 lib/interface.php:477 lib/interface.php:503 msgid "Last 30 days" msgstr "Die letzten 30 Tage" +# @ relevanssi #: lib/interface.php:466 -#@ relevanssi msgid "Unsuccessful Queries" msgstr "Erfolglose Suchanfragen" +# @ relevanssi #: lib/interface.php:484 -#@ relevanssi msgid "Reset Logs" msgstr "Protokoll zurücksetzen" +# @ relevanssi #: lib/interface.php:487 #, php-format -#@ relevanssi msgid "To reset the logs, type \"reset\" into the box here %s and click %s" msgstr "Zum Zurücksetzen der Protokolle bitte \"reset\" in dieses Textfeld %s eintragen und %s klicken." +# @ relevanssi #: lib/interface.php:504 -#@ relevanssi msgid "Forever" msgstr "Für immer" +# @ relevanssi #: lib/interface.php:506 -#@ relevanssi msgid "When" msgstr "Wenn" +# @ relevanssi #: lib/interface.php:506 -#@ relevanssi msgid "Searches" msgstr "Suchanfragen" +# @ relevanssi #: lib/interface.php:536 -#@ relevanssi msgid "Query" msgstr "Suchanfrage" +# @ relevanssi #: lib/interface.php:536 -#@ relevanssi msgid "Hits" msgstr "Treffer" -#: lib/interface.php:846 -#: lib/interface.php:891 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:846 lib/interface.php:891 msgid "Basic options" msgstr "Grundeinstellungen" -#: lib/interface.php:847 -#: lib/interface.php:957 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:847 lib/interface.php:957 msgid "Weights" msgstr "Gewichtungen" -#: lib/interface.php:848 -#: lib/interface.php:1012 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:848 lib/interface.php:1012 msgid "Logs" msgstr "Protokolle" -#: lib/interface.php:849 -#: lib/interface.php:1041 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:849 lib/interface.php:1041 msgid "Exclusions and restrictions" msgstr "Ausschließen oder Beschränkungen" +# @ relevanssi #: lib/interface.php:850 -#@ relevanssi msgid "Custom excerpts" msgstr "Eigene Zusammenfassungen" +# @ relevanssi #: lib/interface.php:851 -#@ relevanssi msgid "Highlighting search results" msgstr "Suchbegriffe hervorheben" -#: lib/interface.php:852 -#: lib/interface.php:1187 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:852 lib/interface.php:1187 msgid "Indexing options" msgstr "Indizierungs-Einstellungen" -#: lib/interface.php:853 -#: lib/interface.php:1335 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:853 lib/interface.php:1335 msgid "Caching" msgstr "Cache" -#: lib/interface.php:854 -#: lib/interface.php:1358 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:854 lib/interface.php:1358 msgid "Synonyms" msgstr "Synonyme" -#: lib/interface.php:855 -#: lib/interface.php:1366 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:855 lib/interface.php:1366 msgid "Stopwords" msgstr "Stoppwörter" +# @ relevanssi #: lib/interface.php:858 -#@ relevanssi msgid "Import/export options" msgstr "Einstellungen importieren/exportieren" +# @ relevanssi #: lib/interface.php:861 -#@ relevanssi msgid "Buy Relevanssi Premium" msgstr "Relevanssi Premium kaufen" +# @ relevanssi #: lib/interface.php:866 -#@ relevanssi msgid "Quick tools" msgstr "Quick tools" +# @ relevanssi #: lib/interface.php:868 -#@ relevanssi msgid "Save options" msgstr "Einstellungen sichern" +# @ relevanssi #: lib/interface.php:869 -#@ relevanssi msgid "Build the index" msgstr "Index aufbauen" -#: lib/interface.php:870 -#: lib/interface.php:1333 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:870 lib/interface.php:1333 msgid "Continue indexing" msgstr "Weiter indizieren" +# @ relevanssi #: lib/interface.php:870 -#@ relevanssi msgid "add" msgstr "hinzufügen" +# @ relevanssi #: lib/interface.php:870 -#@ relevanssi msgid "documents." msgstr "Dokumente." +# @ relevanssi #: lib/interface.php:874 -#@ relevanssi msgid "WARNING: You've chosen no post types to index. Nothing will be indexed. Choose some post types to index." msgstr "WARNUNG: Sie haben keine Post-Typen für die Indizierung bestimmt. Es wird nichts indiziert werden. Wählen Sie ein paar Post-Typen aus.." +# @ relevanssi #: lib/interface.php:878 -#@ relevanssi msgid "Use 'Build the index' to build the index with current indexing options. If you can't finish indexing with one go, use 'Continue indexing' to finish the job. You can change the number of documents to add until you find the largest amount you can add with one go. See 'State of the Index' below to find out how many documents actually go into the index." msgstr "Klicken Sie 'Index aufbauen' um den Index mit den derzeitigen Index-Einstellungen zu erzeugen. Wenn es nicht auf Anhieb funktioniert, klicken Sie 'Weiter indizieren' um den Vorgang abzuschließen. Erhöhen Sie die Anzahl der Dokumente bis Sie die größte Anzahl an Dokumenten erreichte haben, die Sie in einem Zug indizieren können. Sehen Sie auch bei 'Zustand des Index' weiter unten nach, um herauszufinden, wie viele Dokumente sich gegenwärtig im Index befinden." +# @ relevanssi #: lib/interface.php:880 -#@ relevanssi msgid "" "If Relevanssi doesn't index anything and you have upgraded from a 2.x version, it's likely the changes in\n" "\tthe database structure haven't gone through in the upgrade. In that case all you need to do is to deactivate the\n" "\tplugin and then activate it again." msgstr "Falls Relevanssi nichts indiziert und Sie von einer 2.x-Version upgedated haben, sind wahrscheinlich die Änderungen in der Datenbank nicht durch das Update gegangen. In diesem Fall genügt es, wenn Sie das Plugin einmal deaktivieren, und anschließend wieder aktivieren." +# @ relevanssi #: lib/interface.php:884 -#@ relevanssi msgid "State of the Index" msgstr "Zustand des Index" +# @ relevanssi #: lib/interface.php:886 -#@ relevanssi msgid "Documents in the index" msgstr "Dokumente im Index" +# @ relevanssi #: lib/interface.php:887 -#@ relevanssi msgid "Terms in the index" msgstr "Suchbegriffe im Index" +# @ relevanssi #: lib/interface.php:888 -#@ relevanssi msgid "Highest post ID indexed" msgstr "Höchste indizierte Post-ID" +# @ relevanssi #: lib/interface.php:897 -#@ relevanssi msgid "Use search for admin:" msgstr "Suchen im Admin-Bereich" +# @ relevanssi #: lib/interface.php:899 -#@ relevanssi msgid "If checked, Relevanssi will be used for searches in the admin interface" msgstr "Wenn aktiviert, wird Relevanssi auch für die Suche innerhalb des Admin-Bereichs verwendet." +# @ relevanssi #: lib/interface.php:903 -#@ relevanssi msgid "Default operator for the search?" msgstr "Standard-Operator für Suchanfragen?" +# @ relevanssi #: lib/interface.php:905 -#@ relevanssi msgid "AND - require all terms" msgstr "AND – Alle Begriffe müssen vorkommen" +# @ relevanssi #: lib/interface.php:906 -#@ relevanssi msgid "OR - any term present is enough" msgstr "OR – einer der Begriffe muß vorkommen" +# @ relevanssi #: lib/interface.php:908 -#@ relevanssi msgid "If you choose AND and the search finds no matches, it will automatically do an OR search." msgstr "Wenn AND ausgewählt ist, und die Suche ergibt keine Treffer, wird automatisch auf OR umgeschaltet." +# @ relevanssi #: lib/interface.php:912 -#@ relevanssi msgid "Disable OR fallback:" msgstr "OR-Fallback deaktivieren" +# @ relevanssi #: lib/interface.php:914 -#@ relevanssi msgid "If you don't want Relevanssi to fall back to OR search when AND search gets no hits, check this option. For most cases, leave this one unchecked." msgstr "Wenn Sie nicht möchten, das bei einer erfolglosen AND-Suche auf OR zurückgegriffen wird, aktivieren Sie diese Option. In den meisten Fällen sollten Sie diese Option deaktiviert lassen." +# @ relevanssi #: lib/interface.php:918 -#@ relevanssi msgid "Default order for results:" msgstr "Standard-Reihenfolge für Suchergebnisse:" +# @ relevanssi #: lib/interface.php:920 -#@ relevanssi msgid "Relevance (highly recommended)" msgstr "Relevanz (Hochgradig empfohlen)" +# @ relevanssi #: lib/interface.php:921 -#@ relevanssi msgid "Post date" msgstr "Datum des Beitrags" +# @ relevanssi #: lib/interface.php:923 -#@ relevanssi msgid "If you want date-based results, see the recent post bonus in the Weights section." msgstr "Bei Datums-Basierten Suchergebnissen, see the recent post bonus im Abschnitt 'Gewichtung'." +# @ relevanssi #: lib/interface.php:927 -#@ relevanssi msgid "When to use fuzzy matching?" msgstr "Wann sollen unscharfe Vergleiche benutzt werden?" +# @ relevanssi #: lib/interface.php:929 -#@ relevanssi msgid "When straight search gets no hits" msgstr "Wenn die normale Suche keine Treffer ausgibt" +# @ relevanssi #: lib/interface.php:930 -#@ relevanssi msgid "Always" msgstr "Immer" +# @ relevanssi #: lib/interface.php:931 -#@ relevanssi msgid "Don't use fuzzy search" msgstr "Unscharfe Vergleiche nicht verwenden" +# @ relevanssi #: lib/interface.php:933 -#@ relevanssi msgid "Straight search matches just the term. Fuzzy search matches everything that begins or ends with the search term." msgstr "Die normale Suche sucht nur nach direkten Übereinstimmungen mit dem Suchbegriff. Die unscharfe Suche findet alles, was mit dem Suchbegriff beginnt oder endet." +# @ relevanssi #: lib/interface.php:941 -#@ relevanssi msgid "Limit searches:" msgstr "Suchergebnisse begrenzen:" +# @ relevanssi #: lib/interface.php:943 -#@ relevanssi msgid "If this option is checked, Relevanssi will limit search results to at most 500 results per term. This will improve performance, but may cause some relevant documents to go unfound. However, Relevanssi tries to prioritize the most relevant documents. This does not work well when sorting results by date. The throttle can end up cutting off recent posts to favour more relevant posts." msgstr "Wenn diese Option aktiviert ist, wird Relevanssi die Suchergebnisse auf 500 Treffer pro Suchbegriff begrenzen. Dadurch wird die Leistungsfähigkeit verbessert, kann aber dazu führen, dass einige Relevante Dokumente nicht gefunden werden. Relevanssi wird trotzdem versuchen, die relevantesten Dokumente zu priorisieren. Dies funktioniert aber nicht besonders gut bei Sortierung nach Datum, und kann dazu führen dass neuere Dokumente zugunsten relevanterer Dokumente ausgelassen werden." +# @ relevanssi #: lib/interface.php:947 -#@ relevanssi msgid "Limit:" msgstr "Begrenzung:" +# @ relevanssi #: lib/interface.php:949 -#@ relevanssi msgid "For better performance, adjust the limit to a smaller number. Adjusting the limit to 100 - or even lower - should be safe for good results, and might bring a boost in search speed." msgstr "Zur Erhöhung der Leistungsfähigkeit tragen Sie einer kleinere Zahl ein. Ein Limit von 100 oder weniger sollte noch immer gute Suchergebnisse bringen und die Effizienz einer Suche deutlich erhöhen." +# @ relevanssi #: lib/interface.php:959 -#@ relevanssi msgid "These values affect the weights of the documents. These are all multipliers, so 1 means no change in weight, less than 1 means less weight, and more than 1 means more weight. Setting something to zero makes that worthless. For example, if title weight is more than 1, words in titles are more significant than words elsewhere. If title weight is 0, words in titles won't make any difference to the search results." msgstr "Diese Werte betreffen die Gewichtung von Dokumenten. Es sind Faktoren, 1 bedeutet keine Änderung in der Gewichtung, weniger als 1 hat eine geringere Gewichtung zur Folge und mehr als 1 eine höhere. Null macht das Element irrelevant bei der Gewichtung. Wenn zum Beispiel die Gewichtung des Titels mehr als 1 beträgt, dann werden Suchwörter die im Titel auftauchen als aussagekräftiger angesehen als wenn die Wörter woanders auftauche würden. Wenn die Gewichtung des Titels 0 ist, haben Suchbegriffe im Titel keinerlei Auswirkung auf die Gewichtung der Suchergebnisse." +# @ relevanssi #: lib/interface.php:964 -#@ relevanssi msgid "Element" msgstr "Element" +# @ relevanssi #: lib/interface.php:965 -#@ relevanssi msgid "Weight" msgstr "Gewichtung" +# @ relevanssi #: lib/interface.php:966 -#@ relevanssi msgid "Default weight" msgstr "Standard Gewichtung" +# @ relevanssi #: lib/interface.php:971 -#@ relevanssi msgid "Post titles" msgstr "Beitrags-Titel" +# @ relevanssi #: lib/interface.php:983 -#@ relevanssi msgid "Comment text" msgstr "Kommentar-Texte" +# @ relevanssi #: lib/interface.php:1006 -#@ relevanssi msgid "Limit results to current language:" msgstr "Resultate nur auf die gegenwärtige Sprache einschränken" +# @ relevanssi #: lib/interface.php:1008 -#@ relevanssi msgid "If this option is checked, Relevanssi will only return results in the current active language. Otherwise results will include posts in every language." msgstr "Wenn diese Option aktiviert ist, zeigt Relevanssi nur Ergebnisse in der aktuell gewählten Sprache an. Andernfalls werden Resultate in allen Sprachen angezeigt." +# @ relevanssi #: lib/interface.php:1014 -#@ relevanssi msgid "Keep a log of user queries:" msgstr "Suchanfragen der Besucher protokollieren:" +# @ relevanssi #: lib/interface.php:1016 -#@ relevanssi msgid "If checked, Relevanssi will log user queries. The log appears in 'User searches' on the Dashboard admin menu." msgstr "Wenn aktiviert wird Relevanssi die Such-Anfragen Ihrer Besucher protokollieren. Das Protokoll finden Sie unter 'Suchanfragen' im Administrations-Menu Ihres Dashboards. " +# @ relevanssi #: lib/interface.php:1020 -#@ relevanssi msgid "Log the user's IP with the queries:" msgstr "Die IP-Adresse der Besucher ebenfalls Protokollieren:" +# @ relevanssi #: lib/interface.php:1022 -#@ relevanssi msgid "If checked, Relevanssi will log user's IP-Adress with the queries." msgstr "Wenn aktiviert, speichert Relevanssi die IP-Adressen Ihrer Besucher zusammen mit den Suchanfragen. (Diese Option verstößt gegen mehrere Datenschutzrichtlinien, Sie sollten sie nicht aktivieren)" +# @ relevanssi #: lib/interface.php:1026 -#@ relevanssi msgid "Don't log queries from these users:" msgstr "Suchanfragen von diesen Benutzern nicht protokollieren:" +# @ relevanssi #: lib/interface.php:1028 -#@ relevanssi msgid "Comma-separated list of numeric user IDs or user login names that will not be logged." msgstr "Komma-getrennte Liste mit numerischen IDs oder Login-Namen der Benutzer, die nicht Protokolliert werden sollen. " +# @ relevanssi #: lib/interface.php:1032 -#@ relevanssi msgid "If you enable logs, you can see what your users are searching for. You can prevent your own searches from getting in the logs with the omit feature." msgstr "Durch die Protokollierung können Sie einsehen, was Ihre Besucher auf Ihrer Seite suchen. Durch die Eingabe 'Suchanfragen von...' können Sie Suchanfragen Ihrer eigenen Benutzer von der Protokollierung ausnehmen." +# @ relevanssi #: lib/interface.php:1035 -#@ relevanssi msgid "If you enable logs, you can see what your users are searching for. Logs are also needed to use the 'Did you mean?' feature. You can prevent your own searches from getting in the logs with the omit feature." msgstr "Durch die Protokollierung können Sie einsehen, was Ihre Besucher auf Ihrer Seite suchen. Die Protokolle werden ebenso für die 'meinten Sie vielleicht'-Funktion benötigt. Durch die Eingabe 'Suchanfragen von...' können Sie Suchanfragen Ihrer eigenen Benutzer von der Protokollierung ausnehmen." +# @ relevanssi #: lib/interface.php:1043 -#@ relevanssi msgid "Restrict search to these categories and tags:" msgstr "Suche nur in diesen Kategorien und Schlagwörtern:" +# @ relevanssi #: lib/interface.php:1045 -#@ relevanssi msgid "Enter a comma-separated list of category and tag IDs to restrict search to those categories or tags. You can also use <input type='hidden' name='cats' value='list of cats and tags' /> in your search form. The input field will \toverrun this setting." msgstr "Tragen Sie eine Komma-getrennte Liste der numerischen Kategorie- oder Schlagwort-IDs ein, auf die Sie die Suche einschränken wollen. Sie können auch <input type='hidden' name='cats' value='Liste der Kategorien und Schlagwörter' /> in Ihr Suchformular einfügen. Das Eingabefeld wird die hier getätigten Einstelllungen überschreiben." +# @ relevanssi #: lib/interface.php:1049 -#@ relevanssi msgid "Exclude these categories and tags from search:" msgstr "Diese Kategorien und Schlagwörter aus der Suche ausschließen:" +# @ relevanssi #: lib/interface.php:1051 -#@ relevanssi msgid "Enter a comma-separated list of category and tag IDs that are excluded from search results. You can exclude categories with the 'cat' input field by using negative values." msgstr "Tragen Sie eine Komma-getrennte Liste der numerischen Kategorie- oder Schlagwort-IDs ein, die aus der Suche ausgeschlossen werden sollen. Sie können Kategorien auch durch negative IDs unter 'Suche nur in …' ausschließen." +# @ relevanssi #: lib/interface.php:1055 -#@ relevanssi msgid "Exclude these posts/pages from search:" msgstr "Diese Beiträge / Seiten aus der Suche ausschließen:" +# @ relevanssi #: lib/interface.php:1059 -#@ relevanssi msgid "Enter a comma-separated list of post/page IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there). You can also use a checkbox on post/page edit pages to remove posts from index." msgstr "Komma-getrennte Liste von numerischen Seiten- / Beitrags-IDs, die von der Suche ausgenommen werden sollen. Sie können auch die Checkbox beim Bearbeiten eines Beitrags / einer Seite benutzen um Dokumente aus dem Suchindex auszuschließen." +# @ relevanssi #: lib/interface.php:1062 -#@ relevanssi msgid "Enter a comma-separated list of post/page IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there)." msgstr "Komma-Separierte Liste von numerischen Seiten- / Beitrags-IDs, die von der Suche ausgenommen werden sollen." +# @ relevanssi #: lib/interface.php:1068 -#@ relevanssi msgid "Respect exclude_from_search for custom post types:" msgstr "exclude_from_search auch auf Benutzerdefinierte Beiträge anwenden:" +# @ relevanssi #: lib/interface.php:1070 -#@ relevanssi msgid "If checked, Relevanssi won't display posts of custom post types that have 'exclude_from_search' set to true. If not checked, Relevanssi will display anything that is indexed." msgstr "Wenn aktiviert wird Relevanssi keine Benutzerdefinierten Betrags-Typen anzeigen, bei denen exclude_from_search auf true gesetzt ist. Andernfalls zeigt Relevanssi alles an, was indiziert worden ist." +# @ relevanssi #: lib/interface.php:1072 -#@ relevanssi msgid "Custom excerpts/snippets" msgstr "Benutzerdefinierte Auszüge/Snippets" +# @ relevanssi #: lib/interface.php:1074 -#@ relevanssi msgid "Create custom search result snippets:" msgstr "Neues Benutzerdefiniertes Suchergebnis-Snippet:" +# @ relevanssi #: lib/interface.php:1076 -#@ relevanssi msgid "If checked, Relevanssi will create excerpts that contain the search term hits. To make them work, make sure your search result template uses the_excerpt() to display post excerpts." msgstr "Wenn aktiviert zeigt Relevanssi Auszüge an, in denen der Suchtreffer zu sehen ist. Das funktioniert nur, wenn Ihr Theme die Funktion 'the_excerpt()' benutzt um Textauszüge anzuzeigen." +# @ relevanssi #: lib/interface.php:1078 -#@ relevanssi msgid "Note: Building custom excerpts can be slow. If you are not actually using the excerpts, make sure you disable the option." msgstr "Anmerkung: Benutzerdefinierte Auszüge zu erzeugen kann ziemlich lange dauern. Wenn Sie ohnehin keine Textauszüge eintragen, sollten Sie diese Option deaktivieren." +# @ relevanssi #: lib/interface.php:1080 -#@ relevanssi msgid "Length of the snippet:" msgstr "Länge des Snippets:" +# @ relevanssi #: lib/interface.php:1083 -#@ relevanssi msgid "characters" msgstr "Zeichen" +# @ relevanssi #: lib/interface.php:1084 -#@ relevanssi msgid "words" msgstr "Wörter" +# @ relevanssi #: lib/interface.php:1086 -#@ relevanssi msgid "This must be an integer." msgstr "Bitte eine ganze Zahl eintragen" +# @ relevanssi #: lib/interface.php:1090 -#@ relevanssi msgid "Allowable tags in excerpts:" msgstr "Erlaubte HTML-Tags in Auszügen:" +# @ relevanssi #: lib/interface.php:1093 -#@ relevanssi msgid "List all tags you want to allow in excerpts, without any whitespace. For example: '<p><a><strong>'." msgstr "Liste alle HTML-Tags, die Sie in Auszügen erlauben wollen, ohne Leerzeichen dazwischen. Z.B.: '<p><a><strong>'." +# @ relevanssi #: lib/interface.php:1097 -#@ relevanssi msgid "Show breakdown of search hits in excerpts:" msgstr "Alle Trefferstellen in den Auszügen anzeigen:" +# @ relevanssi #: lib/interface.php:1099 -#@ relevanssi msgid "Check this to show more information on where the search hits were made. Requires custom snippets to work." msgstr "Zeigt mehr Informationen, an welchen Stellen die Suchbegriffe im Text gefunden wurden. Erfordert benutzerdefinierte Snippets." +# @ relevanssi #: lib/interface.php:1103 -#@ relevanssi msgid "The breakdown format:" msgstr "Format der Trefferstellen:" +# @ relevanssi #: lib/interface.php:1105 #, php-format -#@ relevanssi msgid "Use %body%, %title%, %tags% and %comments% to display the number of hits (in different parts of the post), %total% for total hits, %score% to display the document weight and %terms% to show how many hits each search term got. No double quotes (\") allowed!" msgstr "Benutzen Sie %body%, %title%, %tags% und %comments% um die Anzahl der Treffen anzuzeigen (in den unterschiedlichen Stellen des Dokuments), %total% für die Gesamte Anzahl an Treffern, %score% für die Gewichtung des Dokuments, %terms% zur Anzeige, wieviele Treffer jeder Suchbegriff erbracht hat. Es sind keine Doppelten Anführungszeichen (\") erlaubt!" +# @ relevanssi #: lib/interface.php:1107 -#@ relevanssi msgid "Search hit highlighting" msgstr "Suchergebnis hervorheben" +# @ relevanssi #: lib/interface.php:1109 -#@ relevanssi msgid "First, choose the type of highlighting used:" msgstr "Erstens: Art der Hervorhebung auswählen:" +# @ relevanssi #: lib/interface.php:1112 -#@ relevanssi msgid "Highlight query terms in search results:" msgstr "Suchbegriffe in den Ergebnissen hervorheben:" +# @ relevanssi #: lib/interface.php:1114 -#@ relevanssi msgid "No highlighting" msgstr "Keine Hervorhebung" +# @ relevanssi #: lib/interface.php:1118 -#@ relevanssi msgid "Text color" msgstr "Textfarbe" +# @ relevanssi #: lib/interface.php:1119 -#@ relevanssi msgid "Background color" msgstr "Hintergrundfarbe" +# @ relevanssi #: lib/interface.php:1120 -#@ relevanssi msgid "CSS Style" msgstr "CSS-Style" +# @ relevanssi #: lib/interface.php:1121 -#@ relevanssi msgid "CSS Class" msgstr "CSS-Klasse" +# @ relevanssi #: lib/interface.php:1123 -#@ relevanssi msgid "Highlighting isn't available unless you use custom snippets" msgstr "Hervorhebung ist ohne Benutzerdefinierte Snippets nicht verfügbar" +# @ relevanssi #: lib/interface.php:1127 -#@ relevanssi msgid "Highlight query terms in result titles too:" msgstr "Suchbegriffe im Titel ebenfalls hervorheben:" +# @ relevanssi #: lib/interface.php:1133 -#@ relevanssi msgid "Highlight query terms in documents from local searches:" msgstr "Suchbegriffe in aufgerufenen Dokumenten ebenfalls hervorheben:" +# @ relevanssi #: lib/interface.php:1135 -#@ relevanssi msgid "Highlights hits when user opens the post from search results. This is based on HTTP referrer, so if that's blocked, there'll be no highlights." msgstr "Hebt die Suchbegriffe hervor, wenn der Besucher ein Dokument aus einem Suchergebnis heraus öffnet. Diese Funktion basiert auf Abfrage des HTTP-Referrers, wenn der blockiert wird, gibt es auch keine Hervorhebung." +# @ relevanssi #: lib/interface.php:1141 -#@ relevanssi msgid "Highlight query terms in comments:" msgstr "Suchbegriffe in Kommentaren hervorheben:" +# @ relevanssi #: lib/interface.php:1143 -#@ relevanssi msgid "Highlights hits in comments when user opens the post from search results." msgstr "Hebt die Suchbegriffe auch in den Kommentaren hervor, wenn der Besucher eine Seite aus dem Suchergebnis heraus öffnet." +# @ relevanssi #: lib/interface.php:1147 -#@ relevanssi msgid "Uncheck this if you use non-ASCII characters:" msgstr "Deaktivieren, wenn Sie nicht-ASCII-Zeichen verwenden." +# @ relevanssi #: lib/interface.php:1149 -#@ relevanssi msgid "If you use non-ASCII characters (like Cyrillic alphabet) and the highlights don't work, uncheck this option to make highlights work." msgstr "Wenn Sie Nicht-ASCII-Zeichen verwenden (wie z.B. im kyrillischen Alphabet) und die Hervorhebung nicht funktioniert, deaktivieren Sie diese Option bitte." +# @ relevanssi #: lib/interface.php:1154 -#@ relevanssi msgid "Then adjust the settings for your chosen type:" msgstr "Dann: nehmen Sie die Einstellungen für die gewählte Hervorhebung vor" +# @ relevanssi #: lib/interface.php:1158 -#@ relevanssi msgid "Text color for highlights:" msgstr "Textfarbe für Hervorhebungen:" -#: lib/interface.php:1160 -#: lib/interface.php:1166 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:1160 lib/interface.php:1166 msgid "Use HTML color codes (#rgb or #rrggbb)" msgstr "Bitte HTML-Farbcodes verwenden (#rgb oder #rrggbb)" +# @ relevanssi #: lib/interface.php:1164 -#@ relevanssi msgid "Background color for highlights:" msgstr "Hintergrundfarbe für Hervorhebungen:" +# @ relevanssi #: lib/interface.php:1170 -#@ relevanssi msgid "CSS style for highlights:" msgstr "CSS-Style für Hervorhebungen:" +# @ relevanssi #: lib/interface.php:1172 -#@ relevanssi msgid "You can use any CSS styling here, style will be inserted with a <span>" msgstr "Sie können beliebiges CSS eintragen. Die Styles werden durch ein <span> eingefügt." +# @ relevanssi #: lib/interface.php:1176 -#@ relevanssi msgid "CSS class for highlights:" msgstr "CSS-Klasse für Hervorhebungen:" +# @ relevanssi #: lib/interface.php:1178 -#@ relevanssi msgid "Name a class here, search results will be wrapped in a <span> with the class" msgstr "Benennen Sie hier eine CSS-Klasse. Der Suchbegriff wird von einem <span> mit dieser Klasse umschlossen werden." -#: lib/interface.php:1185 -#: lib/interface.php:1364 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:1185 lib/interface.php:1364 msgid "Save the options" msgstr "Einstellungen sichern" +# @ relevanssi #: lib/interface.php:1189 -#@ relevanssi msgid "Choose post types to index:" msgstr "Welche Beitrags-Typen sollen indiziert werden:" +# @ relevanssi #: lib/interface.php:1194 -#@ relevanssi msgid "Type" msgstr "Typ" -#: lib/interface.php:1195 -#: lib/interface.php:1241 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:1195 lib/interface.php:1241 msgid "Index" msgstr "Index" -#: lib/interface.php:1196 -#: lib/interface.php:1242 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:1196 lib/interface.php:1242 msgid "Public?" msgstr "Öffentlich?" -#: lib/interface.php:1213 -#: lib/interface.php:1256 +# @ relevanssi +#: lib/interface.php:1213 lib/interface.php:1256 #, php-format -#@ relevanssi msgid "%s" msgstr "%s" -#: lib/interface.php:1214 -#: lib/interface.php:1257 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:1214 lib/interface.php:1257 msgid "yes" msgstr "Ja" -#: lib/interface.php:1214 -#: lib/interface.php:1257 -#@ relevanssi +# @ relevanssi +#: lib/interface.php:1214 lib/interface.php:1257 msgid "no" msgstr "Nein" +# @ relevanssi #: lib/interface.php:1235 -#@ relevanssi msgid "Choose taxonomies to index:" msgstr "Taxonomien für die Indizierung auswählen:" +# @ relevanssi #: lib/interface.php:1240 -#@ relevanssi msgid "Taxonomy" msgstr "Taxonomie" +# @ relevanssi #: lib/interface.php:1277 -#@ relevanssi msgid "If you check a taxonomy here, the terms for that taxonomy are indexed with the posts. If you for example choose \"post_tag\", searching for tags will find all posts that have the tag." msgstr "Wenn Sie eine Taxonomie hier aktivieren, werden all ihre Begriffe zusammen mit dem Beitrag indiziert. Wenn Sie z.B. \"post_tag\" auswählen, wird die Suche nach einem Tag auch die Beiträge finden, die diesem Tag zugeordnet sind." +# @ relevanssi #: lib/interface.php:1281 -#@ relevanssi msgid "Minimum word length to index" msgstr "Mindestlänge von Wörtern im Index" +# @ relevanssi #: lib/interface.php:1283 -#@ relevanssi msgid "Words shorter than this number will not be indexed." msgstr "Kürzere Wörter werden nicht indiziert." +# @ relevanssi #: lib/interface.php:1289 -#@ relevanssi msgid "Expand shortcodes in post content:" msgstr "Shortcodes im Beitrags-Inhalt ausführen:" +# @ relevanssi #: lib/interface.php:1291 -#@ relevanssi msgid "If checked, Relevanssi will expand shortcodes in post content before indexing. Otherwise shortcodes will be stripped. If you use shortcodes to include dynamic content, Relevanssi will not keep the index updated, the index will reflect the status of the shortcode content at the moment of indexing." msgstr "Wenn aktiviert wird Relevanssi die Shortcodes in den Beiträgen ausführen. Z.B. gelangen Bildzuschriften in Galerien dadurch in den Suchindex. Ein nachträgliches aktivieren dieser Option aktualisiert nicht den Suchindex, in dem Fall müssen Sie den Index aktualisieren. " +# @ relevanssi #: lib/interface.php:1297 -#@ relevanssi msgid "Index and search your posts' authors:" msgstr "Beitrags-Autoren indizieren und suchen:" +# @ relevanssi #: lib/interface.php:1299 -#@ relevanssi msgid "If checked, Relevanssi will also index and search the authors of your posts. Author display name will be indexed. Remember to rebuild the index if you change this option!" msgstr "Wenn aktiviert wird Relavanssi auch auf den Autorenseiten suchen. Die Namen der Autoren werden dabei indiziert. Bitte denken Sie daran den Index neu aufzubauen, wenn Sie diese Option aktivieren." +# @ relevanssi #: lib/interface.php:1303 -#@ relevanssi msgid "Index and search post excerpts:" msgstr "Auszüge indizieren und durchsuchen:" +# @ relevanssi #: lib/interface.php:1305 -#@ relevanssi msgid "If checked, Relevanssi will also index and search the excerpts of your posts.Remember to rebuild the index if you change this option!" msgstr "Wenn aktiviert wird Relavanssi auch auf den Auszügen Ihrer Beiträge. Bitte denken Sie daran den Index neu aufzubauen, wenn Sie diese Option aktivieren." +# @ relevanssi #: lib/interface.php:1309 -#@ relevanssi msgid "Index and search these comments:" msgstr "Diese Kommentaren indizieren und durchsuchen:" +# @ relevanssi #: lib/interface.php:1311 -#@ relevanssi msgid "none" msgstr "keine" +# @ relevanssi #: lib/interface.php:1312 -#@ relevanssi msgid "normal" msgstr "Normal" +# @ relevanssi #: lib/interface.php:1313 -#@ relevanssi msgid "all" msgstr "Alle" +# @ relevanssi #: lib/interface.php:1315 -#@ relevanssi msgid "Relevanssi will index and search ALL (all comments including track- & pingbacks and custom comment types), NONE (no comments) or NORMAL (manually posted comments on your blog).
      Remember to rebuild the index if you change this option!" msgstr "Relevanssi wird ALLE (alle Kommentare einschließlich Track- & Pingbacks und Benutzerdefinierte Kommentartype), KEINE (Keine Kommentare) der NORMAL (von Besuchern gepostete Kommentare).
      Bitte denken Sie daran den Index neu aufzubauen, wenn Sie diese Option aktivieren." +# @ relevanssi #: lib/interface.php:1319 -#@ relevanssi msgid "Custom fields to index:" msgstr "Benutzerdefinierte Felder indizieren:" +# @ relevanssi #: lib/interface.php:1321 -#@ relevanssi msgid "A comma-separated list of custom fields to include in the index. Set to 'visible' to index all visible custom fields and to 'all' to index all custom fields, also those starting with a '_' character." -msgstr "Eine Komma-getrennte Liste von Benutzerdefinierten Feldern die in den Index aufgenommen werden sollen. Wählen Sie 'Sichtbar' um alle sichtbaren Benutzerd. Felder aufzunehmen, oder 'Alle' um auch solche aufzunehmen, die mit einem '_' anfangen." +msgstr "Eine Komma-getrennte Liste von Benutzerdefinierten Feldern die in den Index aufgenommen werden sollen. Wählen Sie ’visible’ um alle sichtbaren Benutzerd. Felder aufzunehmen, oder ’all’ um auch solche aufzunehmen, die mit einem '_' anfangen." +# @ relevanssi #: lib/interface.php:1331 -#@ relevanssi msgid "Save indexing options and build the index" msgstr "Einstellungen sichern und Index aufbauen" +# @ relevanssi #: lib/interface.php:1337 -#@ relevanssi msgid "" "Warning: In many cases caching is not useful, and in some cases can be even harmful. Do not\n" "\tactivate cache unless you have a good reason to do so." msgstr "Warnung: In vielen Fällen ist das Caching nicht sehr vorteilhaft und manchen Fälle sogar nachteilig. Aktivieren Sie den Cache bitte nicht ohne einen sehr guten Grund!" +# @ relevanssi #: lib/interface.php:1340 -#@ relevanssi msgid "Enable result and excerpt caching:" msgstr "Ergebnis- und Auszugs-Cache aktivieren:" +# @ relevanssi #: lib/interface.php:1342 -#@ relevanssi msgid "If checked, Relevanssi will cache search results and post excerpts." msgstr "Wenn aktiviert wird Relevanssi Suchergebnisse und Auszüge cachen." +# @ relevanssi #: lib/interface.php:1346 -#@ relevanssi msgid "Cache expire (in seconds):" msgstr "Cache läuft ab (in Sekunden):" +# @ relevanssi #: lib/interface.php:1348 -#@ relevanssi msgid "86400 = day" msgstr "86400 = 1 Tag" +# @ relevanssi #: lib/interface.php:1352 -#@ relevanssi msgid "Entries in the cache" msgstr "Einträge im Cache" +# @ relevanssi #: lib/interface.php:1356 -#@ relevanssi msgid "Clear all caches" msgstr "Cache löschen" +# @ relevanssi #: lib/interface.php:1362 -#@ relevanssi msgid "Add synonyms here in 'key = value' format. When searching with the OR operator, any search of 'key' will be expanded to include 'value' as well. Using phrases is possible. The key-value pairs work in one direction only, but you can of course repeat the same pair reversed." msgstr "Synonyme im 'key = value' Format hinzufügen. Wenn mit dem OR-Operator gesucht wird, wird jede Suche nach 'key' auch auf 'value' ausgedehnt. Die Benutzung von Sätzen oder Phrasen ist auch möglich. Die Key-Value-Paare funktionieren nur in eine Richtung, aber Sie können natürlich weitere Paare mit vertauschten Werten eintragen." +# @ relevanssi #: lib/interface.php:1385 -#@ relevanssi msgid "

      Enter a word here to add it to the list of stopwords. The word will automatically be removed from the index, so re-indexing is not necessary. You can enter many words at the same time, separate words with commas.

      " msgstr "

      Tragen Sie ein Wort ein um der Liste der Stoppwörter anzufügen. Das Wort wird automatisch aus dem Index gelöscht, daher brauchen Sie den Index nicht erneut aufzubauen. Sie können mehrere Wörter auf einmal durch Kommata getrennt eintragen.

      " +# @ relevanssi #: lib/interface.php:1387 -#@ relevanssi msgid "Stopword(s) to add: " msgstr "Stoppwörter hinzufügen:" +# @ relevanssi #: lib/interface.php:1388 -#@ relevanssi msgid "Add" msgstr "Hinzufügen" +# @ relevanssi #: lib/interface.php:1391 -#@ relevanssi msgid "

      Here's a list of stopwords in the database. Click a word to remove it from stopwords. Removing stopwords won't automatically return them to index, so you need to re-index all posts after removing stopwords to get those words back to index." msgstr "Liste der Stoppwörter in der Datenbank. Klicken Sie auf ein Wort um es aus der Stoppwort-Liste zu entfernen. Das Entfernen bringt die Stoppwörter nicht automatisch zurück in den Index, Sie müssen daher nach dem Entfernen der Stoppwörter den Index neu aufbauen.." +# @ relevanssi #: lib/interface.php:1417 -#@ relevanssi msgid "Remove all stopwords" msgstr "Alle Stoppwörter entfernen" +# @ relevanssi #: lib/interface.php:1423 -#@ relevanssi msgid "Here's a list of stopwords you can use to export the stopwords to another blog." msgstr "Eine Liste von Stoppwörtern zum Export in einen anderen Blog." +# @ relevanssi #: lib/uninstall.php:41 -#@ relevanssi msgid "Data wiped clean, you can now delete the plugin." msgstr "Alle Daten sauber gelöscht. Sie können das Plugin jetzt löschen." +# @ relevanssi #: relevanssi.php:296 -#@ relevanssi msgid "Tag weight:" msgstr "Schlüsselwort Gewichtung:" +# @ relevanssi #: relevanssi.php:311 -#@ relevanssi msgid "Category weight:" msgstr "Kategorie Gewichtung:" +# @ relevanssi #: lib/interface.php:1004 -#@ relevanssi msgid "WPML/Polylang compatibility" msgstr "WPML/Polylang Kompatibilität" - diff --git a/mu-plugins/relevanssi/relevanssi-fr_FR.mo b/mu-plugins/relevanssi/relevanssi-fr_FR.mo new file mode 100644 index 0000000000000000000000000000000000000000..cfbfbca8f280a120da266878036195a0be91ff28 GIT binary patch literal 45145 zcmds=3!GhdRqwY@XldmQ1w>${B|QmbCP|@Crb$Ygq-|(k%}iQeHQh63&&+AgV|pG* zCI})@uP7pjpdi&ERR}1e7GH>0I$WQ~LmnauKCYt3Ra8(Em3zOxwf_J8I5P=th5Nam zJD={Xv(MT4|5*R^UhDtwXC86R>k|I{o$Fhni;@_~oy+a!6|qm$%*z=s1L z4t!LAmjLz1<-m2oYk|)N-U7S{xB`43aNUJTax?HH!0Um33OoVa`j{m7W8i7vKLKxh zY?AyI@Z{r?<6 zUIWzg8E_-;R$vSGqd<-00Z&Sjqri1Q-G3+W2=I2`Hv_*2d1Dj zpxU1Yf}-R&P5Yg@@MxX(IW#aQ`vjChq?MC^~!so!>^gQ$UU9H#YeC{Wfp|-~SQt zAm88bDUPSZK;h+9pxS)}a0>X-z-I#g8u(P;llX^Mlk0$20Ea-0=Uu?Pzz+bA0WV}Q zuL8adcnqMY@LjzX#q0e8yJr z!1zB8d^z`zep-@rfNum|1w8NR^nE|Z2Ye^@v(HG9SM&VCnZ)b4|B1_!N5CCG(eqtEt=A`kdjHcv z(bMOEw*wytk`Dv#1lqiTqK9*LCCRS>w*ZCL&jX(X%y;{^Zv#G<`_}^>3A_{dAmA?p z)z95Pwf8~bJn%C>(e0i+j?eu-JvR+}BJe119q=W<#{usEYCV1xsQG?0-2W|5^6~yx zJ0JfG@OH)lf6JlBRK&S9^VBNzTXQJUwjaF9`Lh3SRwfWQ0ww7*Lu4X zK+WeW;1X~j@I2sq1N=>(*6Tw+z4sZQ#_^9pt@nQbyTHf5MEd@_fm^=`S_F!&R-WVZ z@khYRxIgbYr{^8O+j;KeK+*YNzvJPYgO2AX0C)2IRv@I648r}-hu^;h)VR(&EYCg1~rP2fj>w*b}twi}U=yzp$G z-urokhUoF#0e%elDDJ-qMD!)+G1z(FWxyQxCg39QelI{a0gnOsFZm$RV`1?TN@o#{l`!50; z!2bk_F4i;I#{>5P_5C97PT;G7qN~e5%B{dTpnm^2kSQns2^9XGzuH@0S4oh5J8k^O^fkbf6vXkMvw_ z{030t|2%Lb@Ubjf19%ls-QAk zGT%=DA-&|Tq05VhjIbfN-wxaboCSj761h@bHV> z&b{s>@Fn9u4ZI2X&hK!2`_13!?Y$WY2`7s*_NM!xCxP$R{cZ3a_Y>cZ4aEJv??G1q zzY2Ug@K0WWjRwrV*ZJ;)z+dD3>E8$5=;t4ScXR(0Ca3q`3o|kFr1vVPr_TW&%l-L3 z0RI6m20j3|6L=Z$8sHY-i-B6lcZTmj8NPqWtDRo24Dh8u(dYYsYWJ^zj{$xacp>n@ z*I;Wgt_h&z@uz+eSp)nW@ZrEqK;EN)mjfROJOI>tv%t;3WuV$S4SW#reL%^F-veF) zeBKYaTzE6^p?VG|y7(2~hk%~}-VA&vi>&cI^!4BhxB;m3xe3T4$?OliUHE07p1br% zd_30yHNK-jjei8xxL*$ZR^aP_T9;n{YJ8W!!RhxZpq{@DcoFdVz^4FT9N^mm{3y`y z1x)${@p`>zCe&X0M!4*_camjE9I+y+$p`++^+i-6+S&jXKu&o2Qr z-{;)n>(>E3i~HMwcLDzpC_DC*Z-#Dp{w;5DIdt<+dVeni&hXqDfj0oZ0DKYws) z+yQ(9_rC~yAn34FxQI6Ykg%(%~h zn#T(8hk;Lcr@#MhpvM1R;Ddp811|u6IQ;%6K&|6n0=52M0Nx+?te>n5)B;bNzR& z=W{`__BX-5zsYqy*MMuD>lD`#*B-9l=i0(`l*82NJzMSL|js6JNlerFZ>FMlEj(@+Waxc0TPka~G z_lEC(3HWR-#G>)@Zv*xBXZCNB{08tDT;Cq?`Hvn(tdRMsL7~n&J@8)_e*9zBq zu3zE0gX=WcU0iSAI*03TxIW8u9@k%ReVOa0xLRCa;`%g~{(i?n@($odTufUD2- zdam)m6MS(S*M`auf5hi2xc-If#(x|!>JTsLvOpX>Ly9?zw}5!WNRPIB$ydI8r* zxc-Xk3tam9JlD5!eOxz{zs;4;U*Yqo!u>Z_zK<+L?O2l;Sv zW3u5uFO6UNH&30*hJ&=(TNtFB)?A)kdRf}(4TkAluhZ#u(-XaZbC9;W>2NUzH1m_m zwr1;i+G=iZbn?LKwl_vg&1{%A)A_8KH+F1W+OexQYB#%$VVX6Y=`ini z(#HBhBOUhA!LYYvO|RRwd1=SC%`~~=zBJs=JH6w1rS18Cuk&AReL4;<_2!%F(!+Tt z@66_XjlG{w7$PR`)6l0!b93Nre$;L+3oqbneRK1A$IsyFfSZ{D&))if9ouD#0UzlY zmO+oBM8jXmhiPk=&SrDRbh{c=OFQ;-A%-+F;z}3uJ`3108sR-YiPYLHXs|b5F6Cr8 z!`Gsj^hB%OPP5Ul*U5&hxlD+h&Es16*a~Xhln%-jYjqdI3f&KCd@Q z=dx~^+o(EOcR5gf#%SnskaZYftCQ1KzLfQ$@$kTj)^O1nB^wwqB+&e|Os6qma;s(# zxd!^PepPP)FZ$xcVWL_|%qnE2d?!FJO5R^CR0 z&{C^A*B&(`MoMWinNF+yUfMX`8nkBHNE3S!L6d5H;oG#{Sk|?fG<(y;glV_R7fS1~V^bn>dwkFfP^QkBW5`{)UPW&a!Am^n% zUv=RFpXnga`g4ovt)slZyou+bLE+sA8Pb&uYo^9@w2uK!CT7TKa{BXHhzXB<65f7*DwDqrnM#C0)u|ObkLiCJO6y^Rx-t=7udusMl>n zW3wZhzR5KPGbc<)L@t3J!<-2<5m5%t9Wmr>SJuVvg|cfoKh(((w{Dk(l}FY%ZVe z^^S!njqQcr#oh@x9x`uroxXh8(i5%;rE#417h8yC@Q8rGqLLCY_83HAIOw*PmU5n< zRT0A^J@q80O}Gq~m!P63Of_EnZJ3?xb$gvw<+t=NUi#X*@6h78C@UY4uyX4P9bqFj z3EmVb)CJVp+UGZn$!rZ3(H(X2K1*#PZ13(t${6f(ySG3WF2A6nAS$J}5tsb9AbM4+ zlCs16EPW;ty5jhf14DcBA}}3QLHBIZ^c{NhxE~E@aV!d>NyVzSJIpg2`leKA)ih3OQqR zsRw)pSC$X-o3NZ#G3X3B3-6xD#aPMiR?~Vrrml<}gSe!T*1-52fi{oym5%52@TF4) zblV@!^_n1ecW;h`>q2=flE&f;xZ5leR>w4*D9p?le_hK8Yx^_C0~MB;?IRr}{G{=ZQ9r%$72}G_46E2;&0PbIzKvfDvH}=PaE^RJ52U;Z4#zujY`y{SS|-$L-{#k zvB~(HdfJ0-Zw(eF+A#M>j5`?SP*p#jHS63OkiKrWkh08HI)%==CTs_jON&cWH0S25 zT&A_C91kmB==GOVQMggFcnO-3HH5olF3Xs@zsGHwDU>aE+cF^sLpW*}*^}A3`4a}A zRS}~j&r8eKtR!J|o7Q*7CGFuAt?rT}8!}{jW3h#s(rp+!Zg0q6Y`B8l-iSu7Igw!~ z{JQy)h2a(3Hd|{2)&k2(=D9-iKHOq4oBl!ALH+(nGyux+Pi3!Zxz3JXiM!1vb?-TX z@h0d(%F;xqQ%1pzxU52lleQ4ygLI9QZnzOI1obkI-<%I*hA*LCqG*we(1DFn(KOJ{ zH~xPxgThHFNF~E~Mgh+DPKs&ECCHn&FIo)KJ;9@KqreE={lTxfrV!}8Vi#v7A)Ixq z(0YZrVAR@EHYlT;AgG)`#~(A(=M2rbjfQZ>?ve1Y$DC@A_N==)9LS2nI&2oqX=cqH zGYMr51hFbc(U`E3Ao%W30~z)+SBR?=$<>&E!%ZxLYjs4Km{s0GVM$4NLB`Fgea!-HG5Y!Oy21u#RxKvLX;Y~Jmvg<-3L<)zrdQ{KBzB=_|P$E@PS$Epe9pArlGl@Ae~It7GO*%+P zA<=0^QKZ&p_{7`xGC7V0vyi)0X(3$v@YwCry?bs_xB zbq!C+Nf#bF*)jYti{6aP7d3?!MDe)FK<9cxz{raU^#^_jDTh7>`6n^86q#y#xkMaL-mUM z4I72Cqh>PJ?#OCE zWFD|=7(se<%}1JrVP%p8yEgB4Goetyfc##(+U^k;yC?5CFA(1vwoPRB&N93@`&1qj zW3)^W7EXOS>eArAmQ84nc6abuN*w6jdc);!(35K1-_e9w-K$x|>Zk2EfC}kLLOW|zOdq(f-CGh#TQp2OW+BEw zuahe#LBI2@lOlkATD-O?HKmdbj-^CZ5l#r3TSvViRyh&1N|&f6EiS^L2+}dh;R*bJ zAmY&+t)b>VAPP*Zxsd&`JcwF~lfennPpVB`w;m~5J7H?crgfqPg@QtaRul0&neIX3 z%(akS%N5y#@>{~E4+5(xy@8NLyA60v_NoPkdju1iidjcmqRN~+aIKJ}2@4nVuB3v` zy&O!Z4W$XgB4ezh>3xw(=N!B8KJ)_$h?-$^m;$iHF+&JVZeJ5hG96~tei6S4!p#EF zl|;yFJp>a4co6=!dTukXyN^SSjlO)*=4xdloC{mA8SYx zx7cg=%5(jeg|RkP!#AcIMWthc4_(p0ei&M&p{9GTE9?ehW6mpQBrxch-tjA8uBbR9 zLPh;qv%@D71oM#cSyu(0TLF_|3CweqZJLF~g4Bk)IwoDw=fQxWtB(0qo7|un5R>)w zt4aD|z8bKJ@}r@*4Hlh_ST*?`$8mP5_dx4etZLXC#FTNN$@HKkg-L*lEpDtTlNE28 zAR8h9UXzGpq}A3v$yUN8KuDQ-oXx+oo{{@)0=o93 zA{PW#gSl3WG4_)Nv#NvG#X90KYX@z0c1(G1gVC&LRH@B^$U{JSlZ$-Aj5*3dZfr6$ z2myjjf*N?492DY2WN-8pV})i9oqZ4r78$E3W^Nb9VFg}LpUo_X!-SUkvK4RVy41(q!ALYX@d#0 z^X;01rKl<|d4^2r$~|CZf-*QWVArf#8OSA}uso&^8{Qtyn30LEA$PN=G3g`kwc%^Q ztvxQJj#w=X!B{C0_q+w=%_ef}$`&(xJ#u6pFp5 zL{3~OPeWK|0}=@YOHN4kII@^$sblTccGkyZh-oUPC;v`SCS!nz^)RMN_(sCc<`xWD zVb|^hH<9BFO29&|!asXGCY}`HVt7_D9kQ>S5VTI?J1KH^hcpQNS`< z&e)hc&pwW5J8O9vuhoKFh8JJ>%#ej7epmu0!w#|opRE=?5FR_(GB&1B3DSu+EITuV z5@G z^VxBkyO!Q5hGxIss|7K_4$1sDz@T)a^H16u{{;I7)Ds5n1s>7S$-mMj=IgvQZN1rTk=uRU^yWLRA;(iKE!G z7va>H@vCL9)|F(mL0hOpu>&8qb!(g>5yq>A%zHFy!SLC$4y-vYwS` zdwk4G#xPBJgb12SvOKE!*RCXk9}5DWCmN?8N;8g&Wvv@2B<}zrVUYl4YhocRzQ$P6 zHfd8*0ingnIRBN|e8UDMbWqtav2%LYUfldx=7Iy$ZV}+ywcMwM3R^X6FD+)c)f)?{ zE276rZYZ@O<+mxWVs+((b_*9)UMVys=uM60BvdCnrV!+k*xn_0MS6w`f`IlLEnz8_ z+VX5rPRAm4CQbZPC=Lie#3*5SaC3<8#S((OQi_TFYZDEuCFxT5H^f8qRQ2~lXjndD ztp_~aPz3f?wZJ-*hV>c^7!{h3!)9~0JU&&A)|h}aD~~cJh}4G(tH_D7aj)@wc(l~E z(ktQdH4OjQbF{L;y~H!IOGNlE$B$QM`l`e&`awZTMU@y9V&3zM#%>i!>muF;A4imK zu<|UZfl#N5ev@)0|B8ns46X5{9+Q-w-H4eci+2?+lyevuRy?=2!SoWsllDoas8*#l zPt70+j-b%I=>h)vG*nrUkad^ao;J1K%yEF*cq+T(#tRb_X^24(YBc(JD_{!htp(na z>*NDcAc&WPw`L>~e2=MQpJEE@o7f^0*VxU|wp4DO89wLT1*RWeLXWBPvSnYQ`iDKE zu@JR=d?d=ea4$f&(g&99Dwvlh_!83{zKs6&CX@BHLD^5G4P}v+ zln2&_EPim~N_UOP1YvF~EfknfR*KpZAxL07i1~_Q>90%nx4Ny)$ifTM8ag5vr(rwU zFT;LznXrW%ci9y&Rc}f|CUp^^Rz#+#7LuhJP5odc;sS;09*o^XbdF4Ib@9eQ(+22F zF-+rMiX$y65q>0e0l{`=!w3|_?SB3*eqVsxf~+Fp>;(Iez+B?P7m zgJ#UqzUAmJ&ovtnUx`0)PyOL$Yo5@xH0_!%m}|hOYIv9Bqc1AotH#{197Q~6Wav|= zm49h+!PAQL8O4rV&e9{tVz9-Z8;)2%MRoP67An3s7OGMl)JxxZ#%0}Pf|WF3WN$Gq zObM^@9N@_JMhlC{LDx#58nL-9Ib;eA-%Bz+Ib=0GF{NOk-sF&oM@rH^x%(PEE1|30 z;gsEDg%wqGHgaTyoDumUw&vuBn_kFhWE2f%YW%za$lczhwjL|&b+6pZX7S%9lS89f ztb!|(>s6`BzZO@g{BDqhrABOSFm=By*T?i82H3{j#SHj zs;@wAMLAtbb)|>juZ&THFa(%La7F23*|~3Dx)T{l8I!d*I;V{X6M~B)U_YRvv`MhZMassi7p} z#>s87{dDt=`y9{aMLFJ@Q<2F8Zwe(yX6hq}3^Q`Z0}iIqRz)eM^a`SLtb%B)s={0p zytS!hTDE@FbkQatwxb$W|K1j$pO2*q{KaTPSSw=2;tO9eluMb@Voee!oqUi?E1xq< zg!-68l@LZjlFCh?<5S5DMvAE^`(<{ttbtWHC=?E?Q-KerlNW|Cnekwsj5h@& zdmh1-ov)T4X0v``wPMlTI`7%T1{URZj1+~9=}y~oAZ&UNycYARm{Go2L2omCB6f;D zq4Xd@VhV+YEpp(iFN0ic3bm)ndfp zg=H$?TeEzni{0|wB-PN*7ZiE6$%lPVQVsAS!rsbT+>Pfh{v7IHObuCZJIxj{N<0ZP zu|@-7j3i`1(qJ5#(h8FCtkmKZ};%)1*3qUyIyA2*YTo81SA`;n~)F_*{L`REIirM>xid`2w>pRCUmyHebw*i078? zT1=AYpw^ZFS-FiCIU+g^%OkUFQkj=1W95QAD{>;yQ}FZw6Ui(<&@L68k`=fbTUiWt z0VtXha+GxE%29C(ObtR!-QqF(CjM;3i84pEN6aPgM+zH=o~ZwG5ztFd<$d>)t#R|G zhl^^tW-t@gA-k_4jHs+Zpf&E@VRb|MCfQoa!E)^2oygy%(+IEZ(iRL+r34s7ib;>%iju?2zVq$d%M#lKF zilv|eEE!|iSIxqB5ewvDEEXN8xMxe~Xpve7JEx2$l}(^SC4Z{-hPi5I8gJN6NAQ^`$32igO)ql;9?PtiuPy@Jjmo<(B`I@)kO-)3=zN{;R8v7 zk~t+u#e=+EganEHz*8C#VjiXoJ6_a+A`yWeOtr~js5K1|SnyjJb@_lJ~jeI~=rNd}1fqEdWzGIpUE> z`U6d{8!KxwTPsjD#nXdgt7fsS00T8$Kig|AuiuoeH=eQ&m_qAq9P6W*w_cdKX0qP&wtci5JKqoR&+=96M;RE!hp@8Vw4yzVXg^^! zFxaKU_GKjH8GF(yW{7;h$rJ~&*~1M`J`^26#PA}5g9-xV_%oV+V{GG1LsK0y@7&Ib z;fJVu8y82>-q;a8MU$_lc?r-Ec_i{pX}+_8NZ)KHap^+OiK?-S{Bv!Whm9q?C#>Jn zn=P$@qAaDl8WC@nz7g+^XtHgzVOaB^WS|G~~`bF%?EDu@D_ ztVuD6mcy2!?4OK|dkiGR3fea`O&Z>>o!P(74L<&*v?SedaerY}mgU9${=&lS>_&Sm ztf;I5%Zo$FfqP%zKiyQ(z{Sd$$h5jJ4Rc)5(?Y-GDZBGW;IJEa9zL-5z%^5{AQeFf z)(9$AgzVmu+Vq(~U#=Nrq{F^eeZ^WtvddFO(x+>+=9RNI9@@We^PygQSwh;xJlle2 zTkY0xIl0kyzBs6u1IATS1EzDP!gEXp&0_y3epK@Ts%a2^f;o-AtnWlY(alNYUzyy9 z%)_cizxVo<*J2Nvz9X8gQg0AxO4@`_5DJEiU~ENvBsUTQa-oZKt_cS(s;uO747;A@ zL#&8mtrh-FU(h9HirrdS^vQ&kvM7m$FL4kzy@|;rXwf;g1+H8p)?db=QF}cgWsQYA zxkVgI@6cm?)BL!6*f3{8Tw}dxOrBh%6#TH)MFv7Eu{6gVLX!eTR$?-N0~2IZV%tw9 zbcjJx<~kCKp%(l#nTRD=b5|nnbntmr>}X2flecDSgw0poUV?JS`3GCPotUY^zba=B z9*Pzd!GPT#)nMG-si~PZ^&K-_=3akD)6uJBnUxVS7bfD|2P4Lqp`n`M#rbjb-VI{c z)@8;H%g(f=wQOw`>w+uOn!~4lDiR57&?kjjlL^{0In?jnf_Xi$w>fcxNBE|ye&X@1 zlTSbYaIW0T#QwoTt2uGiXkjoh)0;}qKXhDH%DJuN)9FB=ReX4n%pXlIlbO{M!<6Fa-{l@#re;jIMh?ZcVgP|5@Ze7Z9AMwy_@3K>%z`*MdGK@qerhe znqP7BC^hs{ubv!EZQXR~6-T=cif@m0d%dObQ|0sArlZ}tsi)6vvX@TkfjOFsAG#-t z-?}ILweT$EibtuI?H|nC!aZaSvgbH zC@y8g#i?|%{Bqhj_z+)DY|#&PKuKHC@RieP^Dkcd2JQ8hmTj(_mIlu`tt1=GjnMbC zN6Md{3a=v>k-I7cSK6mVssP1kXPEGdl%#Rae1GLM83iSesOfLhnF+;vapH*bj06^C z7ip~7El3SS`Q7ih`;PU4yYIOBJ*4kW7Jd)k+_!^Gs@=#V7_zUs){CYTy{r4&OA+bv z9#&4PrSt&vlI7RRPhrCwra+tPqyBw6>}03Vl+wybL0M2=9(BSzzAhM>LBi#%gPa4c zf_j9Yz7cKPa)?;R)*wAxpb2||Fd9U{oaaVME2p)5O@$l^qN`!j&O+&fa5g=5aORNC zp@~K$F@M|76VbMq%KB3dp%{QRdy?FYhm+4;p-2_H??HQqrX8&QRkNJGFA1t3bcd2sFdcIbUE2qhaMVz8??ar2Eg@GP9gh zJo*cxwu-BkIOb<*#|=GARKKXSZ){c?0dhe#1Nw-a(_J~O(ol{|VQ#0CuZs98&>c8s z3_XX7uhrsOeQ5}c)@CgICq#<)$B|iILzKBuv|*-6LCL8K&M=;uH3=W zVjQy4d~AnS)7>s*2Lr~=_Y!0`_z5f~%?z=D2y8BEb{vmqfjow>l^GatbrS_n)@+AS zo?gg&7dPaIBy~S}<*nNAr71y}b9PpXk*r30RGo}rM>IJhZDG>ODAb8EVn*~4h!KK< zwjo~DgFLAbY|W$Q8GI{mH)3TescF)VEDEBC+4?dY6QZ3kC+3h6N_%S9 zi;xn1*a|CfX2)$wwudIhroh<@Hu!)i21jU=qg@E6!k*+LhsJ&NX;pYk87XT4#mH$J z-7Y=T$Qlf_u}T_s`W_oowIM(9#m`45PJ@Y~p|3IeJ4+uVYa(qndb8Ml(0EuZhWV~7pbu)aDbj#SWX(9ZyVfKq1 zD#O|}RKx~pG#gsAf()oj$mdK@_oOy#nH3e2$RiX-Y)lqM<#`s>8dl*jLTlwT!*23y z;9Tc;7gJ0{hs}8BdtKbu%o!&wsVW8^il3!iw47KVs=Zh_t;1(%0vC#j`2h%B1$#9> zBOiDPj)9Z179wfo^l>&&+Lp&nu0j}Dkd(|&))V9Eth`;my?W7lv>SO>jKg6xj$qJO zF{?Nk1{PpES~9FX>4hLI`GCPH0gEw18l*SU+QtKF=#0^Mt~=Tn!z$i5`(yiYbSNgU1*+QKnwgYD zSUcPDUKyhFa*?Iq)ng8)5RcKKA$`-5$a9Oli5_zHz!`*fcok|u<|03ctE#}{Y%()F zP|AXK!)l=k`h=I_AuMBB(&t=~E^%?BcjMhVGDs@E;KWDY)Gn|w2s>?W`j%^G^)p7yBc_7zqX8MmK%v@l@& zY)FVI!j(?V^Z}hE?uCgxK?aPieer#9LeKaEyVf$S#v0!pOwlx-XZM_hPhGO1{Ml9@ z@n@OzK3jM|hDC1{be7M-)skK6QXZ|01Q$$jK{O5SzT?W|V4rPDrd8u(b-vJ~y$IHd z8Y}JT45Th&!CpT#VV0^J{sjjhOId7nvYUbXh62Vb_qGj-cUeE;xd#uci|P}i?J`wd zISr_8L?j0^ZV^Zq5<{xHlEeUlT1_g7)r!gLMlDy!R~?5&3h5!85hSkUN3CSjq(}qF zK+I;W?M9_pQxKuuLi5?Qm$0=?wut2-N|KdVp!DQPA&!L!Tgt!{v@U}_m~f~`*%8Nk z!MxCpy<(2o0%$X9!Hf#(jFi`~J~T*0tYDRVC%YPY zC#mL%a`bC;Cr^O^l$QEgMU>$c1B6*4V41p`nx0H=kSj(bvOC-s zDi-`3a@J9Gk)TfM9c0)r-(t|Xv7leVMqdwvHxt3C$*}EB_J&ciNkyn)fy%r+YcHnS zaQDMpFz&2WU6{Ei>&93>CwiVB~z`mFa z1ewV^Cqql6TP|OH{l)4lr-?e7btTq~RI)ixNZ>3FFjgO6L1U2MOz1Zeat}H99#Wzo zl?1PhGqi?N;dv8mK_cnVFs*Qm)7N;o9J0vv-Zg8~O-^>x=zrFcRANFt2eIlCDTsVkLN9M3t0p)Fh6>{C-yR!G4d zqpB>Nlfc2)F6#G?)Ru@T(^)qnq0*ce|1amKipSJiu8xQ#8P}Tmj=zHul&MtCeP-KB zYJ`cyMJR%THn;dWsj@|V!A^UWK`I`{ekyy^PKz4ZX;DPeEJ{YGMbr>V(T!Re0Ulf} zkfP|?9F|x+2pC#DPMcWtTH%V&Rd747&#Cm#&gr093%TdEP%y!4T!zOm0ku_H>Bedb z6KcD1rI$_V(x^3%J4_vv3Xbr{TXN0su=TbQx0SaMu3$TX5bs!{pN3mE)*gqbIMQl; zhQ%n8Q&=u8Q%lWj8F6hgu{G!Q+Lv7Qqw|D;-zmRA88|*h}<_+_P)gpR9K)9X2XSmWBlx@{h8>n%Fg2o0yEjwgBTpIkyQwBOm|oiIH%biLm<;U z+m+MFe$obXPz`n1GT0cw4X5EE(pt7tWbwsJtQTs_R-@o> zi~iuV<(`- z-J??GcM*OT(^gim2&@vH2+=#ETRmh{Zh-*#E3AFH@S8liQk;}KX0}bTEo&?c=IgWe zNHy)%gjAW93&aZY>ZF8`s`@thY|a?2Ghr1F4E+X59;21D$HLIp8cc7_tJh>?gx(5V zC@kpbhpmd@A_NKMDMN-Vqzs5r!Z64`D#!|9YU#OE=ZP_j>TzOUb5tCqZOZ2BgM}2z ziQ3TQADTpJMY3z`C^AX{2Dk^Bmk7#a&K$~%D%y71ZBUU(Ed*RjBzT-Ch=G)NB|zZ^ zILFwT#2V>mRJ?Cib3S_x282>VkcUNoo%6G1wj?)O20_h*pba0of-p4+2!f>uOinUx z_(KPnEqS)IEZZtlp2536r3iQ1+#;l`$zO(o5R&XQf4q2C=~eQoO#&{2lHIZ*hPJFD zn@BcQ^e4Sr0Y0VzSk(W7z!FXxd$2#?2rOuwS)okXi-v#f zSl7Z(?2KtuYaDtEb-tGOH6kpO95eH6oQ3XFblv55NbEX~vD_W3K*A3M>6w$4|o0X{Vf zmh}-_2}`PjeeE|O&H@s&9PwEky)0_P$upEpER+#_4}=z0L@-Dc7FP=1jVx*}?$s=c z@gr+2-ys&PP2fOdbsfjO98`Mm#^g&|j4Y-sg}I7=resxVRgk+$^lkr?Xcl{x2c~IK zrS@T+*r8ns`il&sbq5o~gVXd@MUCh#5+JGC`N=bx$Q9N+6G_?1`(&Vr!VD|ghmOiR z4{RcxujcYbXRZ-|Bd3S7I>S=WF=~;PFjlOq0`#(?5s8**lYFe|B~nvnd=-;iIUQUJ znUCg#M3LS_I-}70%Ilnh)R7T-2Gqr1BDfkZ$}p|r&~73MqZJwgj}#A<=e5Ptz6~*D zw6;1OdT<^)6N(EOMIcrTW|hr)#j~(exD~NAm{XZ!=SssdCk4ByWC}_zz$Yqe6#^?> zIZMiKDdE+gh{g&6%og%x4i21OgJ z0xk@sAJ!~}*tJ;E6@a;_)|cm|YhiZw6hSr0<*}mHl!`|iWDe*^4#vN6^7y zrbp+=rMggw1Az$SoibwT^Q==!^vt3uC{_!PEGk?PEt(C|hQ}cMi!ffoM{awTHol2v zl~!T=OD?Nci2ku>M7B*Cjl&`YqOTBVUC@OP zmX_0scEcz{m#ebsH6spVP_Zyb8XBU?Y3;M|tiFZiMTU_%l$wLOkyA{3mH8Q!kEsyl z(7;;D%vzIxQ5ID!F#FM4s1m1{O-G02B<*p! zO`gZ3JdJ{jB97`LhOeW2-4;9a0KXkg$vpZxc@-il4$tE;PU=vh6rzl3Ocrd=L$!M{ zKd=O(fBmQj*2I<6{!paTYjO5}#Tg-9nvsQS7K^B-LOKehYw~5Mg#@cagRA4fNhy!u zvuIk4j?6DK`@`iHVz=)qrh;E#O=n_MPUG80m4^j-RU4&X#40=?$Y`QDvRJ%vb>IYj ztz-INx-O@l5ifV9k3U<9I19m6GCk!qeox3lrKwuTQCI2gppENkVR zmX{BOsuWY!vZz#yR`y$(MxJD_k{PWMN8a1vekS1kTtAcXT8yZBO(>TRoe4yttq6(6 z$;oTQ){`-ZOydo!$F%jR&Q2lT+6-&6Gp)XAcEQrqRw$TLo~auQEAP}68VKY+=wCBN@r!sk!m0%?5l{?GF#A| zvw3oiHesb0vTxv(@FEGIP!2Yn{Vy{Et(Lv;7V(GyO4cj?rOhkifxuoro7FMu7ExK% zNeGWs2d2TQRWV3V2nBn~aKtCCJHgRp$5L*OAS_k{#1LO%ZOy7X#s8v7qYPrY9K5j- ztwAxta#XUUO#53^hA9ELJ7fN6fh-+jzprS)6hgILpz!!AK{8n;ref*MHcjY%!k1oY zWy!S+E*!G*c10n~Xvn*q9U&t*3JgXI3G{n}aB5bEY%^rGrRHRcR=RFVOXhai&^H1R zHY=or5)bvkn=L7&eugnelRDb)E=S6dt74rfj~QTVOrhp?m0>YO!{S+n8!V+D!#o^a zSR7`!QS2eo1yid6k7Gp+m@>rboSMcc(d`knGv+``yN8rhiS#ntV>V-{_$>zMAxIG} z$}HyaAXG0z1&uEGqJj!85a-mf6G1voBvux88D)iHFNld!mm&uw!VW3B@&SDbE5%BS z;)ifLqUf>unq*_LSO4-0s4RFxx){4d4;P_{V(gZ0S^F*TU;ig4o-Q=aSzb_l)0S6f z%)Hva5y#Xz2!=vKI2>qZUNL(suTGVjJsRRXcL5zM8r_MOE; z7z0Yj8i)pN#fVY^(nF=?P+-0`HAWLX^XjzpOyMXLKe$~aYqNzbkAt_as6!Tx%=)!w zl6|~CYr%9|8;w`iUzfr;(i9>1E(^YC-y{t9A_@ zwqMy=aY`b1C^I6e>hy?-F=WA{Zb{T)4P(Msbh6unO#|(glZ@tM44u)(5aSR2?KH|| z{JVYTtIBpJ5amZss!2O^G7x^Dl;OpV#Sh3-Dt2z9RY_&j?WNe2 zQNvCE2C!O4+2Xr98qcUaRIyp_*&&q`e8WU*#dOB-TpG_s^h&dO4(LYxMM#~B_8F|> zY)gdzK&zs}aw3HpS<4bU#&mh#7&aP~gLKs?ml#=QzboffCV26~DijHlgg(fTr}bcL z4;RK+lihFT!x-AE=%c~_c%B?bqSA{Ea9l`p^)*J%fsrWTe?BLX4u!JVU^V|K7|eNhj-Z+Zrs104PVG!gvof5cye&>L^vvWc zJ0RJqEybY(#AaJa0H#*w|0oCt3CHYZea5S8vNse_^nx1ce|2$4C|xqs4lydH2HZ<} zm{F{%4XOB=*uV;A{){N!m2V8!DctEt^0&a>6^)!5CIVR^K|@pgQv(OSiCYdnh6 zNsJIRpyZ~lg;k*9V;p|he zLN|&=jM*gm#E~nn(D{!dbrgnMXwZ|2y&7(ekL09K(XaoTuT3gEG@}9!)2P9twR4BG z#KF#!J+~fvvEoa5Q>V6*^5;A5MSss&*toQois?=xdx8w$cB1#-{u{%Zyr4y0|+%A+9y)?;~0B!lCP5f#V(}7WRz7vU28$K5f`ZPVvx0# zwk~tVCU9mB9+^ou6!D6xjmm0JA205P{?|G|6n-lrptTq4jDn@J^T@6v2RNYABvj>5 z&J`UM=ZaRomnB9m8B&pTfat^iSs}n>a`lMOuR~5)yfN*e3wWczMp3kufNgZxkn`S5 zAwzB=SSh{3ehw+GSy_7he|=Jl-2zdOE$TQD)6f!3##*V;ry6oV6Pf=|RuRaFsf3-_ z98|d8HP^?4tgXHYGsW^PKEr5>D8GeXpl;|XX7^Q{9$oobduRN9KWI@5vaHM!DN3)c zvHy#i1}YpR`;}?aaG3Bt+#ee<`y^Du(QatLgiH%d=j~y_Eu>SH;}$g15rp@NcLt6 zDPzI>mKs;s+g(qqmfU|iZVFR`5ew0l!H7{C(bc2RP>=*8R zy>J(54Pw<>yZ z<$9;zB4i*h(U4BX?OX(L}I1O-^SuLBkGJTCNlzFvVaJYmPw_NdpX8M(Ni? z;bhBGzUbLh%%6~WAc7GsfHf+fF_4Q_HAwf6!8!UyY|BxtRw#0Y%(D$TW);cCNlqxF zUs!3jQ&EVG5dhG?E4VQFdalO?OWXn8B21^G7YU55%+dbu4I!Yc1cA!CDH{uRbiD&I zwqZAS_0{lQeJC=Cb+RSIQt8FNsy#WG9_gA6kWC>(!0CGH6ehXO0gu@@aiMH6!yOKn ztdQ11uKEJ2!i#AWR84CYUZ5T;6h4k?>*JE6vDK3t<`_nY)1PzCPvb96f*rQzLn~))iu9E6sbqgpwFC^tsOj1oFR*0 zBj1#mD{KhEFb|m$D3~-TvwCtM+6dqu(WZ2}mLeV(BOeG>k=`(&xWJxJPGQ$k$u7-n zX$$qm6k27MS>Z9Q9M!3L5oW4xSda+7P<}NXa-R_<~|*_ z(L6#z|KV^OTa3AtyBI(g><^75!Cj)dYh#%cED>feX zH1U<3fE;ji(od}2UCB^Dz zMs<) z7j61Ex3!kb18>I$0wyc2E{#WJBIL%CZ|$817)v8Gjrb_KQ`x zw2UN1!>M|LZrq|(kL}BNl9o4r(B-?)jI@zw^dt~VD=Ln}wJ2-ndJ7sac*RS{h=bZ$ zyUsbK-BnIOcDfm!!E~*gg4J@}NJ0|V@&5z~-lJs0*t>Pq&_a0Wi%q~1-C=84C)C>% z5x6k5*g$m}3WC}$GoQv8JRqAzFp5I*n253+Q=^hCo7P&Rj+nNPl_5nWQm(t3Gx}HR z!~Ki_8!GnmzXyhGuwi+))6oVIx3{#f&T5-y+kyRB;UMRkJcI{odqqUOmst9wrWEud0cf+2;Gkd3}_w3(uV20tk=qh#@vAaP3 zhht1PtfOETo7D`STug`)4WlTR^st;ISLv1d`?c6&SJ(w>+Gj7Gj3Ijgs2i1 z!D)fK9m%rLG=`F-_i!9LyP8yJVIgXienqBRBT>+l*%>uqK5^OS6i+5M zRH`>ZtdWHt^i0w%Z!Nrg+u?rMG@wA^i2oZc`SrJfw} zL)uDXhv1dWVpf<0bgF}jK~UUaPXLvKlV|47AkUSvR8f~jYhnyXv|CBISV1`F7h@A3 ziW5yTLF=#>6Mmd&QmKAOWH}I-NeW>(nHbGQ`$wcMK}6im!htA2eN_u=i<;cxWa)`r zs}PRF*<`{<6AL-=$xb;IeI#W-01HwC!Vu3YAfOcDpi-c$iD^x9NNrN?ed?E*cThx5 z^*!R9=!LzAJK*J7K15a)J+_YnCs<-PFO7OllthmjKZHpu*;}*gQxzh`UD?GHLN5vt YD4xxjW#L0sA+`\n" "Language-Team: \n" "Language: fr_FR\n" @@ -11,36 +11,47 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Poedit-SourceCharset: utf-8\n" +"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;" -"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n" +"_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;" +"esc_attr_e\n" "X-Textdomain-Support: yes\n" -"X-Generator: Poedit 1.7.1\n" +"X-Generator: Poedit 1.7.5\n" +"X-Poedit-Basepath: .\n" "X-Poedit-SearchPath-0: .\n" # @ default #: lib/excerpts-highlights.php:11 msgid "There is no excerpt because this is a protected post." -msgstr "Il n'y a aucun extrait car ce billet est protégé." +msgstr "Il n'y a aucun extrait parce que le billet est protégé." # @ relevanssi #: lib/indexing.php:118 msgid "Indexing complete!" -msgstr "Indexation complète !" +msgstr "Indexation terminée !" -# @ default #: lib/init.php:41 msgid "" "You do not have an index! Remember to build the index (click the \"Build the " "index\" button), otherwise searching won't work." msgstr "" -"Vous n'avez pas d'index! N'oubliez pas de construire l'index (cliquez sur le " -"bouton \"Construire l'index\" sinon la recherche ne fonctionnera pas." +"Vous n'avez pas d’index ! Pensez à générer l’index (cliquer sur le bouton " +"« Générer l’index »), sinon la recherche ne fonctionnera pas." + +#: lib/init.php:57 +msgid "" +"Multibyte string functions are not available. Relevanssi may not work well " +"without them. Please install (or ask your host to install) the mbstring " +"extension." +msgstr "" +"Les fonctions Multibyte string ne sont pas disponibles. Relevanssi risque de " +"ne pas fonctionner correctement sans elles. Veuillez installer (ou demander " +"à votre hébergeur de le faire) l'extension mbstring." # @ relevanssi -#: lib/init.php:86 lib/init.php:87 +#: lib/init.php:85 lib/init.php:86 msgid "User searches" -msgstr "Recherches par les utilisateurs" +msgstr "Recherches utilisateurs" # @ relevanssi #: lib/interface.php:6 @@ -50,84 +61,92 @@ msgstr "Options de recherche de Relevanssi Premium" # @ relevanssi #: lib/interface.php:9 msgid "Relevanssi Search Options" -msgstr "Options de recherche de Relevanssi" +msgstr "Options de recherche de Relevanssi Premium" # @ relevanssi -#: lib/interface.php:80 +#: lib/interface.php:81 msgid "User Searches" -msgstr "Recherches par les utilisateurs" +msgstr "Recherches utilisateurs" # @ relevanssi -#: lib/interface.php:82 +#: lib/interface.php:83 msgid "Relevanssi User Searches" msgstr "Recherches Relevanssi par les utilisateurs" +#: lib/interface.php:111 +msgid "Enable query logging to see stats here." +msgstr "Activer le journal des recherches pour voir les statistiques ici." + +#: lib/interface.php:126 +msgid "Logs clear!" +msgstr "Journal vide !" + # @ relevanssi -#: lib/interface.php:319 +#: lib/interface.php:320 #, php-format msgid "" "

      Successfully added %d/%d terms to " "stopwords!

      " msgstr "" "

      Ajout réussi de %d/%d termes aux " -"stopwords!

      " +"stopwords !

      " # @ relevanssi -#: lib/interface.php:326 +#: lib/interface.php:327 #, php-format msgid "" "

      Term '%s' added to stopwords!

      " msgstr "" -"

      Terme '%s' ajouté aux stopwords!

      " +"

      Terme « %s » ajouté aux stopwords !" +"

      " # @ relevanssi -#: lib/interface.php:329 +#: lib/interface.php:330 #, php-format msgid "" "

      Couldn't add term '%s' to " "stopwords!

      " msgstr "" -"

      Impossible d'ajouter '%s' aux " -"stopwords!

      " +"

      Impossible d’ajouter « %s » aux " +"stopwords !

      " # @ relevanssi -#: lib/interface.php:366 +#: lib/interface.php:369 msgid "" "

      Stopwords removed! Remember to re-" "index.

      " msgstr "" -"

      Stopwords retirés ! N'oubliez pas " +"

      Stopwords retirés ! N’oubliez pas " "de réindexer.

      " # @ relevanssi -#: lib/interface.php:376 +#: lib/interface.php:379 #, php-format msgid "" "

      Term '%s' removed from stopwords! " "Re-index to get it back to index.

      " msgstr "" -"

      Terme '%s' retiré des stopwords! " -"Réindexer pour le récupérer dans l'index.

      " +"

      Terme « %s » retiré des " +"stopwords ! Réindexer pour le récupérer dans l’index.

      " # @ relevanssi -#: lib/interface.php:379 +#: lib/interface.php:382 #, php-format msgid "" "

      Couldn't remove term '%s' from " "stopwords!

      " msgstr "" -"

      Impossible de retirer '%s' des " -"stopwords !

      " +"

      Impossible de retirer « %s » des " +"stopwords !

      " # @ relevanssi -#: lib/interface.php:390 +#: lib/interface.php:393 msgid "25 most common words in the index" -msgstr "Les 25 mots des plus fréquents de l'index" +msgstr "Les 25 mots des plus fréquents de l’index" # @ relevanssi -#: lib/interface.php:392 +#: lib/interface.php:395 msgid "" "These words are excellent stopword material. A word that appears in most of " "the posts in the database is quite pointless when searching. This is also an " @@ -136,186 +155,180 @@ msgid "" "list. The word will also be removed from the index, so rebuilding the index " "is not necessary." msgstr "" -"Ces mots font d'excellents stopwords. Un mot qui apparait dans la plupart " -"des billets de la base de donnée ne sert pas à grand chose pour une " -"recherche. C'est aussi une manière simple de créer une nouvelle liste de " +"Ces mots font d'excellents stopwords. Un mot qui apparaît dans la plupart " +"des billets de la base de données ne sert pas à grand chose pour une " +"recherche. C’est aussi une manière simple de créer une nouvelle liste de " "stopwords si celle-ci n'est pas disponible dans votre langue. Cliquez " -"l'icone après le mot pour l'ajouter dans la liste de stopwords. Le mot sera " -"retiré de l'index aussi est-il inutile de reconstruire l'index." +"l’icône après le mot pour l’ajouter dans la liste de stopwords. Le mot sera " +"retiré de l’index, aussi est-il inutile de régénérer l’index." # @ relevanssi -#: lib/interface.php:418 +#: lib/interface.php:421 msgid "Add to stopwords" -msgstr "Ajouter aux stopwords." +msgstr "Ajouter aux stopwords" -#: lib/interface.php:429 +#: lib/interface.php:434 msgid "Total Searches" -msgstr "Nombre de recherches total" +msgstr "Recherches totales" -#: lib/interface.php:432 +#: lib/interface.php:437 msgid "Totals" msgstr "Totaux" -#: lib/interface.php:437 +#: lib/interface.php:442 msgid "Common Queries" -msgstr "Requêtes en commun" - -# @ relevanssi -#: lib/interface.php:439 -msgid "" -"Here you can see the 20 most common user search queries, how many times " -"those \n" -"\t\tqueries were made and how many results were found for those queries." -msgstr "" -"Vous pouvez voir ici les 20 requêtes les plus courantes, combien de fois " -"ces \n" -"\\\\\t\\\\\trequêtes ont été faites et combien de résultats ont été trouvés " -"pour ces requêtes." +msgstr "Requêtes communes" # @ relevanssi -#: lib/interface.php:445 lib/interface.php:461 lib/interface.php:493 +#: lib/interface.php:451 lib/interface.php:467 lib/interface.php:499 msgid "Today and yesterday" -msgstr "Aujourd'hui et hier" +msgstr "Aujourd’hui et hier" # @ relevanssi -#: lib/interface.php:449 lib/interface.php:465 lib/interface.php:494 +#: lib/interface.php:455 lib/interface.php:471 lib/interface.php:500 msgid "Last 7 days" msgstr "Sept derniers jours" # @ relevanssi -#: lib/interface.php:453 lib/interface.php:469 lib/interface.php:495 -msgid "Last 30 days" -msgstr "Trente derniers jours" +#: lib/interface.php:459 lib/interface.php:475 +#, php-format +msgid "Last %d days" +msgstr "Derniers %s jours" -# @ relevanssi -#: lib/interface.php:458 +#: lib/interface.php:464 msgid "Unsuccessful Queries" -msgstr "Requêtes sans résultat" +msgstr "Requêtes infructueuses" -#: lib/interface.php:476 +#: lib/interface.php:482 msgid "Reset Logs" -msgstr "Remettre à zéro les logs" +msgstr "Réinitialiser le journal" -#: lib/interface.php:479 +#: lib/interface.php:485 #, php-format msgid "To reset the logs, type \"reset\" into the box here %s and click %s" msgstr "" -"Pour remettre à zéro les logs, tapez \"reset\" dans le champ ici %s et " +"Pour réinitialiser le journal, saisissez « reset » dans cette boite %s et " "cliquez %s" -#: lib/interface.php:496 +# @ relevanssi +#: lib/interface.php:501 +msgid "Last 30 days" +msgstr "Trente derniers jours" + +#: lib/interface.php:502 msgid "Forever" -msgstr "Pour toujours" +msgstr "Toujours" -#: lib/interface.php:498 +#: lib/interface.php:504 msgid "When" -msgstr "Quand" +msgstr "Lorsque" -# @ relevanssi -#: lib/interface.php:498 +#: lib/interface.php:504 msgid "Searches" msgstr "Recherches" -#: lib/interface.php:528 +#: lib/interface.php:536 msgid "Query" msgstr "Requête" -#: lib/interface.php:528 +#: lib/interface.php:536 msgid "Hits" -msgstr "Hits" +msgstr "Occurrences" # @ relevanssi -#: lib/interface.php:837 lib/interface.php:877 +#: lib/interface.php:845 lib/interface.php:885 msgid "Basic options" msgstr "Options basiques" -#: lib/interface.php:838 lib/interface.php:943 +#: lib/interface.php:846 lib/interface.php:951 msgid "Weights" -msgstr "Poids" +msgstr "Importance" # @ relevanssi -#: lib/interface.php:839 lib/interface.php:998 +#: lib/interface.php:847 lib/interface.php:1006 msgid "Logs" -msgstr "Logs" +msgstr "Journal" # @ relevanssi -#: lib/interface.php:840 lib/interface.php:1027 +#: lib/interface.php:848 lib/interface.php:1035 msgid "Exclusions and restrictions" msgstr "Exclusions et restrictions" # @ relevanssi -#: lib/interface.php:841 +#: lib/interface.php:849 msgid "Custom excerpts" msgstr "Extraits personnalisés" # @ relevanssi -#: lib/interface.php:842 +#: lib/interface.php:850 msgid "Highlighting search results" msgstr "Mise en évidence des résultats de recherche" # @ relevanssi -#: lib/interface.php:843 lib/interface.php:1179 +#: lib/interface.php:851 lib/interface.php:1187 msgid "Indexing options" -msgstr "Options d'indexation" +msgstr "Options d’indexation" # @ relevanssi -#: lib/interface.php:844 lib/interface.php:1327 +#: lib/interface.php:852 lib/interface.php:1346 msgid "Synonyms" msgstr "Synonymes" # @ relevanssi -#: lib/interface.php:845 lib/interface.php:1337 +#: lib/interface.php:853 lib/interface.php:1356 msgid "Stopwords" msgstr "Stopwords" -#: lib/interface.php:848 +#: lib/interface.php:856 msgid "Import/export options" -msgstr "Import/export des options" +msgstr "Importer/exporter les options" -#: lib/interface.php:851 +# @ relevanssi +#: lib/interface.php:859 msgid "Buy Relevanssi Premium" -msgstr "Achetez Relevanssi Premium" +msgstr "Acheter Relevanssi Premium" # @ relevanssi -#: lib/interface.php:856 +#: lib/interface.php:864 msgid "Quick tools" msgstr "Outils rapides" # @ relevanssi -#: lib/interface.php:858 +#: lib/interface.php:866 msgid "Save options" -msgstr "Sauvegarder les options" +msgstr "Enregistrer les options" # @ relevanssi -#: lib/interface.php:859 +#: lib/interface.php:867 msgid "Build the index" -msgstr "Construire l'index" +msgstr "Générer l’index" # @ relevanssi -#: lib/interface.php:860 lib/interface.php:1325 +#: lib/interface.php:868 lib/interface.php:1344 msgid "Continue indexing" msgstr "Continuer l'indexation" # @ relevanssi -#: lib/interface.php:860 +#: lib/interface.php:868 msgid "add" msgstr "ajouter" # @ relevanssi -#: lib/interface.php:860 +#: lib/interface.php:868 msgid "documents." msgstr "documents." -#: lib/interface.php:864 +#: lib/interface.php:872 msgid "" "WARNING: You've chosen no post types to index. Nothing will be indexed. Choose some post types to index." msgstr "" -"ATTENTION: vous n'avez choisi aucun type de billet à indexer. Rien ne sera " -"indexé.Choisissez les types de billet à indexer." +"AVERTISSEMENT : vous n’avez sélectionné aucun type de billet à indexer. Rien " +"ne sera indexé. Choisir des types de billets à indexer." # @ relevanssi -#: lib/interface.php:868 +#: lib/interface.php:876 msgid "" "Use 'Build the index' to build the index with current indexing options. If you can't finish indexing with one " @@ -324,143 +337,141 @@ msgid "" "See 'State of the Index' below to find out how many documents actually go " "into the index." msgstr "" -"Utiliser 'Construire l'index' pour construire l'index avec les options actuelles d'indexation. Si vous ne pouvez pas " -"terminer l'indexation en une passe, utilisez 'Continuer l'indexation' pour " +"Utiliser « Générer l’index » pour construire l’index avec les options d’indexation actuelles. Si vous ne pouvez pas " +"terminer l’indexation en une passe, utilisez « Continuer l’indexation » pour " "finir le travail. Vous pouvez modifier le nombre de documents à ajouter " "jusqu'à ce que vous trouviez le maximum que vous pouvez ajouter en une " -"passe. Regardez 'État de l'indexation' ci-dessous pour déterminer le nombre " -"de documents actuellement pris en compte dans l'indexation." +"passe. Regardez « État de l’indexation » ci-dessous pour déterminer le " +"nombre de documents actuellement indexés." # @ relevanssi -#: lib/interface.php:870 +#: lib/interface.php:878 msgid "State of the Index" -msgstr "État de l'index" +msgstr "État de l’indexation" # @ relevanssi -#: lib/interface.php:872 +#: lib/interface.php:880 msgid "Documents in the index" -msgstr "Documents dans l'index" +msgstr "Documents dans l’index" # @ relevanssi -#: lib/interface.php:873 +#: lib/interface.php:881 msgid "Terms in the index" -msgstr "Termes dans l'index" +msgstr "Termes dans l’index" # @ relevanssi -#: lib/interface.php:874 +#: lib/interface.php:882 msgid "Highest post ID indexed" msgstr "ID de billet le plus élevé indexé" # @ relevanssi -#: lib/interface.php:883 +#: lib/interface.php:891 msgid "Use search for admin:" -msgstr "Utiliser la recherche pour l'administration:" +msgstr "Utiliser la recherche pour l'administration :" # @ relevanssi -#: lib/interface.php:885 +#: lib/interface.php:893 msgid "If checked, Relevanssi will be used for searches in the admin interface" msgstr "" -"Si coché, Relevanssi sera utilisé pour les recherches dans l'interface " -"d'administration" +"Si coché, Relevanssi sera utilisé pour les recherches dans l’interface " +"d’administration" # @ relevanssi -#: lib/interface.php:889 +#: lib/interface.php:897 msgid "Default operator for the search?" -msgstr "Opérateur logique par défaut pour la recherche ?" +msgstr "Opérateur logique par défaut pour la recherche ?" # @ relevanssi -#: lib/interface.php:891 +#: lib/interface.php:899 msgid "AND - require all terms" -msgstr "ET - nécessite tous les termes" +msgstr "AND - nécessite tous les termes" # @ relevanssi -#: lib/interface.php:892 +#: lib/interface.php:900 msgid "OR - any term present is enough" -msgstr "OU - n'importe lequel des termes présents est suffisant" +msgstr "OR - n’importe lequel des termes présents est suffisant" # @ relevanssi -#: lib/interface.php:894 +#: lib/interface.php:902 msgid "" "If you choose AND and the search finds no matches, it will automatically do " "an OR search." msgstr "" -"Si vous choisissez ET et la recherche ne trouve rien, une recherche OU sera " +"Si vous choisissez AND et la recherche ne trouve rien, une recherche OR sera " "lancée automatiquement." # @ relevanssi -#: lib/interface.php:898 +#: lib/interface.php:906 msgid "Disable OR fallback:" -msgstr "Désactiver le passage à OU:" +msgstr "Désactiver l’alternative OR :" # @ relevanssi -#: lib/interface.php:900 +#: lib/interface.php:908 msgid "" "If you don't want Relevanssi to fall back to OR search when AND search gets " "no hits, check this option. For most cases, leave this one unchecked." msgstr "" -"Si vous ne désirez pas que Relevanssi ne se rabatte pas sur une recherche OU " -"quand la recherche ET ne donne aucun résultat, cochez cette option. Dans la " -"plupart des cas, laissez la décochée." +"Si vous ne désirez pas que Relevanssi se rabatte sur une recherche OR quand " +"la recherche AND ne donne aucun résultat, cochez cette option. Dans la " +"plupart des cas, laissez-la décochée." # @ relevanssi -#: lib/interface.php:904 +#: lib/interface.php:912 msgid "Default order for results:" -msgstr "Ordre par défaut pour les résultats:" +msgstr "Ordre par défaut des résultats :" -# @ relevanssi -#: lib/interface.php:906 +#: lib/interface.php:914 msgid "Relevance (highly recommended)" -msgstr "Pertinence (hautement recommandé)" +msgstr "Pertinence (fortement recommandé)" -# @ relevanssi -#: lib/interface.php:907 +#: lib/interface.php:915 msgid "Post date" -msgstr "Date de billet" +msgstr "Date du billet" -#: lib/interface.php:909 +#: lib/interface.php:917 msgid "" "If you want date-based results, see the recent post bonus in the Weights " "section." msgstr "" -"Si vous désirez des résultats chronologiques, veuillez consulter le nouveau " -"bonus pour billet dans la section Poids." +"Si vous souhaitez des résultats basés sur la date, voyez le bonus de billet " +"récent dans la section « Importance »." # @ relevanssi -#: lib/interface.php:913 +#: lib/interface.php:921 msgid "When to use fuzzy matching?" -msgstr "Quand utiliser la correspondance approximative ?" +msgstr "Quand utiliser la correspondance approximative ?" # @ relevanssi -#: lib/interface.php:915 +#: lib/interface.php:923 msgid "When straight search gets no hits" msgstr "Quand la recherche directe ne donne pas de résultat" # @ relevanssi -#: lib/interface.php:916 +#: lib/interface.php:924 msgid "Always" msgstr "Toujours" # @ relevanssi -#: lib/interface.php:917 +#: lib/interface.php:925 msgid "Don't use fuzzy search" -msgstr "Ne pas utiliser l'approximation" +msgstr "Ne pas utiliser l’approximation" # @ relevanssi -#: lib/interface.php:919 +#: lib/interface.php:927 msgid "" "Straight search matches just the term. Fuzzy search matches everything that " "begins or ends with the search term." msgstr "" -"La recherche pure prend en compte juste le terme. La recherche approximative " -"prend en compte tout ce qui commence ou finit par le terme recherché." +"La recherche directe prend en compte juste le terme. La recherche " +"approximative prend en compte tout ce qui commence ou finit par le terme " +"recherché." -# @ relevanssi -#: lib/interface.php:927 +#: lib/interface.php:935 msgid "Limit searches:" -msgstr "Limiter les recherches:" +msgstr "Limite des recherche :" -#: lib/interface.php:929 +#: lib/interface.php:937 msgid "" "If this option is checked, Relevanssi will limit search results to at most " "500 results per term. This will improve performance, but may cause some " @@ -469,19 +480,20 @@ msgid "" "results by date. The throttle can end up cutting off recent posts " "to favour more relevant posts." msgstr "" -"Si cette option est cochée, Relevanssi limitera les résultats de recherche à " -"500 résultats par terme. Ceci améliorera les performances mais peut faire en " -"forte que certains documents pertinents ne soient pas trouvés. Quoiqu'il en " -"soit, Relevanssi essaie de classer par priorité les documents les plus " -"pertinents. Ceci ne fonctionne pas bien en classant les résultats " -"par date. Le tri peut être amené à mettre de côté des billets " -"récents pour favoriser des billets plus pertinents." - -#: lib/interface.php:933 +"Si cette option est cochée, Relevanssi limitera les résultats de recherche " +"au maximum à 500 résultats par terme. Cela améliorera les performances mais " +"peut conduire à ce que certains documents correspondants ne soient pas " +"trouvés. Quoiqu’il en soit, Relevanssi essaie d'afficher en priorité les " +"documents avec les meilleures correspondances. Cela ne fonctionne " +"pas bien lors du tri des résultats par date. L'accélération peut " +"conduire à la réduction des billets récents en faveur des billets plus " +"pertinents." + +#: lib/interface.php:941 msgid "Limit:" -msgstr "Limite:" +msgstr "Limite :" -#: lib/interface.php:935 +#: lib/interface.php:943 #, php-format msgid "" "For better performance, adjust the limit to a smaller number. Adjusting the " @@ -492,15 +504,13 @@ msgid "" "knowledge base entry." msgstr "" "Pour de meilleures performances, ajustez la limite à un nombre plus petit. " -"Ajuster la limite à 100 ou 200 devrait être sans danger pour de bons " -"résultats et pourrait apporter un boost dans la vitesse de recherche. NE PAS " -"utiliser cette fonction pour limiter le nombre de résultats de recherche sur " -"les pages de résultat, ce qui pourrait conduire à des problèmes. Pour " -"ajuster le nombre de résultats de recherche affichés, veuillez lire cette entrée de la base de connaissance." +"Ajuster la limite à 100 ou 200 devrait être correct pour de bons résultats " +"et accélèrera la vitesse de recherche. N’utilisez PAS cette fonctionnalité " +"pour limiter le nombre de résultats sur la page de recherche, puisque cela " +"conduira à des problèmes. Pour ajuster l'affichage du nombre de résultats, " +"voyez cette entrée de la base de connaissance." -# @ relevanssi -#: lib/interface.php:945 +#: lib/interface.php:953 msgid "" "These values affect the weights of the documents. These are all multipliers, " "so 1 means no change in weight, less than 1 means less weight, and more than " @@ -509,203 +519,195 @@ msgid "" "significant than words elsewhere. If title weight is 0, words in titles " "won't make any difference to the search results." msgstr "" -"Ces valeurs affectent le poids des documents. Ce sont tous des " -"multiplicateurs, ainsi 1 signifie aucune modification du poids, moins de 1 " -"signifie moins de poids et plus de 1 signifie plus de poids. Un réglage " -"proche de zéro correspond à une partie négligeable. Par exemple, si le poids " -"du titre vaut plus que 1, les mots dans le titre sont plus significatifs que " -"les mêmes mots partout ailleurs. Si le poids du titre vaut 0, les mots dans " -"le titre n'affecteront pas les résultats de recherche." - -#: lib/interface.php:950 +"Ces valeurs affectent l’importance des documents. Ce sont des coefficients, " +"ainsi, 1 signifie aucune modification de l’importance, moins de 1 signifie " +"moins d’importance et plus de 1 signifie plus d’importance. Un réglage " +"proche de zéro correspond à une partie négligeable. Par exemple, si " +"l’importance du titre vaut plus que 1, les mots dans le titre sont plus " +"significatifs que les mêmes mots partout ailleurs. Si l’importance du titre " +"vaut 0, les mots dans le titre n’affecteront pas les résultats de recherche." + +#: lib/interface.php:958 msgid "Element" msgstr "Élément" -#: lib/interface.php:951 +#: lib/interface.php:959 msgid "Weight" -msgstr "Poids" +msgstr "Importance" -# @ relevanssi -#: lib/interface.php:952 +#: lib/interface.php:960 msgid "Default weight" -msgstr "Poids par défaut" +msgstr "Importance par défaut" -# @ relevanssi -#: lib/interface.php:957 +#: lib/interface.php:965 msgid "Post titles" -msgstr "Titres de billet" +msgstr "Titres de billets" -# @ relevanssi -#: lib/interface.php:969 +#: lib/interface.php:977 msgid "Comment text" -msgstr "Text de commentaire" +msgstr "Texte de commentaire" -# @ relevanssi -#: lib/interface.php:990 +#: lib/interface.php:998 msgid "WPML/Polylang compatibility" -msgstr "Compatibilité WPML/Polylang" +msgstr "Compatibilité WPML / Polylang" -# @ relevanssi -#: lib/interface.php:992 +#: lib/interface.php:1000 msgid "Limit results to current language:" -msgstr "Limiter les résultats au langage suivant:" +msgstr "Limiter les résultats à la langue en cours :" -# @ relevanssi -#: lib/interface.php:994 +#: lib/interface.php:1002 msgid "" "If this option is checked, Relevanssi will only return results in the " "current active language. Otherwise results will include posts in every " "language." msgstr "" -"Si cette option est cochée, Relevanssi retournera uniquement les résultats " -"dans le langage actuellement activé. Sinon, les résultats inclueront les " -"billets dans tous les langages." +"Si cette option est cochée, Relevanssi donnera uniquement des résultats dans " +"la langue en cours activée. Sinon, les résultats contiendront les billets de " +"toutes les langues." # @ relevanssi -#: lib/interface.php:1000 +#: lib/interface.php:1008 msgid "Keep a log of user queries:" -msgstr "Conserver une liste des recherches des visiteurs:" +msgstr "Conserver les recherches des utilisateurs dans le journal :" # @ relevanssi -#: lib/interface.php:1002 +#: lib/interface.php:1010 msgid "" "If checked, Relevanssi will log user queries. The log appears in 'User " "searches' on the Dashboard admin menu." msgstr "" -"Si coché, Relevanssi conservera dans les stats les requêtes d'utilisateur. " -"Les stats apparaissent dans 'Recherches d'utilisateur' dans le menu du " -"tableau de bord de l'administration." +"Si coché, Relevanssi conservera dans le journal les requêtes d'utilisateur. " +"Les statistiques apparaissent dans « Recherches d'utilisateur » dans le menu " +"du tableau de bord de l'administration." -#: lib/interface.php:1006 +#: lib/interface.php:1014 msgid "Log the user's IP with the queries:" -msgstr "Enregistrer l'adresse IP de l'utilisateur avec ses requêtes:" +msgstr "Conserver l’IP des utilisateurs dans le journal avec les requêtes :" # @ relevanssi -#: lib/interface.php:1008 +#: lib/interface.php:1016 msgid "If checked, Relevanssi will log user's IP-Adress with the queries." msgstr "" -"Si coché, Relevanssi enregistrera les adresses IP des utilisateurs avec " -"leurs requêtes." +"Si coché, Relevanssi ajoutera l’adresse IP des utilisateurs avec les " +"requêtes dans le journal." # @ relevanssi -#: lib/interface.php:1012 +#: lib/interface.php:1020 msgid "Don't log queries from these users:" -msgstr "Ne conservez pas les statistiques de recherche de ces utilisateurs:" +msgstr "Ne pas conserver les statistiques de recherche de ces utilisateur :" -# @ relevanssi -#: lib/interface.php:1014 +#: lib/interface.php:1022 msgid "" "Comma-separated list of numeric user IDs or user login names that will not " "be logged." msgstr "" -"Liste d'ID d'utilisateurs ou de noms de login séparés par une virgule qui ne " -"seront pas pris en compte." +"Liste des ID utilisateurs, séparés par une virgule, qui ne seront pas " +"ajoutés au journal." # @ relevanssi -#: lib/interface.php:1018 +#: lib/interface.php:1026 msgid "" "If you enable logs, you can see what your users are searching for. You can " "prevent your own searches from getting in the logs with the omit feature." msgstr "" -"Si vous activez les logs, vous pouvez voir ce que les utilisateurs " -"recherchent. Vous pouvez exclure vos propres recherches des logs avec le " -"réglage d'exemption." +"Si vous activez le journal, vous pouvez voir ce que les utilisateurs " +"recherchent. Vous pouvez empêcher l’ajout de vos propres recherches dans le " +"journal avec la fonctionnalité d’exception." # @ relevanssi -#: lib/interface.php:1021 +#: lib/interface.php:1029 msgid "" "If you enable logs, you can see what your users are searching for. Logs are " "also needed to use the 'Did you mean?' feature. You can prevent your own " "searches from getting in the logs with the omit feature." msgstr "" -"Si vous activez les logs, vous pouvez voir ce que les utilisateurs " -"recherchent. Les logs sont aussi utilisés pour la fonction 'Vous vouliez " -"dire ?'. Vous pouvez empêcher vos propres recherches d'être enregistrées " -"avec la fonction d'exception." +"Si vous activez le journal, vous pouvez voir ce que les utilisateurs " +"recherchent. Le journal est aussi utilisé pour la fonction « Vous vouliez " +"dire ? ». Vous pouvez empêcher l’enregistrement de vos propres recherches à " +"l’aide de la fonction d'exception." # @ relevanssi -#: lib/interface.php:1029 +#: lib/interface.php:1037 msgid "Restrict search to these categories and tags:" -msgstr "Restreindre la recherche à ces catégories et tags:" +msgstr "Restreindre la recherche à ces catégories et mots-clés :" -# @ relevanssi -#: lib/interface.php:1031 +#: lib/interface.php:1039 msgid "" "Enter a comma-separated list of category and tag IDs to restrict search to " "those categories or tags. You can also use <input type='hidden' " "name='cats' value='list of cats and tags' /> in your search form. " "The input field will \toverrun this setting." msgstr "" -"Entrez une liste d'ID de catégories et de mots-clefs pour restreindre la " -"recherche à ces catégories et mots-clef. Vous pouvez aussi utiliser " -"<input type='hidden' name='cats' value='list of cats and tags' />" -" dans votre formulaire de recherche. Le champ inséré sera prioritaire " -"sur ce réglage." +"Saisissez une liste d’IDs de catégories et de mots-clés, séparés par une " +"virgule, pour restreindre la recherche à ces catégories ou mots-clés. Vous " +"pouvez aussi utiliser <input type='hidden' name='cats' value='list " +"of cats and tags' /> dans votre formulaire de recherche. Ce champ " +"de saisie sera prioritaire sur le réglage." -# @ relevanssi -#: lib/interface.php:1035 +#: lib/interface.php:1043 msgid "Exclude these categories from search:" -msgstr "Exclure ces catégories de la recherche:" +msgstr "Exclure ces catégories de la recherche :" -# @ relevanssi -#: lib/interface.php:1037 +#: lib/interface.php:1045 msgid "" "Enter a comma-separated list of category IDs that are excluded from search " "results." msgstr "" -"Entrez une liste d'ID de catégories à exclure des résultats de recherche." +"Entrez une liste d’IDs de catégories, séparés par une virgule, à exclure des " +"résultats de recherche." # @ relevanssi -#: lib/interface.php:1041 +#: lib/interface.php:1049 msgid "Exclude these tags from search:" -msgstr "Exclure ces mots-clef de la recherche:" +msgstr "Exclure ces mots-clés de la recherche :" -# @ relevanssi -#: lib/interface.php:1043 +#: lib/interface.php:1051 msgid "" "Enter a comma-separated list of tag IDs that are excluded from search " "results." msgstr "" -"Entrez une liste d'ID de mots-clef à exclure des résultats de recherche." +"Entrez une liste d’IDs de mots-clés, séparés par une virgule, à exclure des " +"résultats de recherche." # @ relevanssi -#: lib/interface.php:1047 +#: lib/interface.php:1055 msgid "Exclude these posts/pages from search:" -msgstr "Exclure ces billets/pages de la recherche:" +msgstr "Exclure ces billets/pages de la recherche :" # @ relevanssi -#: lib/interface.php:1051 +#: lib/interface.php:1059 msgid "" "Enter a comma-separated list of post/page IDs that are excluded from search " "results. This only works here, you can't use the input field option " "(WordPress doesn't pass custom parameters there). You can also use a " "checkbox on post/page edit pages to remove posts from index." msgstr "" -"Entrez une liste d'ID de billets et de pages à exclure des résultats de " -"recherche. Cela ne fonctionne qu'ici, vous ne pouvez pas utiliser l'option " -"de champ d'insertion (Wordpress ne gèrera pas les paramètres personnalisés " -"dans ce cas). Vous pouvez aussi utiliser une case à cocher dans les pages " -"d'éditions des billets/pages pour retirer des billetx de l'index." +"Entrez une liste d’ID de billets et de pages à exclure des résultats de " +"recherche. Cela ne fonctionne qu’ici, vous ne pouvez pas utiliser l’option " +"de champ d'insertion (WordPress ne gèrera pas les paramètres personnalisés " +"dans ce cas). Vous pouvez également utiliser une case à cocher sur les pages " +"d’éditions des billets / pages pour retirer des billets de l'index." # @ relevanssi -#: lib/interface.php:1054 +#: lib/interface.php:1062 msgid "" "Enter a comma-separated list of post/page IDs that are excluded from search " "results. This only works here, you can't use the input field option " "(WordPress doesn't pass custom parameters there)." msgstr "" -"Entrez une liste d'ID de billets et de pages à exclure des résultats de " -"recherche. Cela ne fonctionne qu'ici, vous ne pouvez pas utiliser l'option " -"de champ d'insertion (Wordpress ne gèrera pas les paramètres personnalisés " -"dans ce cas). " +"Entrez une liste d’ID de billets et de pages à exclure des résultats de " +"recherche. Cela ne fonctionne qu’ici, vous ne pouvez pas utiliser l'option " +"de champ d’insertion (WordPress ne gèrera pas les paramètres personnalisés " +"dans ce cas)." # @ relevanssi -#: lib/interface.php:1060 +#: lib/interface.php:1068 msgid "Respect exclude_from_search for custom post types:" -msgstr "Respecter exclude_from_search pour les types de billets personnalisés:" +msgstr "" +"Respecter exclude_from_search pour les types de billets personnalisés :" # @ relevanssi -#: lib/interface.php:1062 +#: lib/interface.php:1070 msgid "" "If checked, Relevanssi won't display posts of custom post types that have " "'exclude_from_search' set to true. If not checked, Relevanssi will display " @@ -716,74 +718,74 @@ msgstr "" "coché, Relevanssi affichera tout ce qui est indexé." # @ relevanssi -#: lib/interface.php:1064 +#: lib/interface.php:1072 msgid "Custom excerpts/snippets" -msgstr "Personnaliser extraits/snippets" +msgstr "Extraits/snippets personnalisés" # @ relevanssi -#: lib/interface.php:1066 +#: lib/interface.php:1074 msgid "Create custom search result snippets:" -msgstr "Créer des snippets personalisés de résultats de recherche:" +msgstr "Créer des snippets personnalisés de résultats de recherche :" # @ relevanssi -#: lib/interface.php:1068 +#: lib/interface.php:1076 msgid "" "If checked, Relevanssi will create excerpts that contain the search term " "hits. To make them work, make sure your search result template uses " "the_excerpt() to display post excerpts." msgstr "" -"Si coché, Relevanssi créera des extraits qui contiennent les résultats de la " -"recherche de terme. Pour que cela fonctionne, vérifiez bien que le fichier " -"de thème de résultat de recherche utilise the_excerpt() pour afficher les " -"extraits de billet." +"Si coché, Relevanssi créera des extraits qui contiennent les occurrences du " +"terme recherché. Pour que cela fonctionne, vérifiez bien que le fichier de " +"thème de résultat de recherche utilise the_excerpt() pour " +"afficher les extraits de billet." -#: lib/interface.php:1070 +#: lib/interface.php:1078 msgid "" "Note: Building custom excerpts can be slow. If you are not actually using " "the excerpts, make sure you disable the option." msgstr "" -"Remarque: construire les extraits personnalisés peut être lent. Si vous " -"n'utilisez pas les extraits, soyez certain de désactiver cette option." +"REMARQUE : la génération d'extraits personnalisés peut prendre du temps. Si " +"vous n’utilisez pas vraiment d'extraits, désactivez cette option." # @ relevanssi -#: lib/interface.php:1072 +#: lib/interface.php:1080 msgid "Length of the snippet:" -msgstr "Longueur du snippet:" +msgstr "Longueur du snippet :" # @ relevanssi -#: lib/interface.php:1075 +#: lib/interface.php:1083 msgid "characters" -msgstr "lettres" +msgstr "caractères" # @ relevanssi -#: lib/interface.php:1076 +#: lib/interface.php:1084 msgid "words" msgstr "mots" # @ relevanssi -#: lib/interface.php:1078 +#: lib/interface.php:1086 msgid "This must be an integer." msgstr "Ceci doit être un nombre entier." -#: lib/interface.php:1082 +#: lib/interface.php:1090 msgid "Allowable tags in excerpts:" -msgstr "Mots-clefs autorisés dans les extraits:" +msgstr "Balises autorisées dans les extraits :" -#: lib/interface.php:1085 +#: lib/interface.php:1093 msgid "" "List all tags you want to allow in excerpts, without any whitespace. For " "example: '<p><a><strong>'." msgstr "" -"Listez tous les mots-clef que vous voulez autoriser dans les extraits sans " -"aucun espace. Par exemple: '<p><a><strong>'." +"Listez toutes les balises que vous souhaitez autoriser dans les extraits " +"sans aucun espace. Par exemple : '<p><a><strong>'." # @ relevanssi -#: lib/interface.php:1089 +#: lib/interface.php:1097 msgid "Show breakdown of search hits in excerpts:" -msgstr "Montrer la répartition des résultats de recherche dans les extraits:" +msgstr "Montrer la répartition des résultats de recherche dans les extraits :" # @ relevanssi -#: lib/interface.php:1091 +#: lib/interface.php:1099 msgid "" "Check this to show more information on where the search hits were made. " "Requires custom snippets to work." @@ -793,243 +795,237 @@ msgstr "" "pour fonctionner." # @ relevanssi -#: lib/interface.php:1095 +#: lib/interface.php:1103 msgid "The breakdown format:" -msgstr "Mise en forme des répartitions:" +msgstr "Mise en forme des répartitions :" # @ relevanssi -#: lib/interface.php:1097 +#: lib/interface.php:1105 msgid "" "Use %body%, %title%, %tags% and %comments% to display the number of hits (in " "different parts of the post), %total% for total hits, %score% to display the " "document weight and %terms% to show how many hits each search term got. No " "double quotes (\") allowed!" msgstr "" -"Utilisez %body%, %title%, %tags% et %comments% pour afficher le nombre de " -"résultats trouvés (en différents endroits du billet), %total% pour le nombre " -"total de résultats affichés, %score% pour afficher le poids d'importance du " -"document et %terms% pour montrer combien de résultats affichés ont obtenu " -"chacun des termes recherché. Interdit d'utiliser des guillemets (\")!" +"Utilisez %body%, %title%, %tags% et %comments% pour afficher le nombre " +"d'occurrences trouvées (en différents endroits du billet), %total% pour le " +"nombre total d'occurrences, %score% pour afficher l’importance du document " +"et %terms% pour montrer combien d’occurrences correspondent à chacun des " +"termes recherchés. Interdit d’utiliser des guillemets (\") !" # @ relevanssi -#: lib/interface.php:1099 +#: lib/interface.php:1107 msgid "Search hit highlighting" -msgstr "Surbrillance des résultats de recherche" +msgstr "Mise en évidence des résultats de recherche" # @ relevanssi -#: lib/interface.php:1101 +#: lib/interface.php:1109 msgid "First, choose the type of highlighting used:" -msgstr "En premier, veuillez choisir le type de surbrillance utilisée:" +msgstr "D’abord, veuillez choisir le type de mise en évidence utilisée :" # @ relevanssi -#: lib/interface.php:1104 +#: lib/interface.php:1112 msgid "Highlight query terms in search results:" msgstr "" -"Mettre en surbrillance les termes de recherche dans les résultats de " -"recherche:" +"Mettre en évidence les termes de recherche dans les résultats de recherche :" # @ relevanssi -#: lib/interface.php:1106 +#: lib/interface.php:1114 msgid "No highlighting" -msgstr "Pas de mise en surbrillance" +msgstr "Pas de mise en évidence" # @ relevanssi -#: lib/interface.php:1110 +#: lib/interface.php:1118 msgid "Text color" msgstr "Couleur du texte" # @ relevanssi -#: lib/interface.php:1111 +#: lib/interface.php:1119 msgid "Background color" msgstr "Couleur du fond" # @ relevanssi -#: lib/interface.php:1112 +#: lib/interface.php:1120 msgid "CSS Style" msgstr "Style CSS" # @ relevanssi -#: lib/interface.php:1113 +#: lib/interface.php:1121 msgid "CSS Class" msgstr "Classe CSS" # @ relevanssi -#: lib/interface.php:1115 +#: lib/interface.php:1123 msgid "Highlighting isn't available unless you use custom snippets" msgstr "" -"La mise en surbrillance n'est pas disponible tant que vous n'avez pas activé " +"La mise en évidence n’est pas disponible tant que vous n’avez pas activé " "l'utilisation de snippets personnalisés." # @ relevanssi -#: lib/interface.php:1119 +#: lib/interface.php:1127 msgid "Highlight query terms in result titles too:" -msgstr "Mettre en surbrillance les mots recherchés dans le titre également:" +msgstr "Mettre en évidence les mots recherchés dans le titre également :" # @ relevanssi -#: lib/interface.php:1125 +#: lib/interface.php:1133 msgid "Highlight query terms in documents from local searches:" msgstr "" -"Mettre en évidence les termes de la requête dans les documents pour les " -"recherches locales:" +"Mettre en évidence les termes de la requête dans les documents à partir de " +"recherches locales :" # @ relevanssi -#: lib/interface.php:1127 +#: lib/interface.php:1135 msgid "" "Highlights hits when user opens the post from search results. This is based " "on HTTP referrer, so if that's blocked, there'll be no highlights." msgstr "" -"Surligne les mots choisis quand l'utilisateur ouvre le billet à partir des " -"résultats de recherche. La fonction est basée sur HTTP referrer ainsi, en " -"cas de blocage, il y aura pas de surlignage." +"Met en évidence les occurrences lorsque l’utilisateur ouvre le billet à " +"partir des résultats de recherche. La fonction est basée sur HTTP referrer, " +"ainsi, en cas de blocage, il n'y aura pas mise en évidence." # @ relevanssi -#: lib/interface.php:1133 +#: lib/interface.php:1141 msgid "Highlight query terms in comments:" -msgstr "Surligner les termes recherchés dans les commentaires:" +msgstr "Mettre en évidence les termes recherchés dans les commentaires :" # @ relevanssi -#: lib/interface.php:1135 +#: lib/interface.php:1143 msgid "" "Highlights hits in comments when user opens the post from search results." msgstr "" -"Surligner les résultats affichés dans les commentaires quand l'utilisateur " -"ouvre le billet à partir des résultats de recherche." +"Met en évidence les résultats affichés dans les commentaires quand " +"l’utilisateur ouvre le billet à partir des résultats de recherche." -# @ relevanssi -#: lib/interface.php:1139 +#: lib/interface.php:1147 msgid "Uncheck this if you use non-ASCII characters:" -msgstr "Décochez ceci si vous utilisez des caractères non-ASCII:" +msgstr "Décochez cela si vous utilisez des caractères non-ASCII :" -# @ relevanssi -#: lib/interface.php:1141 +#: lib/interface.php:1149 msgid "" "If you use non-ASCII characters (like Cyrillic alphabet) and the highlights " "don't work, uncheck this option to make highlights work." msgstr "" -"Si vous utilisez des caractères non-ASCII (comme l'alphabet Cyrillique) et " -"que le surlignage ne fonctionne pas, décochez cette option pour faire " -"fonctionner le surlignage." +"Si vous utilisez des caractères non-ASCII (comme l'alphabet Cyrillic) et que " +"la mise en évidence ne fonctionne pas, décochez cette option pour que cela " +"fonctionne à nouveau." # @ relevanssi -#: lib/interface.php:1146 +#: lib/interface.php:1154 msgid "Then adjust the settings for your chosen type:" -msgstr "Ensuite ajustez les réglages du type choisi:" +msgstr "Ensuite ajustez les réglages du type choisi :" # @ relevanssi -#: lib/interface.php:1150 +#: lib/interface.php:1158 msgid "Text color for highlights:" -msgstr "Couleur du texte pour la surbrillance:" +msgstr "Couleur du texte pour la mise en évidence :" # @ relevanssi -#: lib/interface.php:1152 lib/interface.php:1158 +#: lib/interface.php:1160 lib/interface.php:1166 msgid "Use HTML color codes (#rgb or #rrggbb)" -msgstr "Utiliser les codes de couleurs HTML (#rgb ou #rrggbb)" +msgstr "Utiliser des codes de couleurs HTML (#rgb ou #rrggbb)" # @ relevanssi -#: lib/interface.php:1156 +#: lib/interface.php:1164 msgid "Background color for highlights:" -msgstr "Couleur du fond pour la surbrillance:" +msgstr "Couleur du fond pour la mise en évidence :" # @ relevanssi -#: lib/interface.php:1162 +#: lib/interface.php:1170 msgid "CSS style for highlights:" -msgstr "Style CSS pour la surbrillance:" +msgstr "Style CSS pour la mise en évidence :" # @ relevanssi -#: lib/interface.php:1164 +#: lib/interface.php:1172 msgid "" "You can use any CSS styling here, style will be inserted with a <span>" msgstr "" "Vous pouvez utiliser tout habillage CSS ici. Le style sera inséré avec un " -"<span>" +"<span>." # @ relevanssi -#: lib/interface.php:1168 +#: lib/interface.php:1176 msgid "CSS class for highlights:" -msgstr "Classe CSS pour la surbrillance:" +msgstr "Classe CSS pour la mise en évidence :" # @ relevanssi -#: lib/interface.php:1170 +#: lib/interface.php:1178 msgid "" "Name a class here, search results will be wrapped in a <span> with the " "class" msgstr "" -"Nommez une classe ici. Les résultats seront encadrés dans un <span> " -"avec cette classe" +"Indiquez une classe ici. Les résultats seront encadrés dans un <span> " +"avec cette classe." # @ relevanssi -#: lib/interface.php:1177 lib/interface.php:1335 +#: lib/interface.php:1185 lib/interface.php:1354 msgid "Save the options" -msgstr "Sauvegarder les options" +msgstr "Enregistrer les options" -# @ relevanssi -#: lib/interface.php:1181 +#: lib/interface.php:1189 msgid "Choose post types to index:" -msgstr "Veuillez choisir les types de billets personnalisés à indexer:" +msgstr "Choisissez les types de billets à indexer :" -#: lib/interface.php:1186 +#: lib/interface.php:1194 msgid "Type" msgstr "Type" -#: lib/interface.php:1187 lib/interface.php:1233 +#: lib/interface.php:1195 lib/interface.php:1252 relevanssi.php:1690 msgid "Index" msgstr "Index" -#: lib/interface.php:1188 lib/interface.php:1234 +#: lib/interface.php:1196 lib/interface.php:1253 relevanssi.php:1691 msgid "Public?" -msgstr "Publique ?" +msgstr "Public ?" -#: lib/interface.php:1205 lib/interface.php:1248 +#: lib/interface.php:1213 lib/interface.php:1267 relevanssi.php:1705 #, php-format msgid "%s" msgstr "%s" -#: lib/interface.php:1206 lib/interface.php:1249 +#: lib/interface.php:1214 lib/interface.php:1268 relevanssi.php:1706 msgid "yes" msgstr "oui" # @ relevanssi -#: lib/interface.php:1206 lib/interface.php:1249 +#: lib/interface.php:1214 lib/interface.php:1268 relevanssi.php:1706 msgid "no" msgstr "non" -# @ relevanssi -#: lib/interface.php:1227 +#: lib/interface.php:1246 msgid "Choose taxonomies to index:" -msgstr "Veuillez choisir les taxonomie à indexer:" +msgstr "Choisissez les taxonomies à indexer :" -#: lib/interface.php:1232 +#: lib/interface.php:1251 relevanssi.php:1689 msgid "Taxonomy" msgstr "Taxonomie" -#: lib/interface.php:1269 +#: lib/interface.php:1288 msgid "" "If you check a taxonomy here, the terms for that taxonomy are indexed with " "the posts. If you for example choose \"post_tag\", searching for tags will " "find all posts that have the tag." msgstr "" -"Si vous cochez une taxonomie ici, les termes de cette taxonomie seront " -"indexées avec les billets. Si par exemple vous choisissez \"post_tag\", la " -"recherche pour les mots-clef affichera tous les billets qui sont associés au " -"mot-clef." +"Si vous cochez une taxonomie ici, les termes pour cette taxonomie sont " +"indexés avec les billets. Si vous choisissez par exemple « post_tag », la " +"recherche par mots-clés donnera tous les billets comportant le mot-clé." # @ relevanssi -#: lib/interface.php:1273 +#: lib/interface.php:1292 msgid "Minimum word length to index" msgstr "Longueur minimum des mots à indexer" # @ relevanssi -#: lib/interface.php:1275 +#: lib/interface.php:1294 msgid "Words shorter than this number will not be indexed." msgstr "Les mots plus courts que ce nombre ne seront pas indexés." # @ relevanssi -#: lib/interface.php:1281 +#: lib/interface.php:1300 msgid "Expand shortcodes in post content:" -msgstr "Traduire les shortcodes dans le contenu des billets:" +msgstr "Générer les shortcodes dans le contenu des billets :" # @ relevanssi -#: lib/interface.php:1283 +#: lib/interface.php:1302 msgid "" "If checked, Relevanssi will expand shortcodes in post content before " "indexing. Otherwise shortcodes will be stripped. If you use shortcodes to " @@ -1037,64 +1033,64 @@ msgid "" "index will reflect the status of the shortcode content at the moment of " "indexing." msgstr "" -"Si coché, Relevanssi traduira tous les shortcodes des contenu de billets " -"avec l'indexation. Dans le cas contraire, les shortcodes seront ignorés. Si " +"Si coché, Relevanssi générerara tous les shortcodes des contenu de billets " +"avant indexation. Dans le cas contraire, les shortcodes seront ignorés. Si " "vous utilisez des shortcodes pour générer du contenu dynamique, Relevanssi " -"ne mettra pas l'index à jour. Ce dernier présentera le statut du contenu du " -"shortcode au moment de l'indexation." +"ne mettra pas l’index à jour. Ce dernier présentera l’état du contenu du " +"shortcode au moment de l’indexation." # @ relevanssi -#: lib/interface.php:1289 +#: lib/interface.php:1308 msgid "Index and search your posts' authors:" -msgstr "Indexer et rechercher les auteurs des billets:" +msgstr "Indexer et rechercher les auteurs des billets :" # @ relevanssi -#: lib/interface.php:1291 +#: lib/interface.php:1310 msgid "" "If checked, Relevanssi will also index and search the authors of your posts. " "Author display name will be indexed. Remember to rebuild the index if you " "change this option!" msgstr "" "Si coché, Relevanssi indexera et cherchera aussi dans les auteurs de vos " -"billets. Le nom affiché des auteurs sera indexé. N'oubliez pas de " -"reconstruire l'index si vous modifiez cette option !" +"billets. Le nom affiché des auteurs sera indexé. N’oubliez pas de régénérer " +"l'index si vous modifiez cette option !" # @ relevanssi -#: lib/interface.php:1295 +#: lib/interface.php:1314 msgid "Index and search post excerpts:" -msgstr "Indexer et rechercher dans les extraits de billets:" +msgstr "Indexer et rechercher dans les extraits de billets :" # @ relevanssi -#: lib/interface.php:1297 +#: lib/interface.php:1316 msgid "" "If checked, Relevanssi will also index and search the excerpts of your posts." "Remember to rebuild the index if you change this option!" msgstr "" "Si coché, Relevanssi indexera et cherchera dans les extraits de vos billets. " -"N'oubliez pas de reconstruire l'index si vous modifiez cette option !" +"N'oubliez pas de régénérer l'index si vous modifiez cette option !" # @ relevanssi -#: lib/interface.php:1301 +#: lib/interface.php:1320 msgid "Index and search these comments:" -msgstr "Indexer et rechercher ces commentaires:" +msgstr "Indexer et rechercher ces commentaires :" # @ relevanssi -#: lib/interface.php:1303 +#: lib/interface.php:1322 msgid "none" msgstr "aucun" # @ relevanssi -#: lib/interface.php:1304 +#: lib/interface.php:1323 msgid "normal" msgstr "normal" # @ relevanssi -#: lib/interface.php:1305 +#: lib/interface.php:1324 msgid "all" msgstr "tout" # @ relevanssi -#: lib/interface.php:1307 +#: lib/interface.php:1326 msgid "" "Relevanssi will index and search ALL (all comments including track- & " "pingbacks and custom comment types), NONE (no comments) or NORMAL (manually " @@ -1104,67 +1100,67 @@ msgstr "" "Relevanssi indexera et cherchera dans TOUT (tous les commentaires incluant " "track- & pingbacks et types de commentaires personnalisés), AUCUN (aucun " "commentaire) ou NORMAL (commentaires postés manuellement sur votre blog)." -"
      N'oubliez pas de reconstruire l'index si vous modifiez cette option !" +"
      N'oubliez pas de régénérer l'index si vous modifiez cette option !" # @ relevanssi -#: lib/interface.php:1311 +#: lib/interface.php:1330 msgid "Custom fields to index:" -msgstr "Champs personnalisés à indexer:" +msgstr "Champs personnalisés à indexer :" -#: lib/interface.php:1313 +#: lib/interface.php:1332 msgid "" "A comma-separated list of custom fields to include in the index. Set to " "'visible' to index all visible custom fields and to 'all' to index all " "custom fields, also those starting with a '_' character." msgstr "" -"Une liste séparée par des virgules de champs personnalisés à inclure dans " -"l'index. Utilisez 'visible' pour indexer tous les champs personnalisés " -"visibles et 'tout' pour indexer tous les champs personnalisés même ceux " -"commençant par le caractère '_' ." +"Une liste de champs personnalisés, séparés par une virgule, à inclure à " +"l'index. Définissez à « Visible » pour indexer les champs personnalisés " +"visibles et à « Tout » pour indexer tous les champs personnalisés, également " +"ceux commençant par le caractère « _ »." -#: lib/interface.php:1323 +#: lib/interface.php:1342 msgid "Save indexing options, erase index and rebuild the index" msgstr "" -"Sauvegarder les options d'indexation, supprimer puis reconstruire l'index" +"Enregistrer les options d’indexation, supprimer l’index et le régénérer." # @ relevanssi -#: lib/interface.php:1331 +#: lib/interface.php:1350 msgid "" "Add synonyms here in 'key = value' format. When searching with the OR " "operator, any search of 'key' will be expanded to include 'value' as well. " "Using phrases is possible. The key-value pairs work in one direction only, " "but you can of course repeat the same pair reversed." msgstr "" -"Ajouter les synonymes ici au format 'clef = valeur'. Lors d'une recherche " -"avec l'opérateur logique OU, toute recherche de 'clef' sera étendue pour " -"inclure aussi 'valeur'. Il est possible d'utiliser des phrases. Les paires " -"clef-valeur ne fonctionnent que dans un sens mais, évidemment, vous pouvez " -"répéter la même clef à l'envers." +"Ajouter les synonymes ici au format 'clé = valeur'. Lors d'une recherche " +"avec l’opérateur logique OR, toute recherche de 'clé' sera étendue pour " +"inclure aussi la 'valeur'. Il est possible d’utiliser des phrases. Les " +"paires clé-valeur ne fonctionnent que dans un sens mais, évidemment, vous " +"pouvez répéter la même paire à l'envers." # @ relevanssi -#: lib/interface.php:1356 +#: lib/interface.php:1375 msgid "" "

      Enter a word here to add it to the list of stopwords. The word will " "automatically be removed from the index, so re-indexing is not necessary. " "You can enter many words at the same time, separate words with commas.

      " msgstr "" "

      Entrez un mot ici pour l'ajouter dans la liste des stopwords. Le mot sera " -"automatiquement retiré de l'index, de cette manière il est inutile de " -"réindexer. Si vous entrez plusieurs mots d'un coup, séparez les mots avec " -"une virgule.

      " +"automatiquement retiré de l’index, de cette manière il est inutile de " +"réindexer. Si vous entrez plusieurs mots d’un coup, séparez les mots par une " +"virgule.

      " # @ relevanssi -#: lib/interface.php:1358 +#: lib/interface.php:1377 msgid "Stopword(s) to add: " -msgstr "Stopword(s) à ajouter: " +msgstr "Stopword(s) à ajouter : " # @ relevanssi -#: lib/interface.php:1359 +#: lib/interface.php:1378 msgid "Add" msgstr "Ajouter" # @ relevanssi -#: lib/interface.php:1362 +#: lib/interface.php:1381 msgid "" "

      Here's a list of stopwords in the database. Click a word to remove it " "from stopwords. Removing stopwords won't automatically return them to index, " @@ -1173,82 +1169,467 @@ msgid "" msgstr "" "

      Voici une liste des stopwords de la base de données. Cliquez sur un mot " "pour le retirer des stopwords. Retirer de la liste des stopwords ne les " -"réinjectera pas automatiquement dans l'index aussi vous devez réindexer tous " -"les billet après retrait de stopwords pour les réinjecter dans l'index." +"réinjectera pas automatiquement dans l’index, aussi vous devez réindexer " +"tous les billet après retrait de stopwords pour les réinjecter dans l'index." # @ relevanssi -#: lib/interface.php:1388 +#: lib/interface.php:1407 msgid "Remove all stopwords" -msgstr "Retirer tous les stopwords" +msgstr "Supprimer tous les stopwords" -# @ relevanssi -#: lib/interface.php:1394 +#: lib/interface.php:1413 msgid "" "Here's a list of stopwords you can use to export the stopwords to another " "blog." msgstr "" -"

      Voici une liste des stopwords de la base de données. Cliquez sur un mot " -"pour le retirer des stopwords. Retirer de la liste des stopwords ne les " -"réinjectera pas automatiquement dans l'index aussi vous devez réindexer tous " -"les billet après retrait de stopwords pour les réinjecter dans l'index." +"Ici une liste de stopwords que vous pouvez utiliser pour les exporter vers " +"un autre blog." -# @ relevanssi -#: lib/uninstall.php:29 +#: lib/uninstall.php:27 msgid "Data wiped clean, you can now delete the plugin." -msgstr "Données effacées, vous pouvez maintenant supprimer le plugin." +msgstr "Données effacées, vous pouvez désormais supprimer le plugin." + +#: relevanssi.php:112 +#, php-format +msgid "" +"Thanks for updating the plugin. After the update, Relevanssi requires re-" +"indexing in order to handle taxonomy terms better. You can reindex at the\n" +"\t\t\t settings page. If you just completed indexing, disregard this " +"message - all is good and this message should not appear again. Thanks!" +msgstr "" +"Merci d’avoir mis à jour le plugin. Après la mise à jour, Relevanssi " +"nécessite une réindexation afin de mieux traiter les termes de taxonomie. " +"Vous pouvez réindexer sur la\n" +"\t\t\t page des options. Si vous venez juste de terminer la " +"réindexation, ne tenez pas compte de ce message, il ne réapparaîtra plus. " +"Merci !" + +#: relevanssi.php:1411 +msgid "Options updated!" +msgstr "Options mises à jour !" + +#: relevanssi.php:1477 +msgid "Change API key:" +msgstr "Modifier la clé d’API :" + +#: relevanssi.php:1478 +msgid "(No API key set.)" +msgstr "(aucune clé d’API définie)" + +#: relevanssi.php:1478 +msgid "(API key is set.)" +msgstr "(la clé d’API est définie)" + +#: relevanssi.php:1479 +msgid "" +"API key is required to use the automatic update feature. Get yours from " +"Relevanssi.com." +msgstr "" +"La clé d’API est requise afin d'obtenir les mises à jour automatiques. " +"Obtenez la vôtre sur Relevanssi.com." + +#: relevanssi.php:1487 +msgid "How to index internal links:" +msgstr "Comment indexer les liens internes :" + +#: relevanssi.php:1489 +msgid "No special processing for internal links" +msgstr "Aucun traitement particulier pour les liens internes" + +#: relevanssi.php:1490 +msgid "Index internal links for target documents only" +msgstr "Indexer les liens internes pour les documents ciblés uniquement" + +#: relevanssi.php:1491 +msgid "Index internal links for both target and source" +msgstr "Indexer les liens internes à la fois pour la cible et la source" + +#: relevanssi.php:1493 +msgid "" +"Internal link anchor tags can be indexed for target document (so the text " +"will match the document the link points to), both target and source or " +"source only (with no extra significance for the links). See Relevanssi " +"Knowledge Base for more details. Changing this option requires reindexing." +msgstr "" +"Les balises de lien d'ancrage interne peuvent être indexées pour les " +"documents ciblés (de cette manière, le texte correspondra au document vers " +"lequel pointe le lien), soit pour la cible et la source ou uniquement pour " +"la source (sans importance supplémentaire particulière pour les liens). " +"Veuillez consulter la base de connaissance de Relevanssi pour plus de " +"détails. Modifier cette option nécessite une réindexation." + +#: relevanssi.php:1501 +msgid "Hide Relevanssi on edit pages:" +msgstr "Masquer Relevanssi sur les pages d'édition :" + +#: relevanssi.php:1503 +msgid "" +"If you check this option, all Relevanssi features are removed from edit " +"pages." +msgstr "" +"Si vous cochez cette option, toutes les fonctionnalités Relevanssi seront " +"supprimées des pages d'édition." + +#: relevanssi.php:1512 +msgid "Internal links" +msgstr "Liens internes" + +#: relevanssi.php:1535 +#, php-format +msgid "Post type '%s':" +msgstr "Type de billet « %s » :" + +#: relevanssi.php:1563 +#, php-format +msgid "Taxonomy '%s':" +msgstr "Taxonomie « %s » :" + +#: relevanssi.php:1581 +msgid "Weight multiplier for new posts:" +msgstr "Coefficient d’importance pour les nouveaux billets :" + +#: relevanssi.php:1583 +msgid "Assign bonus for posts newer than:" +msgstr "Assigner un bonus pour les billets datant de moins de :" + +#: relevanssi.php:1584 +msgid "days" +msgstr "jour(s)" + +#: relevanssi.php:1585 +msgid "" +"Posts newer than the day cutoff specified here will have their weight " +"multiplied with the bonus above." +msgstr "" +"Les billets récents datant de moins du nombre de jours indiqués ici " +"obtiendront une importance multipliée par le bonus ci-dessus." + +#: relevanssi.php:1591 +msgid "Don't show Relevanssi branding on the 'User Searches' screen:" +msgstr "" +"Ne pas afficher la mise en forme Relevanssi sur l'écran de recherche " +"d'utilisateurs :" # @ relevanssi -#: relevanssi.php:316 -msgid "Tag weight:" -msgstr "Poids des mots-clef:" +#: relevanssi.php:1598 +msgid "Highlight query terms in documents from external searches:" +msgstr "" +"Mettre en évidence les termes de la requête dans les documents à partir des " +"recherches externes :" + +#: relevanssi.php:1600 +msgid "" +"Highlights hits when user arrives from external search. Currently supports " +"Bing, Ask, Yahoo and AOL Search." +msgstr "" +"Met en évidence les occurrences quand l'utilisateur arrive d'une recherche " +"extérieure. Prend en charge actuellement Bing, Ask, Yahoo et AOL Search." + +#: relevanssi.php:1608 +msgid "Thousands separator" +msgstr "Séparateur de milliers" + +#: relevanssi.php:1610 +msgid "" +"If Relevanssi sees this character between numbers, it'll stick the numbers " +"together no matter how the character would otherwise be handled. Especially " +"useful if a space is used as a thousands separator." +msgstr "" +"Si Relevanssi détecte ce caractère entre des nombres, il collera ces nombres " +"ensemble et ne prendra pas en compte ce caractère. Particulièrement utile si " +"un espace est utilisé comme séparateur de milliers." + +#: relevanssi.php:1618 +msgid "Disable these shortcodes" +msgstr "Désactiver ces shortcodes" + +#: relevanssi.php:1620 +msgid "" +"These shortcodes will not be expanded if expand shortcodes above is enabled. " +"This is useful if a particular shortcode is causing problems in indexing." +msgstr "" +"Ces shortcodes ne seront pas générés si « Générer les shortcodes » est " +"activé ci-dessus. Cela est utile si un shortcode particulier pose problème " +"lors de l’indexation." # @ relevanssi -#: relevanssi.php:331 -msgid "Category weight:" -msgstr "Poids des catégories:" +#: relevanssi.php:1636 +msgid "Custom MySQL columns to index:" +msgstr "Colonnes MySQL personnalisées à indexer :" + +#: relevanssi.php:1638 +msgid "" +"A comma-separated list of wp_posts MySQL table columns to include in the " +"index. Following columns are available: " +msgstr "" +"Une liste de colonnes de table MySQL wp_posts séparées par une virgule à " +"inclure dans l’index. les colonnes suivantes sont disponibles :" # @ relevanssi -#~ msgid "Caching" -#~ msgstr "Mise en cache" +#: relevanssi.php:1646 +msgid "Index and search user profiles:" +msgstr "Indexer et rechercher les profils d’utilisateurs :" -#~ msgid "" -#~ "For better performance, adjust the limit to a smaller number. Adjusting " -#~ "the limit to 100 - or even lower - should be safe for good results, and " -#~ "might bring a boost in search speed." -#~ msgstr "" -#~ "Pour de meilleures performances, ajustez la limite à un nombre plus " -#~ "petit. Ajuster la limite à 100 - et même en dessous - ne pose pas de " -#~ "problèmes pour de bons résultats et est susceptible de booster la vitesse " -#~ "de recherche." +#: relevanssi.php:1648 +msgid "" +"If checked, Relevanssi will also index and search user profiles (first name, " +"last name, display name and user description). Requires changes to search " +"results template, see Relevanssi Knowledge Base." +msgstr "" +"Si coché, Relevanssi indexera et cherchera aussi dans les profils des " +"utilisateurs (prénom, nom, nom affiché et description de l'utilisateur). " +"Nécessite de modifier le template de résultats de recherche, cf. la base de " +"connaissance Relevanssi." + +#: relevanssi.php:1652 +msgid "Index subscriber profiles:" +msgstr "Indexer les profils des abonnés :" + +#: relevanssi.php:1654 +msgid "" +"If checked, Relevanssi will index subscriber profiles as well, otherwise " +"only authors, editors, contributors and admins are indexed." +msgstr "" +"Si coché, Relevanssi indexera aussi le profil des abonnés, sinon, seul celui " +"des auteurs, éditeurs, contributeurs et administrateurs est indexé." # @ relevanssi -#~ msgid "" -#~ "Warning: In many cases caching is not useful, and in some cases can be " -#~ "even harmful. Do not\n" -#~ "\tactivate cache unless you have a good reason to do so." -#~ msgstr "" -#~ "Attention: dans de nombreux cas, le cache n'est pas utile et dans " -#~ "certains cas il peut même causer du tort. Ne pas\n" -#~ "\n" -#~ "\\\tactiver le cache à moins que vous n'ayez une bonne raison." +#: relevanssi.php:1658 +msgid "Extra user fields to index:" +msgstr "Champs utilisateur supplémentaires à indexer :" + +#: relevanssi.php:1660 +msgid "" +"A comma-separated list of user profile field names (names of the database " +"columns) to include in the index." +msgstr "" +"Une liste de noms de champs de profils utilisateurs séparés par une virgule " +"(noms des colonnes de la base de données) à inclure dans l’index." # @ relevanssi -#~ msgid "Enable result and excerpt caching:" -#~ msgstr "Autoriser la mise en cache des résultats et d'extraits:" +#: relevanssi.php:1668 +msgid "Index synonyms:" +msgstr "Indexer les synonymes :" + +#: relevanssi.php:1670 +msgid "" +"If checked, Relevanssi will use the synonyms in indexing. If you add " +"'apple=pear' to the synonym list and enable this feature, every time the " +"indexer sees 'pear' it will index it both as 'apple' and as 'pear'. Thus, " +"the post will be found when searching with either word. This makes it " +"possible to use synonyms with AND searches, but will slow down indexing, " +"especially with large databases and large lists of synonyms. This only works " +"for post titles and post content. You can use multi-word keys and values, " +"but phrases do not work." +msgstr "" +"Si cochée, Relevanssi utilisera les synonymes lors de l’indexation. Si vous " +"ajoutez « pomme=poire » à la liste des synonymes et que vous activez cette " +"fonctionnalité, chaque fois que l’indexeur verra « poire », il l’indexera en " +"tant que « pomme » et « poire ». Ainsi, le billet sera retrouvé par l’un des " +"deux mots. Cela permet d’utiliser des synonymes pour des recherches AND, " +"mais ralentira l’indexation, surtout avec des bases de données volumineuses " +"et de longues listes de synonymes. Cela ne fonctionne que pour le titre et " +"le contenu des billets. Vous pouvez utiliser plusieurs mots et valeurs mais " +"les phrases ne fonctionnent pas." + +#: relevanssi.php:1678 +msgid "Index and search taxonomy pages:" +msgstr "Indexer et rechercher les pages de taxonomies :" + +#: relevanssi.php:1680 +msgid "" +"If checked, Relevanssi will also index and search taxonomy pages " +"(categories, tags, custom taxonomies)." +msgstr "" +"Si coché, Relevanssi indexera et recherchera aussi les pages de taxonomies " +"(catégories, mots-clés, taxonomies personnalisées)." + +#: relevanssi.php:1684 +msgid "" +"Choose taxonomies to index – for these taxonomies, the terms are included in " +"search results:" +msgstr "" +"Choisissez les taxonomies à indexer - pour ces taxonomies, les termes sont " +"inclus aux résultats de recherche :" + +#: relevanssi.php:1726 +msgid "" +"If you check a taxonomy here, the terms in that taxonomy will be indexed and " +"will appear as itself in the search results." +msgstr "" +"Si vous cochez ici une taxonomie, les termes dans cette taxonomie seront " +"indexés et apparaîtront dans les résultats de recherche." + +#: relevanssi.php:1734 +msgid "Import or export options" +msgstr "Importer ou exporter les options" + +#: relevanssi.php:1736 +msgid "" +"Here you find the current Relevanssi Premium options in a text format. Copy " +"the contents of the text field to make a backup of your settings. You can " +"also paste new settings here to change all settings at the same time. This " +"is useful if you have default settings you want to use on every system." +msgstr "" +"Ici vous trouvez les options actuelles de Relevanssi Premium au format " +"texte. Copiez le contenu du champ pour faire une sauvegarde de vos " +"paramètres. Vous pouvez également coller les nouveaux paramètres ici afin de " +"modifier d’une seule traite tous les paramètres. Cela est utile si vous avez " +"des paramètres par défaut que vous souhaitez utiliser sur tous les systèmes." + +#: relevanssi.php:1740 +msgid "Import settings" +msgstr "Importer les paramètres" + +#: relevanssi.php:1742 +msgid "" +"Note! Make sure you've got correct settings from a right version of " +"Relevanssi. Settings from a different version of Relevanssi may or may not " +"work and may or may not mess your settings." +msgstr "" +"Remarque ! Vérifiez que vous avez des paramètres corrects provenant de la " +"bonne version de Relevanssi. Des paramètres d’une version différente de " +"Relevanssi pourront ou ne pourront pas fonctionner et pourront ou ne " +"pourront pas endommager vos réglages." + +#: relevanssi.php:1761 +msgid "Thank you!" +msgstr "Merci !" + +#: relevanssi.php:1762 +msgid "" +"Thank you for buying Relevanssi Premium! Your support makes it possible for " +"me to keep working on this plugin." +msgstr "" +"Merci d’avoir acheté Relevanssi Premium ! Votre soutien me permet de " +"continuer à travailler sur ce plugin." + +#: relevanssi.php:1763 +msgid "" +"I can do custom hacks based on Relevanssi and other WordPress development. " +"If you need someone to fix your WordPress, just ask me for a quote." +msgstr "" +"Je peux réaliser des adaptations personnalisées basées sur Relevanssi et " +"d’autres développement WordPress. Si vous cherchez quelqu’un pour réparer " +"votre WordPress, demandez-moi une analyse." # @ relevanssi -#~ msgid "If checked, Relevanssi will cache search results and post excerpts." -#~ msgstr "" -#~ "Si coché, Relevanssi mettra en cache les résultats et extraits de billets." +#: relevanssi.php:1765 +msgid "Relevanssi on Facebook" +msgstr "Relevanssi sur Facebook" + +#: relevanssi.php:1766 +msgid "Check out the Relevanssi page on Facebook" +msgstr "Visiter la page Relevanssi sur Facebook" + +#: relevanssi.php:1767 +msgid "for news and updates about your favourite plugin." +msgstr "" +"pour obtenir des actualités et des mises à jour de votre plugin favori." + +#: relevanssi.php:1769 +msgid "Help and support" +msgstr "Aide et support" # @ relevanssi -#~ msgid "Cache expire (in seconds):" -#~ msgstr "Expiration du coche (en secondes):" +#: relevanssi.php:1770 +msgid "For Relevanssi support, see:" +msgstr "Pour une aide sur Relevanssi, voyez :" + +#: relevanssi.php:1771 +msgid "Plugin support page" +msgstr "Page d'aide du plugin" + +#: relevanssi.php:1772 +msgid "WordPress.org forum" +msgstr "Forum WordPress.org" + +#: relevanssi.php:1774 +msgid "Did you know this feature?" +msgstr "Connaissiez-vous cette fonctionnalité ?" + +#: relevanssi.php:1775 +msgid "" +"Wrap the parts of the posts you don't want to include in the index in " +"[noindex] shortcode." +msgstr "" +"Entourez les parties du billet que vous ne souhaitez pas voir indexer par le " +"shortcode [noindex]." + +#: relevanssi.php:1776 +msgid "Use the [search] shortcode to build easy links to search results." +msgstr "" +"Utilisez le shortcode [search] pour générer facilement des liens pointant " +"vers les résultats de recherche." + +#: relevanssi.php:1777 +msgid "" +"Enable the English-language stemmer by adding this line in your functions." +"php:" +msgstr "" +"Activez la racinisation de langue anglaise en ajoutant cette ligne dans " +"votre fichier functions.php :" + +#: relevanssi.php:1778 +msgid "Boolean NOT" +msgstr "Booléen NOT" + +#: relevanssi.php:1779 +msgid "To get results without particular word, use the minus operator" +msgstr "" +"Pour obtenir les résultats dépourvus d'un mot précis, utiliser l’opérateur " +"moins" + +#: relevanssi.php:1780 +msgid "cats -dogs" +msgstr "chats -chiens" + +#: relevanssi.php:1781 +msgid "Boolean AND" +msgstr "Booléen AND" + +#: relevanssi.php:1782 +msgid "To force a particular term in an OR search, use the plus operator" +msgstr "" +"Pour forcer un terme particulier dans une recherche OR, utilisez l’opérateur " +"plus" + +#: relevanssi.php:1783 +msgid "+cats dogs mice" +msgstr "+chats chiens souris" + +#: relevanssi.php:1784 +msgid "" +"would require that all results include the term 'cats', and results " +"including all three terms will be favoured. The plus operator has no effect " +"in an AND search, where all terms have an implicit + before them." +msgstr "" +"nécessitera que tous les résultats de recherche incluent le terme « chats » " +"et les résultats incluant les trois termes seront favorisés. L'opérateur " +"plus n’a aucun effet dans une recherche AND puisque tous les termes " +"comportent implicitement un plus." # @ relevanssi -#~ msgid "86400 = day" -#~ msgstr "86400 = jour" +#: relevanssi.php:1869 +msgid "Relevanssi post controls" +msgstr "Réglages Relevanssi des billets" # @ relevanssi -#~ msgid "Entries in the cache" -#~ msgstr "Entrées dans le cache" +#: relevanssi.php:1887 +msgid "Exclude this post or page from the index." +msgstr "Exclure ces billets/pages de l’index." + +#: relevanssi.php:1890 +msgid "Pin this post" +msgstr "Épingler ce billet" + +#: relevanssi.php:1891 +msgid "" +"A comma-separated list of single word keywords. If any of these keywords are " +"present in the search query, this post will be moved on top of the search " +"results." +msgstr "" +"Une liste de mots-clés de mots séparés par des virgules. Si un de ces mots-" +"clés est présent dans la requête de recherche, ce billet sera déplacé vers " +"le haut des résultats de recherche." diff --git a/mu-plugins/relevanssi/relevanssi-it_IT.mo b/mu-plugins/relevanssi/relevanssi-it_IT.mo new file mode 100644 index 0000000000000000000000000000000000000000..9647140f4c33732aad3e05a2eaad185036696890 GIT binary patch literal 12935 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 literal 0 HcmV?d00001 diff --git a/mu-plugins/relevanssi/relevanssi-ru_RU.mo b/mu-plugins/relevanssi/relevanssi-ru_RU.mo new file mode 100644 index 0000000000000000000000000000000000000000..6df6c94c71b8c0c1bb1eca33db1e1da40b481ab1 GIT binary patch literal 38461 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�MUFij2kY=)4w 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 Jl#86)FG# literal 0 HcmV?d00001 diff --git a/mu-plugins/relevanssi/relevanssi.php b/mu-plugins/relevanssi/relevanssi.php index 26a15fe2..a11c6ca1 100644 --- a/mu-plugins/relevanssi/relevanssi.php +++ b/mu-plugins/relevanssi/relevanssi.php @@ -3,12 +3,12 @@ Plugin Name: Relevanssi Plugin URI: http://www.relevanssi.com/ Description: This plugin replaces WordPress search with a relevance-sorting search. -Version: 3.3.8 +Version: 3.6.2.2 Author: Mikko Saari Author URI: http://www.mikkosaari.fi/ */ -/* Copyright 2014 Mikko Saari (email: mikko@mikkosaari.fi) +/* Copyright 2017 Mikko Saari (email: mikko@mikkosaari.fi) This file is part of Relevanssi, a search plugin for WordPress. @@ -28,13 +28,15 @@ // For debugging purposes //error_reporting(E_ALL); -//ini_set("display_errors", 1); +//ini_set("display_errors", 1); //define('WP-DEBUG', true); global $wpdb; //$wpdb->show_errors(); define('RELEVANSSI_PREMIUM', false); +add_filter('plugin_action_links_' . plugin_basename(__FILE__), 'relevanssi_action_links'); + global $relevanssi_variables; $relevanssi_variables['relevanssi_table'] = $wpdb->prefix . "relevanssi"; @@ -49,34 +51,34 @@ $relevanssi_variables['file'] = __FILE__; $relevanssi_variables['plugin_dir'] = plugin_dir_path(__FILE__); -require_once( 'lib/init.php' ); -require_once( 'lib/interface.php' ); -require_once( 'lib/indexing.php' ); -require_once( 'lib/stopwords.php' ); -require_once( 'lib/search.php' ); -require_once( 'lib/excerpts-highlights.php' ); -require_once( 'lib/shortcodes.php' ); -require_once( 'lib/common.php' ); +require_once('lib/init.php'); +require_once('lib/interface.php'); +require_once('lib/indexing.php'); +require_once('lib/stopwords.php'); +require_once('lib/search.php'); +require_once('lib/excerpts-highlights.php'); +require_once('lib/shortcodes.php'); +require_once('lib/common.php'); -function relevanssi_didyoumean($query, $pre, $post, $n = 5) { +function relevanssi_didyoumean($query, $pre, $post, $n = 5, $echo = true) { global $wpdb, $relevanssi_variables, $wp_query; - - $total_results = $wp_query->found_posts; - + + $total_results = $wp_query->found_posts; + if ($total_results > $n) return; $q = "SELECT query, count(query) as c, AVG(hits) as a FROM " . $relevanssi_variables['log_table'] . " WHERE hits > 1 GROUP BY query ORDER BY count(query) DESC"; $q = apply_filters('relevanssi_didyoumean_query', $q); $data = $wpdb->get_results($q); - + $distance = -1; $closest = ""; - + foreach ($data as $row) { if ($row->c < 2) break; $lev = levenshtein($query, $row->query); - + if ($lev < $distance || $distance < 0) { if ($row->a > 0) { $distance = $lev; @@ -85,22 +87,33 @@ function relevanssi_didyoumean($query, $pre, $post, $n = 5) { } } } - - if ($distance > 0) { + $result = null; + if ($distance > 0) { $url = get_bloginfo('url'); $url = esc_attr(add_query_arg(array( 's' => urlencode($closest) ), $url )); - $url = apply_filters('relevanssi_didyoumean_url', $url); - echo "$pre$closest$post"; + $url = apply_filters('relevanssi_didyoumean_url', $url, $query, $closest); + $closest = htmlspecialchars($closest); + $result = apply_filters('relevanssi_didyoumean_suggestion', "$pre$closest$post"); + if ($echo) echo $result; } - + return $result; } function relevanssi_check_old_data() { + if (function_exists('get_current_screen')) { + $screen = get_current_screen(); + if ($screen->base != 'settings_page_relevanssi/relevanssi') return; + } + else { + // Can't tell if we're on Relevanssi settings page, so we're not. + return; + } + if (is_admin()) { // Version 3.3 removes the cache feature $cache = get_option('relevanssi_enable_cache', 'nothing'); @@ -115,8 +128,8 @@ function relevanssi_check_old_data() { delete_option('relevanssi_enable_cache'); delete_option('relevanssi_cache_seconds'); wp_clear_scheduled_hook('relevanssi_truncate_cache'); - } - + } + // Version 3.1.4 combined taxonomy indexing options $inctags = get_option('relevanssi_include_tags', 'nothing'); if ($inctags == 'on') { @@ -146,7 +159,7 @@ function relevanssi_check_old_data() { update_option('relevanssi_index_taxonomies_list', $taxonomies); delete_option('relevanssi_custom_taxonomies'); } - + $limit = get_option('relevanssi_throttle_limit'); if (empty($limit)) update_option('relevanssi_throttle_limit', 500); @@ -168,14 +181,14 @@ function relevanssi_check_old_data() { delete_option('relevanssi_tag_boost'); update_option('relevanssi_post_type_weights', $post_type_weights); } - + $index_type = get_option('relevanssi_index_type', 'nothing'); if ($index_type != 'nothing') { // Delete unused options from versions < 3 $post_types = get_option('relevanssi_index_post_types'); - + if (!is_array($post_types)) $post_types = array(); - + switch ($index_type) { case "posts": array_push($post_types, 'post'); @@ -188,21 +201,21 @@ function relevanssi_check_old_data() { $pt_1 = get_post_types(array('exclude_from_search' => '0')); $pt_2 = get_post_types(array('exclude_from_search' => false)); foreach (array_merge($pt_1, $pt_2) as $type) { - array_push($post_types, $type); + array_push($post_types, $type); } } break; case "both": // really should be "everything" $pt = get_post_types(); foreach ($pt as $type) { - array_push($post_types, $type); + array_push($post_types, $type); } break; } - + $attachments = get_option('relevanssi_index_attachments'); if ('on' == $attachments) array_push($post_types, 'attachment'); - + $custom_types = get_option('relevanssi_custom_types'); $custom_types = explode(',', $custom_types); if (is_array($custom_types)) { @@ -213,9 +226,9 @@ function relevanssi_check_old_data() { } } } - + update_option('relevanssi_index_post_types', $post_types); - + delete_option('relevanssi_index_type'); delete_option('relevanssi_index_attachments'); delete_option('relevanssi_custom_types'); @@ -225,7 +238,7 @@ function relevanssi_check_old_data() { function _relevanssi_install() { global $relevanssi_variables; - + add_option('relevanssi_title_boost', $relevanssi_variables['title_boost_default']); add_option('relevanssi_comment_boost', $relevanssi_variables['comment_boost_default']); add_option('relevanssi_admin_search', 'off'); @@ -245,12 +258,12 @@ function _relevanssi_install() { add_option('relevanssi_extag', '0'); add_option('relevanssi_index_fields', ''); add_option('relevanssi_exclude_posts', ''); //added by OdditY - add_option('relevanssi_hilite_title', ''); //added by OdditY + add_option('relevanssi_hilite_title', ''); //added by OdditY add_option('relevanssi_highlight_docs', 'off'); add_option('relevanssi_highlight_comments', 'off'); add_option('relevanssi_index_comments', 'none'); //added by OdditY add_option('relevanssi_show_matches', ''); - add_option('relevanssi_show_matches_text', '(Search hits: %body% in body, %title% in title, %tags% in tags, %comments% in comments. Score: %score%)'); + add_option('relevanssi_show_matches_text', '(Search hits: %body% in body, %title% in title, %categories% in categories, %tags% in tags, %taxonomies% in other taxonomies, %comments% in comments. Score: %score%)'); add_option('relevanssi_fuzzy', 'sometimes'); add_option('relevanssi_indexed', ''); add_option('relevanssi_expand_shortcodes', 'on'); @@ -273,7 +286,9 @@ function _relevanssi_install() { add_option('relevanssi_throttle_limit', '500'); add_option('relevanssi_index_post_types', $relevanssi_variables['post_type_index_defaults']); add_option('relevanssi_index_taxonomies_list', array()); - + + do_action('relevanssi_update_options'); + relevanssi_create_database_tables($relevanssi_variables['database_version']); } @@ -284,7 +299,7 @@ function _relevanssi_install() { function relevanssi_get_post($id) { global $relevanssi_post_array; - + if (isset($relevanssi_post_array[$id])) { $post = $relevanssi_post_array[$id]; } @@ -296,7 +311,7 @@ function relevanssi_get_post($id) { function relevanssi_remove_doc($id) { global $wpdb, $relevanssi_variables; - + $D = get_option( 'relevanssi_doc_count'); $q = "DELETE FROM " . $relevanssi_variables['relevanssi_table'] . " WHERE doc=$id"; @@ -311,7 +326,7 @@ function relevanssi_remove_doc($id) { /***** * Interface functions */ - + function relevanssi_form_tag_weight($post_type_weights) { $label = __("Tag weight:", 'relevanssi'); $value = $post_type_weights['post_tag']; @@ -319,7 +334,7 @@ function relevanssi_form_tag_weight($post_type_weights) { echo <<

    - $label + $label @@ -334,7 +349,7 @@ function relevanssi_form_tag_weight($post_type_weights) { echo <<
    - $label + $label @@ -346,83 +361,88 @@ function relevanssi_form_tag_weight($post_type_weights) { function relevanssi_sidebar() { $tweet = 'http://twitter.com/home?status=' . urlencode("I'm using Relevanssi, a better search for WordPress. http://wordpress.org/extend/plugins/relevanssi/ #relevanssi #wordpress"); - if (function_exists("plugins_url")) { - global $wp_version; - if (version_compare($wp_version, '2.8dev', '>' )) { - $facebooklogo = plugins_url('facebooklogo.jpg', __FILE__); - } - else { - $facebooklogo = plugins_url('relevanssi/facebooklogo.jpg'); - } - } - else { - // We can't check, so let's assume something sensible - $facebooklogo = '/wp-content/plugins/relevanssi/facebooklogo.jpg'; - } + $facebooklogo = plugins_url('facebooklogo.jpg', __FILE__); echo <<
    -
    +
    -

    Buy Relevanssi Premium!

    +EOH; + printf('

    %s!

    ', __('Buy Relevanssi Premium', 'relevanssi')); + echo <<
    -

    Do you want more features? Support Relevanssi development? Get a -better search experience for your users?

    +

    +EOH; + _e('Do you want more features? Support Relevanssi development? Get a better search experience for your users?', 'relevanssi'); + echo "

    "; -

    Go Premium! Buy Relevanssi Premium. See feature -comparison and license prices.

    + printf('

    %s ', __('Go Premium!', 'relevanssi')); + printf(__('Buy Relevanssi Premium. See feature comparison and license prices.', 'relevanssi'), 'https://www.relevanssi.com/features/?utm_source=plugin&utm_medium=link&utm_campaign=features', 'https://www.relevanssi.com/buy-premium/?utm_source=plugin&utm_medium=link&utm_campaign=license'); + echo "

    "; -

    Buy Premium here »

    + printf('

    %s »

    ', __('Buy Premium now', 'relevanssi')); + + printf('

    ' . __('Use the coupon %s to get 20%% off the price (valid through 2017).', 'relevanssi') . '

    ', 'FREE2017'); + echo <<
    -

    Sample Premium features

    +EOH; + printf('

    %s

    ', __('Some Premium features', 'relevanssi')); + echo <<
    -

    With Relevanssi Premium, you would have more options:

    - -

    - Internal link anchors are search terms for the target posts, if you wish
    -- Hiding Relevanssi branding from the User Searches page on a client installation
    -- Adjust weights separately for each post type and taxonomy
    -- Give extra weight to recent posts
    -- Highlight search terms for visitors from Google and other external search sources
    -- Make Relevanssi understand thousand separators to handle big numbers better
    -- Index and search any columns in the wp_posts database
    -- Index and search user profile pages
    -- Index and search taxonomy term pages
    -- Import and export options
    -- And more! +EOH; + printf('

    %s

    ', __('With Relevanssi Premium, you would have more options:', 'relevanssi')); + + printf('– %s
    ', __('Internal link anchors are search terms for the target posts, if you wish', 'relevanssi')); + printf('– %s
    ', __('Hiding Relevanssi branding from the User Searches page on a client installation', 'relevanssi')); + printf('– %s
    ', __('Adjust weights separately for each post type and taxonomy', 'relevanssi')); + printf('– %s
    ', __('Give extra weight to recent posts', 'relevanssi')); + printf('– %s
    ', __('Make Relevanssi understand thousand separators to handle big numbers better', 'relevanssi')); + printf('– %s
    ', __('Index and search any columns in the wp_posts database', 'relevanssi')); + printf('– %s
    ', __('Index and search user profile pages', 'relevanssi')); + printf('– %s
    ', __('Index and search taxonomy term pages', 'relevanssi')); + printf('– %s
    ', __('Import and export options', 'relevanssi')); + printf('– %s
    ', __('WP CLI commands', 'relevanssi')); + printf('– %s
    ', __('And more!', 'relevanssi')); + + echo <<

    - +
    -

    Relevanssi on Facebook

    +EOH; + printf('

    %s

    ', __('Relevanssi on Facebook', 'relevanssi')); + echo <<
    Facebook
    -

    Check - out the Relevanssi page on Facebook for news and updates about your favourite plugin.

    +EOH; + printf('

    ' . __('Check out the Relevanssi page on Facebook for news and updates about Relevanssi.', 'relevanssi') . '

    ', 'https://www.facebook.com/relevanssi'); + echo <<
    -

    Help and support

    -
    -

    For Relevanssi support, see:

    - -

    - WordPress.org forum
    - - Knowledge base

    +EOH; + printf('

    %s

    ', __('Help and support', 'relevanssi')); + echo '
    '; + printf('

    %s

    ', __('For Relevanssi support, see:', 'relevanssi')); + printf('

    %s
    ', __('WordPress.org forum', 'relevanssi')); + printf('– %s

    ', __('Knowledge base', 'relevanssi')); + echo <<
    - +
    EOH; diff --git a/mu-plugins/relevanssi/relevanssi.po b/mu-plugins/relevanssi/relevanssi.po index f69a9ff4..fd2ff8d5 100644 --- a/mu-plugins/relevanssi/relevanssi.po +++ b/mu-plugins/relevanssi/relevanssi.po @@ -2,320 +2,1006 @@ msgid "" msgstr "" "Project-Id-Version: Relevanssi\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-08-14 14:06+0200\n" +"POT-Creation-Date: 2017-05-20 06:02+0300\n" "PO-Revision-Date: \n" "Last-Translator: Mikko Saari \n" "Language-Team: \n" +"Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Poedit-KeywordsList: __\n" +"X-Poedit-KeywordsList: __;_e;_x;_n;_ex;_nx;esc_attr__;esc_attr_e;esc_attr_x;" +"esc_html__;esc_html_e;esc_html_x;_n_noop;_nx_noop;translate_nooped_plural\n" "X-Poedit-Basepath: .\n" +"X-Generator: Poedit 2.0.1\n" "X-Poedit-SearchPath-0: .\n" -#: relevanssi.php:703 +#: lib/excerpts-highlights.php:11 msgid "There is no excerpt because this is a protected post." msgstr "" -#: relevanssi.php:994 +#: lib/indexing.php:137 msgid "Indexing complete!" msgstr "" -#: relevanssi.php:1183 +#: lib/init.php:41 +msgid "" +"You do not have an index! Remember to build the index (click the \"Build the " +"index\" button), otherwise searching won't work." +msgstr "" + +#: lib/init.php:57 +msgid "" +"Multibyte string functions are not available. Relevanssi may not work well " +"without them. Please install (or ask your host to install) the mbstring " +"extension." +msgstr "" + +#: lib/init.php:85 lib/init.php:86 +msgid "User searches" +msgstr "" + +#: lib/interface.php:6 +msgid "Relevanssi Premium Search Options" +msgstr "" + +#: lib/interface.php:9 msgid "Relevanssi Search Options" msgstr "" -#: relevanssi.php:1294 +#: lib/interface.php:81 +msgid "User Searches" +msgstr "" + +#: lib/interface.php:83 +msgid "Relevanssi User Searches" +msgstr "" + +#: lib/interface.php:112 +msgid "Enable query logging to see stats here." +msgstr "" + +#: lib/interface.php:129 +msgid "Logs clear!" +msgstr "" + +#: lib/interface.php:132 +msgid "Clearing the logs failed." +msgstr "" + +#: lib/interface.php:329 #, php-format -msgid "

    Term '%s' added to stopwords!

    " +msgid "" +"

    Successfully added %d/%d terms to " +"stopwords!

    " msgstr "" -#: relevanssi.php:1297 +#: lib/interface.php:336 #, php-format -msgid "

    Couldn't add term '%s' to stopwords!

    " +msgid "" +"

    Term '%s' added to stopwords!

    " msgstr "" -#: relevanssi.php:1306 +#: lib/interface.php:339 +#, php-format +msgid "" +"

    Couldn't add term '%s' to " +"stopwords!

    " +msgstr "" + +#: lib/interface.php:378 +msgid "" +"

    Stopwords removed! Remember to re-" +"index.

    " +msgstr "" + +#: lib/interface.php:390 +#, php-format +msgid "Term '%s' removed from stopwords! Re-index to get it back to index." +msgstr "" + +#: lib/interface.php:400 +#, php-format +msgid "Couldn't remove term '%s' from stopwords!" +msgstr "" + +#: lib/interface.php:421 msgid "25 most common words in the index" msgstr "" -#: relevanssi.php:1308 -msgid "These words are excellent stopword material. A word that appears in most of the posts in the database is quite pointless when searching. This is also an easy way to create a completely new stopword list, if one isn't available in your language. Click the icon after the word to add the word to the stopword list. The word will also be removed from the index, so rebuilding the index is not necessary." +#: lib/interface.php:422 +msgid "" +"These words are excellent stopword material. A word that appears in most of " +"the posts in the database is quite pointless when searching. This is also an " +"easy way to create a completely new stopword list, if one isn't available in " +"your language. Click the icon after the word to add the word to the stopword " +"list. The word will also be removed from the index, so rebuilding the index " +"is not necessary." msgstr "" -#: relevanssi.php:1331 +#: lib/interface.php:445 msgid "Add to stopwords" msgstr "" -#: relevanssi.php:1344 -msgid "25 most popular queries" +#: lib/interface.php:463 +msgid "Total Searches" msgstr "" -#: relevanssi.php:1356 -msgid "Recent queries that got 0 hits" +#: lib/interface.php:466 +msgid "Totals" msgstr "" -#: relevanssi.php:1491 -msgid "Title boost:" +#: lib/interface.php:471 +msgid "Common Queries" msgstr "" -#: relevanssi.php:1492 +#: lib/interface.php:474 #, php-format -msgid "Default: %d. 0 means titles are ignored, 1 means no boost, more than 1 gives extra value." +msgid "" +"Here you can see the %d most common user search queries, how many times " +"those\n" +"\t\tqueries were made and how many results were found for those queries." +msgstr "" + +#: lib/interface.php:480 lib/interface.php:496 lib/interface.php:528 +msgid "Today and yesterday" msgstr "" -#: relevanssi.php:1493 -msgid "Tag boost:" +#: lib/interface.php:484 lib/interface.php:500 lib/interface.php:529 +msgid "Last 7 days" msgstr "" -#: relevanssi.php:1494 +#: lib/interface.php:488 lib/interface.php:504 #, php-format -msgid "Default: %d. 0 means tags are ignored, 1 means no boost, more than 1 gives extra value." +msgid "Last %d days" msgstr "" -#: relevanssi.php:1495 -msgid "Comment boost:" +#: lib/interface.php:493 +msgid "Unsuccessful Queries" msgstr "" -#: relevanssi.php:1496 +#: lib/interface.php:511 +msgid "Reset Logs" +msgstr "" + +#: lib/interface.php:514 #, php-format -msgid "Default: %d. 0 means comments are ignored, 1 means no boost, more than 1 gives extra value." +msgid "To reset the logs, type \"reset\" into the box here %s and click %s" +msgstr "" + +#: lib/interface.php:530 +msgid "Last 30 days" +msgstr "" + +#: lib/interface.php:531 +msgid "Forever" +msgstr "" + +#: lib/interface.php:533 +msgid "When" msgstr "" -#: relevanssi.php:1497 +#: lib/interface.php:533 +msgid "Searches" +msgstr "" + +#: lib/interface.php:565 +msgid "Query" +msgstr "" + +#: lib/interface.php:565 +msgid "Hits" +msgstr "" + +#: lib/interface.php:874 lib/interface.php:914 +msgid "Basic options" +msgstr "" + +#: lib/interface.php:875 lib/interface.php:974 +msgid "Weights" +msgstr "" + +#: lib/interface.php:876 lib/interface.php:1029 +msgid "Logs" +msgstr "" + +#: lib/interface.php:877 lib/interface.php:1057 +msgid "Exclusions and restrictions" +msgstr "" + +#: lib/interface.php:878 +msgid "Custom excerpts" +msgstr "" + +#: lib/interface.php:879 +msgid "Highlighting search results" +msgstr "" + +#: lib/interface.php:880 lib/interface.php:1208 +msgid "Indexing options" +msgstr "" + +#: lib/interface.php:881 lib/interface.php:1368 +msgid "Synonyms" +msgstr "" + +#: lib/interface.php:882 lib/interface.php:1378 +msgid "Stopwords" +msgstr "" + +#: lib/interface.php:885 +msgid "Import/export options" +msgstr "" + +#: lib/interface.php:888 relevanssi.php:380 +msgid "Buy Relevanssi Premium" +msgstr "" + +#: lib/interface.php:893 +msgid "Quick tools" +msgstr "" + +#: lib/interface.php:895 +msgid "Save options" +msgstr "" + +#: lib/interface.php:896 +msgid "Build the index" +msgstr "" + +#: lib/interface.php:897 lib/interface.php:1366 +msgid "Continue indexing" +msgstr "" + +#: lib/interface.php:897 +msgid "add" +msgstr "" + +#: lib/interface.php:897 +msgid "documents." +msgstr "" + +#: lib/interface.php:901 +msgid "" +"WARNING: You've chosen no post types to index. Nothing will be indexed. Choose some post types to index." +msgstr "" + +#: lib/interface.php:905 +msgid "" +"Use 'Build the index' to build the index with current indexing options. If you can't finish indexing with one " +"go, use 'Continue indexing' to finish the job. You can change the number of " +"documents to add until you find the largest amount you can add with one go. " +"See 'State of the Index' below to find out how many documents actually go " +"into the index." +msgstr "" + +#: lib/interface.php:907 +msgid "State of the Index" +msgstr "" + +#: lib/interface.php:909 +msgid "Documents in the index" +msgstr "" + +#: lib/interface.php:910 +msgid "Terms in the index" +msgstr "" + +#: lib/interface.php:911 +msgid "Highest post ID indexed" +msgstr "" + +#: lib/interface.php:920 msgid "Use search for admin:" msgstr "" -#: relevanssi.php:1498 +#: lib/interface.php:922 msgid "If checked, Relevanssi will be used for searches in the admin interface" msgstr "" -#: relevanssi.php:1499 -msgid "Restrict search to these categories and tags:" +#: lib/interface.php:926 +msgid "Default operator for the search?" msgstr "" -#: relevanssi.php:1500 -msgid "Enter a comma-separated list of category and tag IDs to restrict search to those categories or tags. You can also use <input type='hidden' name='cat' value='list of cats and tags' /> in your search form. The input field will overrun this setting." +#: lib/interface.php:928 +msgid "AND - require all terms" msgstr "" -#: relevanssi.php:1501 -msgid "Exclude these categories and tags from search:" +#: lib/interface.php:929 +msgid "OR - any term present is enough" msgstr "" -#: relevanssi.php:1502 -msgid "Enter a comma-separated list of category and tag IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there)." +#: lib/interface.php:931 +msgid "" +"If you choose AND and the search finds no matches, it will automatically do " +"an OR search." msgstr "" -#: relevanssi.php:1505 -msgid "Exclude these posts/pages from search:" +#: lib/interface.php:935 +msgid "Disable OR fallback:" msgstr "" -#: relevanssi.php:1506 -msgid "Enter a comma-separated list of post/page IDs that are excluded from search results. This only works here, you can't use the input field option (WordPress doesn't pass custom parameters there)." +#: lib/interface.php:937 +msgid "" +"If you don't want Relevanssi to fall back to OR search when AND search gets " +"no hits, check this option. For most cases, leave this one unchecked." msgstr "" -#: relevanssi.php:1507 -msgid "Index and search your posts' tags:" +#: lib/interface.php:941 +msgid "Default order for results:" msgstr "" -#: relevanssi.php:1508 -msgid "If checked, Relevanssi will also index and search the tags of your posts. Remember to rebuild the index if you change this option!" +#: lib/interface.php:943 +msgid "Relevance (highly recommended)" msgstr "" -#: relevanssi.php:1509 -msgid "Index and search these comments:" +#: lib/interface.php:944 +msgid "Post date" msgstr "" -#: relevanssi.php:1510 -msgid "Relevanssi will index and search ALL (all comments including track- & pingbacks and custom comment types), NONE (no comments) or NORMAL (manually posted comments on your blog).
    Remember to rebuild the index if you change this option!" +#: lib/interface.php:946 +msgid "" +"If you want date-based results, see the recent post bonus in the Weights " +"section." msgstr "" -#: relevanssi.php:1511 -msgid "all" +#: lib/interface.php:950 +msgid "When to use fuzzy matching?" msgstr "" -#: relevanssi.php:1512 -msgid "normal" +#: lib/interface.php:952 +msgid "When straight search gets no hits" msgstr "" -#: relevanssi.php:1513 -msgid "none" +#: lib/interface.php:953 +msgid "Always" msgstr "" -#: relevanssi.php:1516 -msgid "Create custom search result snippets:" +#: lib/interface.php:954 +msgid "Don't use fuzzy search" msgstr "" -#: relevanssi.php:1517 -msgid "If checked, Relevanssi will create excerpts that contain the search term hits. To make them work, make sure your search result template uses the_excerpt() to display post excerpts." +#: lib/interface.php:956 +msgid "" +"Straight search matches just the term. Fuzzy search matches everything that " +"begins or ends with the search term." msgstr "" -#: relevanssi.php:1518 -msgid "Length of the snippet:" +#: lib/interface.php:964 +msgid "Limit searches:" msgstr "" -#: relevanssi.php:1519 -msgid "This must be an integer." +#: lib/interface.php:966 +msgid "" +"If this option is checked, Relevanssi will limit search results to at most " +"500 results per term (this number can be adjusted by changing the " +"'relevanssi_throttle_limit' option). This will improve performance, but may " +"cause some relevant documents to go unfound. However, Relevanssi tries to " +"prioritize the most relevant documents. This does not work when " +"sorting results by date. The throttle can end up cutting off recent " +"posts to favour more relevant posts." msgstr "" -#: relevanssi.php:1520 -msgid "words" +#: lib/interface.php:976 +msgid "" +"These values affect the weights of the documents. These are all multipliers, " +"so 1 means no change in weight, less than 1 means less weight, and more than " +"1 means more weight. Setting something to zero makes that worthless. For " +"example, if title weight is more than 1, words in titles are more " +"significant than words elsewhere. If title weight is 0, words in titles " +"won't make any difference to the search results." msgstr "" -#: relevanssi.php:1521 -msgid "characters" +#: lib/interface.php:981 +msgid "Element" +msgstr "" + +#: lib/interface.php:982 +msgid "Weight" msgstr "" -#: relevanssi.php:1522 +#: lib/interface.php:983 +msgid "Default weight" +msgstr "" + +#: lib/interface.php:988 +msgid "Post titles" +msgstr "" + +#: lib/interface.php:1000 +msgid "Comment text" +msgstr "" + +#: lib/interface.php:1021 +msgid "WPML/Polylang compatibility" +msgstr "" + +#: lib/interface.php:1023 +msgid "Limit results to current language:" +msgstr "" + +#: lib/interface.php:1025 +msgid "" +"If this option is checked, Relevanssi will only return results in the " +"current active language. Otherwise results will include posts in every " +"language." +msgstr "" + +#: lib/interface.php:1031 msgid "Keep a log of user queries:" msgstr "" -#: relevanssi.php:1523 -msgid "If checked, Relevanssi will log user queries." +#: lib/interface.php:1033 +msgid "" +"If checked, Relevanssi will log user queries. The log appears in 'User " +"searches' on the Dashboard admin menu." +msgstr "" + +#: lib/interface.php:1037 +msgid "Log the user's IP with the queries:" msgstr "" -#: relevanssi.php:1524 -msgid "Highlight query terms in search results:" +#: lib/interface.php:1039 +msgid "If checked, Relevanssi will log user's IP-Adress with the queries." msgstr "" -#: relevanssi.php:1525 -msgid "Highlighting isn't available unless you use custom snippets" +#: lib/interface.php:1043 +msgid "Don't log queries from these users:" msgstr "" -#: relevanssi.php:1526 -msgid "Highlight query terms in result titles too:" +#: lib/interface.php:1045 +msgid "" +"Comma-separated list of numeric user IDs or user login names that will not " +"be logged." msgstr "" -#: relevanssi.php:1529 -msgid "Save" +#: lib/interface.php:1048 +msgid "" +"If you enable logs, you can see what your users are searching for. You can " +"prevent your own searches from getting in the logs with the omit feature." msgstr "" -#: relevanssi.php:1530 -msgid "Building the index and indexing options" +#: lib/interface.php:1050 +msgid "Logs are also needed to use the 'Did you mean?' feature." msgstr "" -#: relevanssi.php:1531 -msgid "After installing the plugin, you need to build the index. This generally needs to be done once, you don't have to re-index unless something goes wrong. Indexing is a heavy task and might take more time than your servers allow. If the indexing cannot be finished - for example you get a blank screen or something like that after indexing - you can continue indexing from where you left by clicking 'Continue indexing'. Clicking 'Build the index' will delete the old index, so you can't use that." +#: lib/interface.php:1059 +msgid "Restrict search to these categories and tags:" msgstr "" -#: relevanssi.php:1532 -msgid "So, if you build the index and don't get the 'Indexing complete' in the end, keep on clicking the 'Continue indexing' button until you do. On my blogs, I was able to index ~400 pages on one go, but had to continue indexing twice to index ~950 pages." +#: lib/interface.php:1061 +msgid "" +"Enter a comma-separated list of category and tag IDs to restrict search to " +"those categories or tags. You can also use <input type='hidden' " +"name='cats' value='list of cats and tags' /> in your search form. " +"The input field will \toverrun this setting." msgstr "" -#: relevanssi.php:1533 -msgid "Save indexing options and build the index" +#: lib/interface.php:1065 +msgid "Exclude these categories from search:" msgstr "" -#: relevanssi.php:1534 -msgid "Continue indexing" +#: lib/interface.php:1067 +msgid "" +"Enter a comma-separated list of category IDs that are excluded from search " +"results." +msgstr "" + +#: lib/interface.php:1071 +msgid "Exclude these tags from search:" +msgstr "" + +#: lib/interface.php:1073 +msgid "" +"Enter a comma-separated list of tag IDs that are excluded from search " +"results." +msgstr "" + +#: lib/interface.php:1077 +msgid "Exclude these posts/pages from search:" +msgstr "" + +#: lib/interface.php:1080 +msgid "" +"Enter a comma-separated list of post/page IDs that are excluded from search " +"results. This only works here, you can't use the input field option " +"(WordPress doesn't pass custom parameters there)." +msgstr "" + +#: lib/interface.php:1082 +msgid "" +"You can also use a checkbox on post/page edit pages to remove posts from " +"index. This setting doesn't work in multisite searches, but the checkbox " +"does." +msgstr "" + +#: lib/interface.php:1089 +msgid "Respect exclude_from_search for custom post types:" +msgstr "" + +#: lib/interface.php:1091 +msgid "" +"If checked, Relevanssi won't display posts of custom post types that have " +"'exclude_from_search' set to true. If not checked, Relevanssi will display " +"anything that is indexed." +msgstr "" + +#: lib/interface.php:1093 +msgid "Custom excerpts/snippets" +msgstr "" + +#: lib/interface.php:1095 +msgid "Create custom search result snippets:" +msgstr "" + +#: lib/interface.php:1097 +msgid "" +"If checked, Relevanssi will create excerpts that contain the search term " +"hits. To make them work, make sure your search result template uses " +"the_excerpt() to display post excerpts." +msgstr "" + +#: lib/interface.php:1099 +msgid "" +"Note: Building custom excerpts can be slow. If you are not actually using " +"the excerpts, make sure you disable the option." +msgstr "" + +#: lib/interface.php:1101 +msgid "Length of the snippet:" +msgstr "" + +#: lib/interface.php:1104 +msgid "characters" +msgstr "" + +#: lib/interface.php:1105 +msgid "words" +msgstr "" + +#: lib/interface.php:1107 +msgid "This must be an integer." +msgstr "" + +#: lib/interface.php:1111 +msgid "Allowable tags in excerpts:" +msgstr "" + +#: lib/interface.php:1114 +msgid "" +"List all tags you want to allow in excerpts, without any whitespace. For " +"example: '<p><a><strong>'." +msgstr "" + +#: lib/interface.php:1118 +msgid "Show breakdown of search hits in excerpts:" +msgstr "" + +#: lib/interface.php:1120 +msgid "" +"Check this to show more information on where the search hits were made. " +"Requires custom snippets to work." +msgstr "" + +#: lib/interface.php:1124 +msgid "The breakdown format:" +msgstr "" + +#: lib/interface.php:1126 +msgid "" +"Use %body%, %title%, %tags% and %comments% to display the number of hits (in " +"different parts of the post), %total% for total hits, %score% to display the " +"document weight and %terms% to show how many hits each search term got. No " +"double quotes (\") allowed!" msgstr "" -#: relevanssi.php:1535 +#: lib/interface.php:1128 +msgid "Search hit highlighting" +msgstr "" + +#: lib/interface.php:1130 +msgid "First, choose the type of highlighting used:" +msgstr "" + +#: lib/interface.php:1133 +msgid "Highlight query terms in search results:" +msgstr "" + +#: lib/interface.php:1135 msgid "No highlighting" msgstr "" -#: relevanssi.php:1536 +#: lib/interface.php:1139 msgid "Text color" msgstr "" -#: relevanssi.php:1537 +#: lib/interface.php:1140 msgid "Background color" msgstr "" -#: relevanssi.php:1538 +#: lib/interface.php:1141 msgid "CSS Style" msgstr "" -#: relevanssi.php:1539 +#: lib/interface.php:1142 msgid "CSS Class" msgstr "" -#: relevanssi.php:1541 +#: lib/interface.php:1144 +msgid "Highlighting isn't available unless you use custom snippets" +msgstr "" + +#: lib/interface.php:1148 +msgid "Highlight query terms in result titles too:" +msgstr "" + +#: lib/interface.php:1150 +msgid "" +"Highlight hits in titles of the search results. This doesn't work " +"automatically but requires you to replace the_title() on the template with " +"relevanssi_the_title()." +msgstr "" + +#: lib/interface.php:1154 +msgid "Highlight query terms in documents from local searches:" +msgstr "" + +#: lib/interface.php:1156 +msgid "" +"Highlights hits when user opens the post from search results. This is based " +"on HTTP referrer, so if that's blocked, there'll be no highlights." +msgstr "" + +#: lib/interface.php:1162 +msgid "Highlight query terms in comments:" +msgstr "" + +#: lib/interface.php:1164 +msgid "" +"Highlights hits in comments when user opens the post from search results." +msgstr "" + +#: lib/interface.php:1168 +msgid "Uncheck this if you use non-ASCII characters:" +msgstr "" + +#: lib/interface.php:1170 +msgid "" +"If you use non-ASCII characters (like Cyrillic alphabet) and the highlights " +"don't work, uncheck this option to make highlights work." +msgstr "" + +#: lib/interface.php:1175 +msgid "Then adjust the settings for your chosen type:" +msgstr "" + +#: lib/interface.php:1179 msgid "Text color for highlights:" msgstr "" -#: relevanssi.php:1542 +#: lib/interface.php:1181 lib/interface.php:1187 +msgid "Use HTML color codes (#rgb or #rrggbb)" +msgstr "" + +#: lib/interface.php:1185 msgid "Background color for highlights:" msgstr "" -#: relevanssi.php:1543 +#: lib/interface.php:1191 msgid "CSS style for highlights:" msgstr "" -#: relevanssi.php:1544 +#: lib/interface.php:1193 +msgid "" +"You can use any CSS styling here, style will be inserted with a <span>" +msgstr "" + +#: lib/interface.php:1197 msgid "CSS class for highlights:" msgstr "" -#: relevanssi.php:1546 -#: relevanssi.php:1547 -msgid "Use HTML color codes (#rgb or #rrggbb)" +#: lib/interface.php:1199 +msgid "" +"Name a class here, search results will be wrapped in a <span> with the " +"class" +msgstr "" + +#: lib/interface.php:1206 lib/interface.php:1376 +msgid "Save the options" +msgstr "" + +#: lib/interface.php:1210 +msgid "Choose post types to index:" +msgstr "" + +#: lib/interface.php:1215 +msgid "Type" +msgstr "" + +#: lib/interface.php:1216 lib/interface.php:1274 +msgid "Index" +msgstr "" + +#: lib/interface.php:1217 +msgid "Excluded from search?" +msgstr "" + +#: lib/interface.php:1235 lib/interface.php:1290 +msgid "no" +msgstr "" + +#: lib/interface.php:1235 lib/interface.php:1290 +msgid "yes" msgstr "" -#: relevanssi.php:1548 -msgid "You can use any CSS styling here, style will be inserted with a <span>" +#: lib/interface.php:1265 +#, php-format +msgid "" +"If you choose to index a post type that is excluded from the search, you may " +"need to uncheck the \"%s\" option." msgstr "" -#: relevanssi.php:1549 -msgid "Name a class here, search results will be wrapped in a <span> with the class" +#: lib/interface.php:1265 +msgid "Respect exclude_from_search for custom post types" msgstr "" -#: relevanssi.php:1551 -msgid "What to include in the index" +#: lib/interface.php:1268 +msgid "Choose taxonomies to index:" msgstr "" -#: relevanssi.php:1552 -msgid "Everything" +#: lib/interface.php:1273 +msgid "Taxonomy" msgstr "" -#: relevanssi.php:1553 -msgid "Just posts" +#: lib/interface.php:1275 +msgid "Public?" +msgstr "" + +#: lib/interface.php:1310 +msgid "" +"If you check a taxonomy here, the terms for that taxonomy are indexed with " +"the posts. If you for example choose \"post_tag\", searching for tags will " +"find all posts that have the tag." +msgstr "" + +#: lib/interface.php:1314 +msgid "Minimum word length to index" +msgstr "" + +#: lib/interface.php:1316 +msgid "Words shorter than this number will not be indexed." +msgstr "" + +#: lib/interface.php:1322 +msgid "Expand shortcodes in post content:" +msgstr "" + +#: lib/interface.php:1324 +msgid "" +"If checked, Relevanssi will expand shortcodes in post content before " +"indexing. Otherwise shortcodes will be stripped. If you use shortcodes to " +"include dynamic content, Relevanssi will not keep the index updated, the " +"index will reflect the status of the shortcode content at the moment of " +"indexing." msgstr "" -#: relevanssi.php:1554 -msgid "Just pages" +#: lib/interface.php:1330 +msgid "Index and search your posts' authors:" msgstr "" -#: relevanssi.php:1556 +#: lib/interface.php:1332 +msgid "" +"If checked, Relevanssi will also index and search the authors of your posts. " +"Author display name will be indexed. Remember to rebuild the index if you " +"change this option!" +msgstr "" + +#: lib/interface.php:1336 +msgid "Index and search post excerpts:" +msgstr "" + +#: lib/interface.php:1338 +msgid "" +"If checked, Relevanssi will also index and search the excerpts of your posts." +"Remember to rebuild the index if you change this option!" +msgstr "" + +#: lib/interface.php:1342 +msgid "Index and search these comments:" +msgstr "" + +#: lib/interface.php:1344 +msgid "none" +msgstr "" + +#: lib/interface.php:1345 +msgid "normal" +msgstr "" + +#: lib/interface.php:1346 +msgid "all" +msgstr "" + +#: lib/interface.php:1348 +msgid "" +"Relevanssi will index and search ALL (all comments including track- & " +"pingbacks and custom comment types), NONE (no comments) or NORMAL (manually " +"posted comments on your blog).
    Remember to rebuild the index if you " +"change this option!" +msgstr "" + +#: lib/interface.php:1352 msgid "Custom fields to index:" msgstr "" -#: relevanssi.php:1557 -msgid "A comma-separated list of custom field names to include in the index." +#: lib/interface.php:1354 +msgid "" +"A comma-separated list of custom fields to include in the index. Set to " +"'visible' to index all visible custom fields and to 'all' to index all " +"custom fields, also those starting with a '_' character." msgstr "" -#: relevanssi.php:1559 -msgid "Show breakdown of search hits in excerpts:" +#: lib/interface.php:1364 +msgid "Save indexing options, erase index and rebuild the index" msgstr "" -#: relevanssi.php:1560 -msgid "Check this to show more information on where the search hits were made. Requires custom snippets to work." +#: lib/interface.php:1372 +msgid "" +"Add synonyms here in 'key = value' format. When searching with the OR " +"operator, any search of 'key' will be expanded to include 'value' as well. " +"Using phrases is possible. The key-value pairs work in one direction only, " +"but you can of course repeat the same pair reversed." msgstr "" -#: relevanssi.php:1561 -msgid "The breakdown format:" +#: lib/interface.php:1398 +msgid "" +"Enter a word here to add it to the list of stopwords. The word will " +"automatically be removed from the index, so re-indexing is not necessary. " +"You can enter many words at the same time, separate words with commas." msgstr "" -#: relevanssi.php:1562 -msgid "Use %body%, %title%, %tags%, %comments% and %score% to display the number of hits and the document weight." +#: lib/interface.php:1401 +msgid "Stopword(s) to add: " msgstr "" -#: relevanssi.php:1564 -msgid "When to use fuzzy matching?" +#: lib/interface.php:1402 +msgid "Add" msgstr "" -#: relevanssi.php:1565 -msgid "When straight search gets no hits" +#: lib/interface.php:1405 +msgid "" +"Here's a list of stopwords in the database. Click a word to remove it from " +"stopwords. Removing stopwords won't automatically return them to index, so " +"you need to re-index all posts after removing stopwords to get those words " +"back to index." msgstr "" -#: relevanssi.php:1566 -msgid "Always" +#: lib/interface.php:1431 +msgid "Remove all stopwords" msgstr "" -#: relevanssi.php:1567 -msgid "Don't use fuzzy search" +#: lib/interface.php:1437 +msgid "" +"Here's a list of stopwords you can use to export the stopwords to another " +"blog." +msgstr "" + +#: relevanssi.php:327 +msgid "Tag weight:" +msgstr "" + +#: relevanssi.php:342 +msgid "Category weight:" +msgstr "" + +#: relevanssi.php:385 +msgid "" +"Do you want more features? Support Relevanssi development? Get a better " +"search experience for your users?" +msgstr "" + +#: relevanssi.php:388 +msgid "Go Premium!" +msgstr "" + +#: relevanssi.php:389 +#, php-format +msgid "" +"Buy Relevanssi Premium. See feature comparison and license prices." +msgstr "" + +#: relevanssi.php:392 +msgid "Buy Premium now" +msgstr "" + +#: relevanssi.php:394 +#, php-format +msgid "Use the coupon %s to get 20%% off the price (valid through 2017)." +msgstr "" + +#: relevanssi.php:403 +msgid "Some Premium features" +msgstr "" + +#: relevanssi.php:407 +msgid "With Relevanssi Premium, you would have more options:" +msgstr "" + +#: relevanssi.php:409 +msgid "" +"Internal link anchors are search terms for the target posts, if you wish" +msgstr "" + +#: relevanssi.php:410 +msgid "" +"Hiding Relevanssi branding from the User Searches page on a client " +"installation" +msgstr "" + +#: relevanssi.php:411 +msgid "Adjust weights separately for each post type and taxonomy" +msgstr "" + +#: relevanssi.php:412 +msgid "Give extra weight to recent posts" +msgstr "" + +#: relevanssi.php:413 +msgid "" +"Make Relevanssi understand thousand separators to handle big numbers better" msgstr "" -#: relevanssi.php:1568 -msgid "Straight search matches just the term. Fuzzy search matches everything that begins or ends with the search term." +#: relevanssi.php:414 +msgid "Index and search any columns in the wp_posts database" msgstr "" +#: relevanssi.php:415 +msgid "Index and search user profile pages" +msgstr "" + +#: relevanssi.php:416 +msgid "Index and search taxonomy term pages" +msgstr "" + +#: relevanssi.php:417 +msgid "Import and export options" +msgstr "" + +#: relevanssi.php:418 +msgid "WP CLI commands" +msgstr "" + +#: relevanssi.php:419 +msgid "And more!" +msgstr "" + +#: relevanssi.php:430 +msgid "Relevanssi on Facebook" +msgstr "" + +#: relevanssi.php:435 +#, php-format +msgid "" +"Check out the Relevanssi page on Facebook for news and " +"updates about Relevanssi." +msgstr "" + +#: relevanssi.php:444 +msgid "Help and support" +msgstr "" + +#: relevanssi.php:446 +msgid "For Relevanssi support, see:" +msgstr "" + +#: relevanssi.php:447 +msgid "WordPress.org forum" +msgstr "" + +#: relevanssi.php:448 +msgid "Knowledge base" +msgstr "" diff --git a/mu-plugins/relevanssi/stopwords/stopwords.cs_CZ b/mu-plugins/relevanssi/stopwords/stopwords.cs_CZ new file mode 100644 index 00000000..9e8b426a --- /dev/null +++ b/mu-plugins/relevanssi/stopwords/stopwords.cs_CZ @@ -0,0 +1,327 @@ + \ No newline at end of file diff --git a/mu-plugins/relevanssi/stopwords/stopwords.de_DE b/mu-plugins/relevanssi/stopwords/stopwords.de_DE index 8e8bb57b..be4105ea 100644 --- a/mu-plugins/relevanssi/stopwords/stopwords.de_DE +++ b/mu-plugins/relevanssi/stopwords/stopwords.de_DE @@ -1034,4 +1034,4 @@ $stopwords = array( "übrig", "übrigens" ); -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/stopwords/stopwords.en_GB b/mu-plugins/relevanssi/stopwords/stopwords.en_GB index a7cd35ae..0d587791 100644 --- a/mu-plugins/relevanssi/stopwords/stopwords.en_GB +++ b/mu-plugins/relevanssi/stopwords/stopwords.en_GB @@ -22,7 +22,7 @@ $stopwords = array( "amongst", "amoungst", "amount", - "an", +"an", "and", "another", "any", @@ -93,7 +93,7 @@ $stopwords = array( "except", "few", "fifteen", -"fify", +"fifty", "fill", "find", "fire", @@ -320,4 +320,4 @@ $stopwords = array( "yourselves", "the" ); -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/stopwords/stopwords.en_US b/mu-plugins/relevanssi/stopwords/stopwords.en_US index a7cd35ae..0d587791 100644 --- a/mu-plugins/relevanssi/stopwords/stopwords.en_US +++ b/mu-plugins/relevanssi/stopwords/stopwords.en_US @@ -22,7 +22,7 @@ $stopwords = array( "amongst", "amoungst", "amount", - "an", +"an", "and", "another", "any", @@ -93,7 +93,7 @@ $stopwords = array( "except", "few", "fifteen", -"fify", +"fifty", "fill", "find", "fire", @@ -320,4 +320,4 @@ $stopwords = array( "yourselves", "the" ); -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/stopwords/stopwords.fi b/mu-plugins/relevanssi/stopwords/stopwords.fi index 7f84d970..c9e56028 100644 --- a/mu-plugins/relevanssi/stopwords/stopwords.fi +++ b/mu-plugins/relevanssi/stopwords/stopwords.fi @@ -362,4 +362,4 @@ $stopwords = array( "yläs", "yms" ); -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/stopwords/stopwords.fr_FR b/mu-plugins/relevanssi/stopwords/stopwords.fr_FR index bbf42c17..87290ad5 100644 --- a/mu-plugins/relevanssi/stopwords/stopwords.fr_FR +++ b/mu-plugins/relevanssi/stopwords/stopwords.fr_FR @@ -69,4 +69,4 @@ "veux","via","vice-versa","vingt","vingt-cinq","vingt-deux","vingt-huit","vingt-neuf", "vingt-quatre","vingt-sept","vingt-six","vingt-trois","vis-à-vis","vite","vitro","vivo","voici", "voilà","voire","volontiers","vos","votre","vous","-vous","W","X","y","-y","Z","zéro"); -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/stopwords/stopwords.pl_PL b/mu-plugins/relevanssi/stopwords/stopwords.pl_PL index 4da7fa1c..d97004ea 100644 --- a/mu-plugins/relevanssi/stopwords/stopwords.pl_PL +++ b/mu-plugins/relevanssi/stopwords/stopwords.pl_PL @@ -207,4 +207,4 @@ $stopwords = array( "że", "żeby" ); -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/stopwords/stopwords.ru_RU b/mu-plugins/relevanssi/stopwords/stopwords.ru_RU index baff0715..19936ea3 100644 --- a/mu-plugins/relevanssi/stopwords/stopwords.ru_RU +++ b/mu-plugins/relevanssi/stopwords/stopwords.ru_RU @@ -424,4 +424,4 @@ $stopwords = array( "эту", "я" ); -?> +?> \ No newline at end of file diff --git a/mu-plugins/relevanssi/uninstall.php b/mu-plugins/relevanssi/uninstall.php index 42249bbc..57a4eec5 100644 --- a/mu-plugins/relevanssi/uninstall.php +++ b/mu-plugins/relevanssi/uninstall.php @@ -4,7 +4,7 @@ exit(); global $wpdb; -require_once( 'lib/uninstall.php' ); +require_once('lib/uninstall.php'); if (!defined('RELEVANSSI_PREMIUM')) relevanssi_uninstall(); // if Relevanssi Premium is installed, options will not be deleted @@ -24,6 +24,7 @@ function relevanssi_uninstall() { delete_option('relevanssi_excerpt_type'); delete_option('relevanssi_excerpt_allowable_tags'); delete_option('relevanssi_log_queries'); + delete_option('relevanssi_log_queries_with_ip'); delete_option('relevanssi_excat'); delete_option('relevanssi_extag'); delete_option('relevanssi_cat'); @@ -77,4 +78,4 @@ function relevanssi_uninstall() { relevanssi_clear_database_tables(); } -?> +?> \ No newline at end of file